summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/generic/pst-bspline
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2012-03-09 01:21:28 +0000
committerKarl Berry <karl@freefriends.org>2012-03-09 01:21:28 +0000
commit46ee7396c790858808d1c5cb91ea167ecec56008 (patch)
tree496ceb05a6e5edf6b4ee83bcb3ba62a742d8c443 /Master/texmf-dist/tex/generic/pst-bspline
parentdd7800396fbf08c2385608316ffa46f096ae12f6 (diff)
pst-bspline 1.61 (7mar12)
git-svn-id: svn://tug.org/texlive/trunk@25582 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/generic/pst-bspline')
-rw-r--r--Master/texmf-dist/tex/generic/pst-bspline/pst-bspline.tex262
1 files changed, 256 insertions, 6 deletions
diff --git a/Master/texmf-dist/tex/generic/pst-bspline/pst-bspline.tex b/Master/texmf-dist/tex/generic/pst-bspline/pst-bspline.tex
index 38675b96909..6f6c91ae5bd 100644
--- a/Master/texmf-dist/tex/generic/pst-bspline/pst-bspline.tex
+++ b/Master/texmf-dist/tex/generic/pst-bspline/pst-bspline.tex
@@ -8,8 +8,8 @@
\ifx\PSTricksLoaded\endinput \else\input pstricks \fi
\ifx\PSTnodeLoaded\endinput \else\input pst-node \fi
\ifx\PSTXKeyLoaded\endinput \else\input pst-xkey \fi
-\def\fileversion{1.5}
-\def\filedate{2011/08/20}
+\def\fileversion{1.61}
+\def\filedate{2012/03/06}
\message{`pst-bspline' v\fileversion, \filedate\space Bspline routines for pstricks (ms)}
%
@@ -348,7 +348,7 @@
bez@2xT t bez@3xT mul add t mul bez@1x add 2 copy Pyth dup %
3 1 roll div 3 1 roll div \thickness\space 2 div dup 3 1 roll mul 3 1 roll mul ) cvx def %
end grestore }%
-\ifnum\iA=0 \relax%
+\ifnum\iA=\z@ %
\pnode(! /t 0 def FuncN /dy exch def /dx exch def Func 2 copy %
/y0 ED /x0 ED %
clipary 0 x0 dx add put clipary 1 y0 dy add put %
@@ -363,7 +363,7 @@
/lindex lindex 2 add def /uindex uindex 2 sub def ){tmp@P}%
}% end multido \i
}% end multido \iA
-% if periodic, we have to adjust 2 points so as not too leave a wedge in the
+% if periodic, we have to adjust 2 points so as not to leave a wedge in the
% clipping region. We have to set Q_{nk} to Q_0 and R_{nk} to R_0
% R_{nk} is at position 2*nk, 2*nk+1 and Q_{nk} is at the next pair
%\ifbsp@per %
@@ -381,14 +381,14 @@
\code{ clipary aload pop moveto nseg nplotpt mul %
{ lineto } repeat closepath %
moveto nseg nplotpt mul { lineto } repeat closepath }}}%
- #4
+ #4%
\endpsclip%
\else % not periodic
\psclip{\pscustom{%
\code{ clipary aload pop moveto nseg nplotpt mul 2 mul %
1 add { lineto } repeat closepath %
\ifPst@reverseclip\space reversepath \fi}}}%
- #4
+ #4%
\endpsclip%
\fi%
}%
@@ -526,5 +526,255 @@
\pnode(! #1.X \iA\space get #1.Y \iA\space get ){#2\iA}}%
}%
%
+% start experimental variable thickness
+\def\thickBEspline{\def\pst@par{}\pst@object{thickBEspline}}%
+\def\thickBEspline@i#1#2#3#4#5#6{{%
+% #1=root | #2=nsegments | #3=maxthickness | #4=minthickness | #5=axis angle | #6=items to clip
+% An axis angle of -45 means that lines normal to -45 will be minthickness and lines normal to 45 will be maxthickness.
+ \pst@killglue%
+ \use@par%
+ %prepare array
+ \pssetlength{\pst@dimp}{#3}\setlength{\pst@dimp}{0.5\pst@dimp}%
+ \pssetlength{\pst@dimn}{#4}\setlength{\pst@dimn}{0.5\pst@dimn}%
+ \advance\pst@dimp \pst@dimn\setlength{\pst@dimp}{0.5\pst@dimp}%
+ \pst@dimtonum{\pst@dimp}{\ctrthick}% center of thickness/2 in tex pt
+ \advance\pst@dimp -\pst@dimn%
+ \pst@dimtonum{\pst@dimp}{\deltathick}% (max-min)/2 in tex pt
+ \newcount\n@cnt%
+ \newcount\np@cnt%
+ \newcount\ary@max \ary@max=\psk@plotpoints \relax%
+ \multiply\ary@max #2\np@cnt=\ary@max \multiply\ary@max 4\relax%
+ \advance\ary@max 4\relax %
+ \n@cnt=\ary@max \advance\n@cnt \m@ne%
+ \multiply\np@cnt \tw@\advance\np@cnt \tw@% count of points in array
+ \pstVerb{ gsave tx@Dict begin %
+ /psxu \pst@number\psxunit\space def /psyu \pst@number\psyunit\space def %
+ /uratio psyu psxu div dup mul def % so that perp to a, b is -b*uratio, a
+ /nseg #2 def /nplotpt \psk@plotpoints\space def %
+ /clipary #2 nplotpt mul 4 mul 4 add array def %
+ /lindex 2 def /uindex \the\ary@max\space 1 sub def %
+ /dt 1 \psk@plotpoints\space div def %
+ end grestore }%
+\multido{\iA=0+1,\iB=1+1}{#2}{%
+% pass control points of this segment to PostScript variables
+\pstVerb{%
+ gsave tx@Dict begin %
+ STV CP T \psGetNodeCenter{#1\iA}\space \psGetNodeCenter{#1BR\iA}\space \psGetNodeCenter{#1BL\iB}\space \psGetNodeCenter{#1\iB}\space %
+ /bez@1.x #1\iA.x def /bez@1.y #1\iA.y def %initial point on segment
+ /bez@2.x #1BR\iA.x bez@1.x sub def %adjusted control points (less init pt)
+ /bez@2.y #1BR\iA.y bez@1.y sub def %
+ /bez@3.x #1BL\iB.x bez@1.x sub def %
+ /bez@3.y #1BL\iB.y bez@1.y sub def %
+ /bez@4.x #1\iB.x bez@1.x sub def %
+ /bez@4.y #1\iB.y bez@1.y sub def %
+ /bez@1x bez@2.x 3 mul def % for position--w1=3z1
+ /bez@1y bez@2.y 3 mul def %
+ /bez@2x bez@3.x bez@2.x 2 mul sub 3 mul def %position w2=3(z2-2z1)
+ /bez@2y bez@3.y bez@2.y 2 mul sub 3 mul def %
+ /bez@2xT bez@2x 2 mul def % for tangent
+ /bez@2yT bez@2y 2 mul def %
+ /bez@3x bez@4.x bez@2.x bez@3.x sub 3 mul add def % w3=z3+3z1-3z2
+ /bez@3y bez@4.y bez@2.y bez@3.y sub 3 mul add def %
+ /bez@3xT bez@3x 3 mul def % tangent
+ /bez@3yT bez@3y 3 mul def %
+ /Func % position
+ ( bez@3x t mul bez@2x add t mul bez@1x add t mul bez@1.x add psxu mul %
+ bez@3y t mul bez@2y add t mul bez@1y add t mul bez@1.y add psyu mul ) cvx def %
+% /FuncT % tangent
+% ( bez@2xT t bez@3xT mul add t mul bez@1x add %
+% bez@2yT t bez@3yT mul add t mul bez@1y add ) cvx def
+/FuncN % unit normal times delta
+ ( bez@2yT t bez@3yT mul add t mul bez@1y add uratio mul neg
+ bez@2xT t bez@3xT mul add t mul bez@1x add 2 copy Pyth dup %
+ 3 1 roll div 3 1 roll div 2 copy Atan #5 sub 2 mul cos \deltathick\space mul neg \ctrthick\space add dup 3 1 roll mul 3 1 roll mul ) cvx def %
+ end grestore }%
+\ifnum\iA=\z@%
+ \pnode(! /t 0 def FuncN /dy exch def /dx exch def Func 2 copy %
+ /y0 ED /x0 ED %
+ clipary 0 x0 dx add put clipary 1 y0 dy add put %
+ clipary uindex y0 dy sub put clipary uindex 1 sub x0 dx sub put %
+ /uindex uindex 2 sub def ){tmp@P}%
+\fi%
+\multido{\i=1+1}{\psk@plotpoints}{%
+ %make array elements for this segment
+ \pnode(! /t dt \i\space mul def FuncN /dy ED /dx ED Func 2 copy /y0 ED /x0 ED %
+ clipary lindex x0 dx add put clipary lindex 1 add y0 dy add put %
+ clipary uindex y0 dy sub put clipary uindex 1 sub x0 dx sub put %
+ /lindex lindex 2 add def /uindex uindex 2 sub def ){tmp@P}%
+}% end multido \i
+}% end multido \iA
+% if periodic, we have to adjust 2 points so as not to leave a wedge in the
+% clipping region. We have to set Q_{nk} to Q_0 and R_{nk} to R_0
+% R_{nk} is at position 2*nk, 2*nk+1 and Q_{nk} is at the next pair
+%\ifbsp@per %
+% \pstVerb{%
+% tx@Dict begin /itemcnt #2 nplotpt mul 2 mul def %first item to change is index 2nk
+% clipary itemcnt clipary 0 get put /itemcnt itemcnt 1 add def %
+% clipary itemcnt clipary 1 get put /itemcnt itemcnt 1 add def %
+% clipary itemcnt clipary \the\n@cnt\space 1 sub get put /itemcnt itemcnt 1 add def %
+% clipary itemcnt clipary \the\n@cnt\space get put %
+% end }%
+%\fi%
+% make a clipping path in PS and pass commands #6
+\ifbsp@per %periodic
+ \psclip{\pscustom{%
+ \code{ clipary aload pop moveto nseg nplotpt mul %
+ { lineto } repeat closepath %
+ moveto nseg nplotpt mul { lineto } repeat closepath }}}%
+ #6%
+ \endpsclip%
+\else % not periodic
+ \psclip{\pscustom{%
+ \code{ clipary aload pop moveto nseg nplotpt mul 2 mul %
+ 1 add { lineto } repeat closepath %
+ \ifPst@reverseclip\space reversepath \fi}}}%
+ #6%
+ \endpsclip%
+\fi%
+}%
+\ignorespaces}%
+%
+\def\thickBdraw#1#2#3#4#5{\edef\n@decnt{\csname #1nodecount\endcsname}%
+\psBsplineInterp{#1}{\n@decnt}%
+\psBsplineNodes[linestyle=none,showpoints=false]{#1B}{\n@decnt}%
+\thickBEspline{#1}{\n@decnt}{#2}{#3}{#4}{#5}%
+}%
+
+% Elliptic pen as possible in metafont/metapost
+\def\thickBsplinePen{\def\pst@par{}\pst@object{thickBsplinePen}}%
+\def\thickBsplinePen@i#1#2#3#4#5#6{%
+% #1=root | #2=nsegments | #3=semimajor | #4=semiminor | #5=inclination | #6=items to clip
+% An inclination of -45 means that lines pointing at angles -45 and 135 thinnest and lines pointing 45 and 225 will be thickest, assuming #3>#4.
+ \pst@killglue%
+ \psBsplineInterp{#1}{#2}%
+ \psBsplineNodes[linestyle=none]{#1B}{#2}%
+ \thickBsplinePen@ii{#1}{#2}{#3}{#4}{#5}{#6}%
+}%
+\def\thickBsplinePen@ii#1#2#3#4#5#6{{%
+ \pst@killglue%
+ \use@par%
+ \ifdim\psxunit=\psyunit \else \errmessage{Unequal units--must bail out from thickBsplinePen}\fi%
+ %prepare array
+ \pssetlength{\pst@dimp}{#3}\pst@dimtonum{\pst@dimp}{\bez@a}%
+ \pssetlength{\pst@dimn}{#4}\pst@dimtonum{\pst@dimn}{\bez@b}%
+ \newcount\n@cnt%
+ \newcount\np@cnt%
+ \newcount\ary@max \ary@max=\psk@plotpoints \relax%
+ \multiply\ary@max #2\np@cnt=\ary@max \multiply\ary@max 4\relax%
+ \advance\ary@max 4\relax %
+ \n@cnt=\ary@max \advance\n@cnt \m@ne%
+ \multiply\np@cnt \tw@\advance\np@cnt \tw@% count of points in array
+ \pstVerb{ gsave tx@Dict begin %
+ /psxu \pst@number\psxunit\space def /psyu \pst@number\psyunit\space def %
+ /uratio psyu psxu div dup mul def % so that perp to a, b is -b*uratio, a
+ /nseg #2 def /nplotpt \psk@plotpoints\space def %
+ /clipary #2 nplotpt mul 4 mul 4 add array def %
+ /lindex 2 def /uindex \the\ary@max\space 1 sub def %
+ /dt 1 \psk@plotpoints\space div def %
+ end grestore }%
+\multido{\iA=0+1,\iB=1+1}{#2}{%
+% pass control points of this segment to PostScript variables
+\pstVerb{%
+ gsave tx@Dict begin %
+ STV CP T \psGetNodeCenter{#1\iA}\space \psGetNodeCenter{#1BR\iA}\space \psGetNodeCenter{#1BL\iB}\space \psGetNodeCenter{#1\iB}\space %
+ /bez@1.x #1\iA.x def /bez@1.y #1\iA.y def %initial point on segment
+ /bez@2.x #1BR\iA.x bez@1.x sub def %adjusted control points (less init pt)
+ /bez@2.y #1BR\iA.y bez@1.y sub def %
+ /bez@3.x #1BL\iB.x bez@1.x sub def %
+ /bez@3.y #1BL\iB.y bez@1.y sub def %
+ /bez@4.x #1\iB.x bez@1.x sub def %
+ /bez@4.y #1\iB.y bez@1.y sub def %
+ /bez@1x bez@2.x 3 mul def % for position--w1=3z1
+ /bez@1y bez@2.y 3 mul def %
+ /bez@2x bez@3.x bez@2.x 2 mul sub 3 mul def %position w2=3(z2-2z1)
+ /bez@2y bez@3.y bez@2.y 2 mul sub 3 mul def %
+ /bez@2xT bez@2x 2 mul def % for tangent
+ /bez@2yT bez@2y 2 mul def %
+ /bez@3x bez@4.x bez@2.x bez@3.x sub 3 mul add def % w3=z3+3z1-3z2
+ /bez@3y bez@4.y bez@2.y bez@3.y sub 3 mul add def %
+ /bez@3xT bez@3x 3 mul def % tangent
+ /bez@3yT bez@3y 3 mul def %
+ /Func % position
+ ( bez@3x t mul bez@2x add t mul bez@1x add t mul bez@1.x add psxu mul %
+ bez@3y t mul bez@2y add t mul bez@1y add t mul bez@1.y add psyu mul ) cvx def %
+% /FuncT % tangent
+% ( bez@2xT t bez@3xT mul add t mul bez@1x add %
+% bez@2yT t bez@3yT mul add t mul bez@1y add ) cvx def
+/FuncN % leave dx, dy on stack
+ ( bez@2yT t bez@3yT mul add t mul bez@1y add dup /ty ED uratio mul neg
+ bez@2xT t bez@3xT mul add t mul bez@1x add dup /tx ED %
+ 2 copy Pyth dup 3 1 roll div 3 1 roll div /nx ED /ny ED % unit normal to curve
+ tx ty 2 copy Pyth dup 3 1 roll div 3 1 roll div /tx ED /ty ED % unit tangent
+ #5 ty tx Atan sub dup cos /bez@c ED sin /bez@s ED %
+ \bez@a\space bez@s mul \bez@b\space bez@c mul Pyth % sqrt(aa*ss+bb*cc)
+ dup .001 lt { pop \bez@a\space tx mul \bez@a\space ty mul }{/yval ED %
+ bez@c bez@s mul \bez@a\space dup mul \bez@b\space dup mul sub mul yval div %
+ /xval ED %
+ xval tx mul yval nx mul add xval ty mul yval ny mul add } %
+ ifelse ) cvx def %
+ end grestore }%
+\ifnum\iA=\z@%
+ \pnode(! /t 0 def FuncN /dy exch def /dx exch def Func 2 copy %
+ /y0 ED /x0 ED %
+ clipary 0 x0 dx add put clipary 1 y0 dy add put %
+ clipary uindex y0 dy sub put clipary uindex 1 sub x0 dx sub put %
+ /uindex uindex 2 sub def ){tmp@P}%
+\fi%
+\multido{\i=1+1}{\psk@plotpoints}{%
+ %make array elements for this segment
+ \pnode(! /t dt \i\space mul def FuncN /dy ED /dx ED Func 2 copy /y0 ED /x0 ED %
+ clipary lindex x0 dx add put clipary lindex 1 add y0 dy add put %
+ clipary uindex y0 dy sub put clipary uindex 1 sub x0 dx sub put %
+ /lindex lindex 2 add def /uindex uindex 2 sub def ){tmp@P}%
+}% end multido \i
+}% end multido \iA
+% if periodic, we have to adjust 2 points so as not to leave a wedge in the
+% clipping region. We have to set Q_{nk} to Q_0 and R_{nk} to R_0
+% R_{nk} is at position 2*nk, 2*nk+1 and Q_{nk} is at the next pair
+%\ifbsp@per %
+% \pstVerb{%
+% tx@Dict begin /itemcnt #2 nplotpt mul 2 mul def %first item to change is index 2nk
+% clipary itemcnt clipary 0 get put /itemcnt itemcnt 1 add def %
+% clipary itemcnt clipary 1 get put /itemcnt itemcnt 1 add def %
+% clipary itemcnt clipary \the\n@cnt\space 1 sub get put /itemcnt itemcnt 1 add def %
+% clipary itemcnt clipary \the\n@cnt\space get put %
+% end }%
+%\fi%
+% make a clipping path in PS and pass commands #6
+\ifbsp@per %periodic
+ \psclip{\pscustom{%
+ \code{ clipary aload pop moveto nseg nplotpt mul %
+ { lineto } repeat closepath %
+ moveto nseg nplotpt mul { lineto } repeat closepath }}}%
+ #6%
+ \endpsclip%
+\else % not periodic
+ \psclip{\pscustom{%
+ \code{ clipary aload pop moveto nseg nplotpt mul 2 mul %
+ 1 add { lineto } repeat closepath %
+ \ifPst@reverseclip\space reversepath \fi}}}%
+ #6%
+ \endpsclip%
+\fi%
+}%
+\ignorespaces}%
+%
+% Elliptic pen as possible in metafont/metapost, ignoring end segs
+\def\thickBsplinePenE{\def\pst@par{}\pst@object{thickBsplinePenE}}%
+\def\thickBsplinePenE@i#1#2#3#4#5#6{{%
+% #1=root | #2=nsegments | #3=semimajor | #4=semiminor | #5=inclination | #6=items to clip
+% An inclination of -45 means that lines pointing at angles -45 and 135 thinnest and lines pointing 45 and 225 will be thickest, assuming #3>#4.
+ \pst@killglue%
+ \edef\n@decnt{\csname #1nodecount\endcsname}
+ \psBsplineInterp{#1}{\n@decnt}%
+ \psBsplineNodesE[linestyle=none]{#1B}{\n@decnt}%
+ \count0=\n@decnt\advance\count0\m@ne\edef\n@decntm{\the\count0}%
+ \advance\count0\m@ne\edef\newn@decnt{\the\count0}%
+ \multido{\iA=0+1,\iB=1+1}{\n@decntm}{\pnode(#1\iB){@#1\iA}%
+ \pnode(#1B\iB){@#1B\iA}\pnode(#1BR\iB){@#1BR\iA}\pnode(#1BL\iB){@#1BL\iA}}%
+ \use@par%
+ \thickBsplinePen@ii{@#1}{\newn@decnt}{#3}{#4}{#5}{#6}%
+}\ignorespaces}%
+%
\catcode`\@=\TheAtCode\relax
\endinput \ No newline at end of file