summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2010-10-15 23:09:30 +0000
committerKarl Berry <karl@freefriends.org>2010-10-15 23:09:30 +0000
commit19b68112afa7a9fefc611f2e796e82a3884d0e08 (patch)
tree569ff823f08987a1733ee6de9d4507b15599632d /Master/texmf-dist/tex
parent1df1829282a57c887b9dc8ceefc83905a3359252 (diff)
pst-bspline (15oct10)
git-svn-id: svn://tug.org/texlive/trunk@20115 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex')
-rw-r--r--Master/texmf-dist/tex/generic/pst-bspline/pst-bspline.tex109
-rw-r--r--Master/texmf-dist/tex/latex/pst-bspline/pst-bspline.sty16
2 files changed, 105 insertions, 20 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 ded6c31d4f4..b5a0b11b139 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.tex\fi
\ifx\PSTnodeLoaded\endinput \else\input pst-node.tex\fi
\ifx\PSTXKeyLoaded\endinput \else\input pst-xkey \fi
-\def\fileversion{1.3}
-\def\filedate{2010/09/04}
+\def\fileversion{1.4}
+\def\filedate{2010/10/14}
\message{`pst-bspline' v\fileversion, \filedate\space Bspline routines for pstricks (ms)}
%
@@ -40,6 +40,8 @@
% showframe key and its default are global
\define@boolkey[psset]{pst-bspline}[Pst@]{showframe}[true]{}
\psset[pst-bspline]{showframe=false}%
+\define@boolkey[psset]{pst-bspline}[Pst@]{reverseclip}[true]{}
+\psset[pst-bspline]{reverseclip=false}%
%
%Bspline drawing macros
\def\psBsplineNodes{\def\pst@par{}\pst@object{psBsplineNodes}}%
@@ -212,16 +214,21 @@
\def\noderoot{#1}%
\pnode(\noderoot 0){\noderoot B0}%
\pnode(\noderoot #2){\noderoot B#2}%
-\psLCNode(\noderoot 1){6}(\noderoot 0){-1}{\noderoot B1}% 6*S1-S0->SB1
-\multido{\iA=2+1,\iAA=1+1}{\top@mone}{\psLCNodeVar(\noderoot\iA)(\noderoot B\iAA)(! 6 mcoeff \iAA\space get neg ){\noderoot B\iA}}%2 to n-2, 6*S_k-m_{k-1}*SB_{k-1}->SB_k
-\psLCNodeVar(\noderoot \the\top@ndx)(\noderoot #2)(! mcoeff \the\top@ndx\space get dup 6 mul exch neg ){tmp@node}%m_{99}*(6*S99-S100)->tmp@node
-\psLCNodeVar(tmp@node)(\noderoot B\the\top@mone)(! 1 mcoeff \the\top@ndx\space get mcoeff \the\top@mone\space get mul neg ){\noderoot B\the\top@ndx}% temp@node -m_{98}*m_{99}*SB98->SB99
-\multido{\iA=\the\top@mone+-1,\iAA=\the\top@ndx+-1}{\the\top@mone}{\psLCNodeVar(\noderoot B\iA)(\noderoot B\iAA)(! mcoeff \iA\space get dup neg ){\noderoot B\iA}% m_k*SB_k-m_k*SB_{k+1}->SB_k, k=98 downto 1
-}% end multido
+\ifnum\top@mone>\m@ne% at least 3 points to interpolate
+ \ifnum\top@mone>\z@% we started with 4 or more points to interpolate
+ \psLCNode(\noderoot 1){6}(\noderoot 0){-1}{\noderoot B1}% 6*S1-S0->SB1
+ \multido{\iA=2+1,\iAA=1+1}{\top@mone}{\psLCNodeVar(\noderoot\iA)(\noderoot B\iAA)(! 6 mcoeff \iAA\space get neg ){\noderoot B\iA}}%2 to n-2, 6*S_k-m_{k-1}*SB_{k-1}->SB_k
+ \psLCNodeVar(\noderoot \the\top@ndx)(\noderoot #2)(! mcoeff \the\top@ndx\space get dup 6 mul exch neg ){tmp@node}%m_{99}*(6*S99-S100)->tmp@node
+ \psLCNodeVar(tmp@node)(\noderoot B\the\top@mone)(! 1 mcoeff \the\top@ndx\space get mcoeff \the\top@mone\space get mul neg ){\noderoot B\the\top@ndx}% temp@node -m_{98}*m_{99}*SB98->SB99
+ \multido{\iA=\the\top@mone+-1,\iAA=\the\top@ndx+-1}{\the\top@mone}{\psLCNodeVar(\noderoot B\iA)(\noderoot B\iAA)(! mcoeff \iA\space get dup neg ){\noderoot B\iA}% m_k*SB_k-m_k*SB_{k+1}->SB_k, k=98 downto 1
+ }% end multido
+ \else% exactly 3 points to interpolate
+ \nodexn{1.5(\noderoot1)-.25(\noderoot0)-.25(\noderoot2)}{\noderoot B1}%
+\fi\fi%
}% end def
\def\psBsplineInterpC#1#2{%
% #1=node name root, #2=top index,
- % eg, if we want to interpolate S0,..., S100, #1=100, #2=S
+ % eg, if we want to interpolate S0,..., S100, #1=S, #2=100
% interpolation in this case is periodic (closed curve)
\pst@killglue
\newcount\top@mone \top@mone=#2\relax%
@@ -269,5 +276,89 @@ ycoeff \iA\space ycoeff \iA\space get mcoeff \iA\space get ycoeff \iB\space get
{\noderoot B\iA}}%
\pnode(\noderoot B\the\top@ndx){\noderoot B0}%
\ignorespaces}%
+%
+\def\thickBspline{\def\pst@par{}\pst@object{thickBspline}}%
+\def\thickBspline@i#1#2#3#4{{%
+% #1=root | #2=nsegments | #3=thickness | #4=items to clip
+ \pst@killglue%
+ \use@par%
+ %prepare array
+ \pssetlength{\pst@dimp}{#3}\pst@dimtonum{\pst@dimp}{\thickness}% thickness 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 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 %
+% /halfthck #3 2 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
+ %(START) = bez@1.x = bez@1.y = SB1.x = %
+ /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@1x t bez@2xT mul add t t bez@3xT mul mul add %
+% bez@1y t bez@2yT mul add t t bez@3yT mul mul 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 \thickness\space 2 div dup 3 1 roll mul 3 1 roll mul ) cvx def %
+ end grestore }%
+\ifnum\iA=0 \relax%
+ \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 using #3
+ \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
+% make a clipping path in PS and pass commands #4
+\psclip{\pscustom{%
+ \code{ clipary aload pop moveto nseg nplotpt mul 2 mul %
+ 1 add { lineto } repeat closepath %
+ \ifPst@reverseclip\space reversepath \fi}}}%
+ #4
+\endpsclip%
+\pstVerb{%
+tx@Dict begin %
+}}%
+\ignorespaces}%
\catcode`\@=\TheAtCode\relax
\endinput \ No newline at end of file
diff --git a/Master/texmf-dist/tex/latex/pst-bspline/pst-bspline.sty b/Master/texmf-dist/tex/latex/pst-bspline/pst-bspline.sty
index 58c9eca005b..6500f4dbefb 100644
--- a/Master/texmf-dist/tex/latex/pst-bspline/pst-bspline.sty
+++ b/Master/texmf-dist/tex/latex/pst-bspline/pst-bspline.sty
@@ -1,11 +1,5 @@
-\RequirePackage{pstricks}
-\ProvidesPackage{pst-bspline}[2007/12/23 package wrapper for
- pst-bspline.tex (hv)]
-\input{pst-bspline.tex}
-%\IfFileExists{pst-bspline.pro}{%
-% \ProvidesFile{pst-bspline.pro}
-% [2007/03/23 v. 0.01, PostScript prologue file (hv)]
-% \@addtofilelist{pst-bspline.pro}}{}%
-\ProvidesFile{pst-bspline.tex}
- [\filedate\space v\fileversion\space `pst-bspline' (ms)]
-\endinput
+\ProvidesPackage{pst-bspline}
+
+\input{pst-bspline}
+
+\endinput \ No newline at end of file