summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/generic/pst-bspline
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2011-08-01 00:48:08 +0000
committerKarl Berry <karl@freefriends.org>2011-08-01 00:48:08 +0000
commit2dd820f377c1dccbc53a6d34d604b7b4a5ed317c (patch)
tree9c266429eea522ff80928adc70be7abec8277c0c /Master/texmf-dist/tex/generic/pst-bspline
parent07db9a5835ec1aaa508040c50590c2d0f8c70d84 (diff)
pst-bspline (31jul11)
git-svn-id: svn://tug.org/texlive/trunk@23294 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.tex163
1 files changed, 148 insertions, 15 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 eaea89f9b77..a16112455a1 100644
--- a/Master/texmf-dist/tex/generic/pst-bspline/pst-bspline.tex
+++ b/Master/texmf-dist/tex/generic/pst-bspline/pst-bspline.tex
@@ -8,13 +8,15 @@
\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.41}
-\def\filedate{2010/10/19}
+\def\fileversion{1.44}
+\def\filedate{2011/07/29}
\message{`pst-bspline' v\fileversion, \filedate\space Bspline routines for pstricks (ms)}
%
\edef\TheAtCode{\the\catcode`\@} \catcode`\@=11\relax
\pst@addfams{pst-bspline}
+\pstheader{pst-bspline.pro}
+
\SpecialCoor
%\newcount\pst@args%used in several macros--now defined in pst-node.tex
@@ -152,12 +154,12 @@
\advance\bsp@cntB by \@ne%
\psbezier[arrows=-\bsp@arrowB,showpoints=false](\bsp@root S\the\bsp@cntA)%
(\bsp@root R\the\bsp@cntA)(\bsp@root L\the\bsp@cntB)(\bsp@root S\the\bsp@cntB)%
- \ifPst@showframe \psdot[linecolor=red](\bsp@root L\the\bsp@cntB) \fi%
+% \ifPst@showframe \psdot[linecolor=red](\bsp@root L\the\bsp@cntB) \fi%
\fi% end \ifbsp@closed
-\ifPst@showframe%
- \psdot[linecolor=red](\bsp@root R0)%
- \psdot[linecolor=red](\bsp@root L\the\bsp@args)%
-\fi%
+%\ifPst@showframe%
+% \psdot[linecolor=red](\bsp@root R0)%
+% \psdot[linecolor=red](\bsp@root L\the\bsp@args)%
+%\fi%
\ifshowpoints%
\multido{\i=0+1}{\bsp@args}{\psdot(\bsp@root S\i)}%
\fi%
@@ -247,7 +249,7 @@
\fi%
\newcount\top@ndx \top@ndx=\top@mone%
\advance\top@ndx by \@ne%number of nodes to interpolate
-\
+%\
\newcount\top@mtwo \top@mtwo=\top@mone \advance\top@mtwo\m@ne%
% After copying S0 to S101, \top@ndx, \top@mone, \top@mtwo are top index, top index-1, top index-two---101, 100, 99 in the example
\make@mcoeff{\the\top@ndx}%
@@ -307,12 +309,11 @@
\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
+ /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 %
-% /halfthck #3 2 div def %
end grestore }%
\multido{\iA=0+1,\iB=1+1}{#2}{%
% pass control points of this segment to PostScript variables
@@ -320,7 +321,6 @@
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 %
@@ -340,9 +340,9 @@
/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
+% /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 %
@@ -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 wege in the
+% if periodic, we have to adjust 2 points so as not too 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 %
@@ -393,5 +393,138 @@
\fi%
}%
\ignorespaces}%
+%
+\def\bsp@setup#1#2#3#4{%
+%#1=bsp root, #2=num #3=\top@ndx, #4=top@ndx-1, #4
+ \pstVerb{tx@Dict begin gsave STV CP T /bsp@desc #2 array def }%
+% \def\num{#2}
+ \multido{\iA=#4+-1,\iB=#3+-1}{#2}{%\show\num
+ \pstVerb{%
+ \psGetNodeCenter{#1S\iA}\space \psGetNodeCenter{#1R\iA}\space \psGetNodeCenter{#1L\iB}\space \psGetNodeCenter{#1S\iB}\space %
+ /bez@0x #1S\iA.x def /bez@0y #1S\iA.y def %initial point on segment
+ /bez@1x #1R\iA.x bez@0x sub 3 mul def % for position--w1=3z1
+ /bez@1y #1R\iA.y bez@0y sub 3 mul def
+ /bez@2x #1L\iB.x bez@0x sub #1R\iA.x bez@0x sub 2 mul sub 3 mul def % w2=3(z2-2z1)
+ /bez@2y #1L\iB.y bez@0y sub #1R\iA.y bez@0y sub 2 mul sub 3 mul def % w2=3(z2-2z1)
+ /bez@3x #1S\iB.x bez@1x add #1L\iB.x 3 mul sub bez@0x 2 mul add def % w3=z3+3z1-3z2
+ /bez@3y #1S\iB.y bez@1y add #1L\iB.y 3 mul sub bez@0y 2 mul add def % w3=z3+3z1-3z2
+ bsp@desc \iA\space mark bez@2y 2 mul bez@3y 3 mul bez@2x 2 mul bez@3x 3 mul bez@0y %
+ bez@1y bez@2y bez@3y bez@0x bez@1x bez@2x bez@3x ] put }%
+ }% end multido
+ \pstVerb{ grestore end }% closed tx@Dict, which contains array named bsp@desc
+}% bsp@setup
+\def\bspcurvepointsE{\pst@object{bspcurvepointsE}}%
+\def\bspcurvepointsE@i#1#2#3{\bspcurvepoints@ii{#1}{#2}{E}{#3}}%
+\def\bspcurvepoints{\pst@object{bspcurvepoints}}%
+\def\bspcurvepoints@i#1#2#3{\bspcurvepoints@ii{#1}{#2}{}{#3}}%
+\def\bspcurvepoints@ii#1#2#3#4{{%optional [plotpoints=xx]
+% #1=bsp root,#2=maxindex,#3=E/{},#4=root name for new PS arrays,
+ \pst@killglue%
+ \newcount\bsp@numndx
+ \bsp@numndx=#2 \relax%
+ \ifx#3E\relax
+ \advance \bsp@numndx \m@ne \edef\top@ndx{\the\bsp@numndx}
+ \advance \bsp@numndx \m@ne \edef\topm@ndx{\the\bsp@numndx}%
+ \else%
+ \edef\top@ndx{\the\bsp@numndx}%
+ \pst@cntc=\bsp@numndx\advance\pst@cntc \m@ne%
+ \edef\topm@ndx{\the\pst@cntc}%
+ \fi%
+ \pst@cntb=\bsp@numndx %\advance\pst@cntb \@ne\relax%
+ % set up the bsp ps array
+ \edef\cmd{\noexpand\bsp@setup{#1}{\the\bsp@numndx}{\top@ndx}{\topm@ndx}}\cmd%
+ \use@par%
+ \pst@cntc=\psk@plotpoints\relax%\psk@plotpoints=plotpoints-1
+ \pst@cnta=\pst@cntc \multiply\pst@cnta by \pst@cntb%
+ \edef\bsp@nsegs{\the\bsp@numndx}%\show\bsp@nsegs%
+ \advance\pst@cnta by \@ne\relax%=(plotpoints-1)*nsegs+1
+ \edef\@arraysize{\the\pst@cnta}%
+% \show\@arraysize
+ \pstVerb{ tx@Dict begin %
+ /psxu \pst@number\psxunit\space def /psyu \pst@number\psyunit\space def %
+ /unitratio \pst@number\psyunit \pst@number\psxunit div def %
+ /unitratiosq unitratio dup mul def %
+ /dt 1 \psk@plotpoints\space div def %
+ /#4.X \@arraysize\space array def %
+ /#4.Y \@arraysize\space array def %
+ /#4Delta.X \@arraysize\space array def %
+ /#4Delta.Y \@arraysize\space array def %
+ /#4Normal.X \@arraysize\space array def %
+ /#4Normal.Y \@arraysize\space array def %
+ /theseg 0 def %\the\bsp@numndx\space 1 sub def %
+ bsp@desc theseg get % the first segment
+ /cnt 1 def % counter for arrays
+ dup dup dup 8 get psxu mul 4 1 roll 4 get psyu mul 3 1 roll %
+ 9 get exch 5 get %4 copy = = = = % initial x, y, x', y'
+ unitratiosq mul neg #4Normal.X 0 3 -1 roll put #4Normal.Y 0 3 -1 roll put %
+ 2 copy #4.Y 0 3 -1 roll put #4.X 0 3 -1 roll put %
+ /priory ED /priorx ED % arrays now initialized
+ \bsp@nsegs\space {% repeat nsegs times
+ bsp@desc theseg get aload pop /x3 ED /x2 ED /x1 ED /x0 ED %
+ /y3 ED /y2 ED /y1 ED /y0 ED %
+ /xT3 ED /xT2 ED /yT3 ED /yT2 ED %
+ /Func ( x3 t mul x2 add t mul x1 add t mul x0 add psxu mul %
+ y3 t mul y2 add t mul y1 add t mul y0 add psyu mul ) cvx def %
+ /FuncN ( yT2 t yT3 mul add t mul y1 add unitratiosq mul neg %
+ xT2 t xT3 mul add t mul x1 add ) cvx def %
+ /theseg theseg 1 add def %
+ /j 1 def \psk@plotpoints\space {% repeat for each plotpt
+ /t j dt mul def Func 2 copy 2 copy FuncN % x y x y x y xN yN
+ #4Normal.Y cnt 3 -1 roll put %
+ #4Normal.X cnt 3 -1 roll put %
+ #4.Y cnt 3 -1 roll put %
+ #4.X cnt 3 -1 roll put % x y x y on stack
+ priory sub #4Delta.Y cnt 3 -1 roll put %
+ priorx sub #4Delta.X cnt 3 -1 roll put % x y on stack
+ /priory ED /priorx ED /j j 1 add def /cnt cnt 1 add def } repeat %
+ } repeat %#4.Y == %
+ end }% end pstVerb
+ \pst@cnta=\@arraysize \relax\advance\pst@cnta \m@ne %
+ \expandafter\xdef \csname #4pointcount\endcsname {\the\pst@cnta}%
+ \typeout{Created points #40 .. #4\the\pst@cnta}%
+}\ignorespaces}%
+\def\bspFnNode#1#2#3#4{%
+% #1=root name for B-spline control points, #2=top index
+% #3=x value, #4=name of node to place at (x,f(x))
+% This works only for a bspline function graph, not a general bspline curve
+\pnode(! bsp@desc length /n ED %
+ /x #3 def %
+ x bsp@desc 0 get 8 get dup /xt ED lt { /x xt def } if %
+ x bsp@desc n 1 sub get 8 4 getinterval aload pop add add add %endpt of last segment
+ dup /xt ED gt { /x xt def } if %
+ /j 0 def %
+ n {% repeat
+ x bsp@desc j get 8 get dup /xt ED le { exit } if /j j 1 add def %
+ } repeat %
+ j 0 gt { /j j 1 sub def } if %j is index of bezier segment containing x
+ bsp@desc j get dup dup dup %
+ 11 get exch 10 get 4 2 roll 9 get exch 8 get x sub cubic_roots %
+ /t ED pop pop %
+ t 1 gt { /t 1 def } if % zroot is the t value at which x=x(t)
+ x bsp@desc j get 4 4 getinterval aload pop % leaves y0, y1, y2, y3 on stack
+ t mul add t mul add t mul add % x y now on stack
+ ){#4}%
+}% end bspFnNode
+%
+\def\bspNode#1#2#3#4{%
+%src maxindex t target
+\pnode(! bsp@desc length /n ED %
+ /t #3 def %
+ t 0 lt { /t 0 def } if %
+ t n gt { /t n def } if % clamp t to [0,n]
+ /j t cvi def j n eq { /j n 1 sub def } if %
+ /t t j sub def % t in [0,1]
+ bsp@desc j get dup %
+ 8 4 getinterval aload pop t mul add t mul add t mul add % desc[[j]] x(t)
+ exch 4 4 getinterval aload pop t mul add t mul add t mul add % x(t) y(t)
+ ){#4}%
+}% end bspNode
+%
+\def\bspcurvenodes#1#2{%
+%#1= basename for points on curve, #2=basename for nodes
+\multido{\iA=0+1}{\csname #1pointcount\endcsname}{%
+\pnode(! #1.X \iA\space get #1.Y \iA\space get ){#2\iA}}%
+}%
+%
\catcode`\@=\TheAtCode\relax
\endinput \ No newline at end of file