summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2010-10-24 23:37:47 +0000
committerKarl Berry <karl@freefriends.org>2010-10-24 23:37:47 +0000
commit9e2770a473f440628f782f2af002bb98475d61e1 (patch)
treeea0060b8713a317e345ea6fbaeed202dc366a744
parented591f3387c5ae42c8da11c3fca9ecc305b9ff3c (diff)
pst-bspline (19oct10)
git-svn-id: svn://tug.org/texlive/trunk@20173 c570f23f-e606-0410-a88d-b1316a301751
-rw-r--r--Master/texmf-dist/doc/generic/pst-bspline/README4
-rw-r--r--Master/texmf-dist/doc/generic/pst-bspline/pst-bspline-doc.pdfbin101556 -> 111493 bytes
-rw-r--r--Master/texmf-dist/doc/generic/pst-bspline/pst-bspline-doc.tex52
-rw-r--r--Master/texmf-dist/tex/generic/pst-bspline/pst-bspline.tex103
-rw-r--r--Master/texmf-dist/tex/latex/pst-bspline/pst-bspline.sty4
5 files changed, 121 insertions, 42 deletions
diff --git a/Master/texmf-dist/doc/generic/pst-bspline/README b/Master/texmf-dist/doc/generic/pst-bspline/README
index 3e8dd393146..5224a25cf46 100644
--- a/Master/texmf-dist/doc/generic/pst-bspline/README
+++ b/Master/texmf-dist/doc/generic/pst-bspline/README
@@ -2,10 +2,10 @@
%%
%% Michael Sharpe <msharpe@ucsd.edu>
%%
-%% Version 1.4, 2010/10/14
+%% Version 1.41, 2010/10/19
%%
%% License: Free
-This package draws uniform, cubic Bspline curves, open and closed, based on a sequence of Bspline control points. There is also code which permits drawing the open or closed cubic Bspline curve interplating a sequence of points. This version adds a \thickBspline macro.
+This package draws uniform, cubic B-spline curves, open and closed, based on a sequence of B-spline control points. There is also code which permits drawing the open or closed cubic B-spline curve interpolating a sequence of points. This version adds a \thickBspline macro.
The .tex and .sty files should be installed in a folder searched by TeX. All documentation is in pst-bspline-doc.pdf. \ No newline at end of file
diff --git a/Master/texmf-dist/doc/generic/pst-bspline/pst-bspline-doc.pdf b/Master/texmf-dist/doc/generic/pst-bspline/pst-bspline-doc.pdf
index 6c395adbf4f..7b4beb03b8d 100644
--- a/Master/texmf-dist/doc/generic/pst-bspline/pst-bspline-doc.pdf
+++ b/Master/texmf-dist/doc/generic/pst-bspline/pst-bspline-doc.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/generic/pst-bspline/pst-bspline-doc.tex b/Master/texmf-dist/doc/generic/pst-bspline/pst-bspline-doc.tex
index 9e08c19d7f1..8e034e19af3 100644
--- a/Master/texmf-dist/doc/generic/pst-bspline/pst-bspline-doc.tex
+++ b/Master/texmf-dist/doc/generic/pst-bspline/pst-bspline-doc.tex
@@ -1,3 +1,4 @@
+\listfiles
\documentclass[dvips,11pt]{article}
\usepackage{amsmath}
\usepackage{amsthm}
@@ -14,7 +15,7 @@
\large Michael Sharpe\\[10pt]
msharpe@ucsd.edu}
\end{center}
-A cubic uniform B-spline curve with control points $B_0 \ldots B_n$ is a curve parametrized by the interval $[0,n]$, which is $C^2$-continuous (that is, has continuous curvature) and is on each interval $[k-1,k]$ given by a cubic B\'ezier curve whose control points are derived from the $(B_k)$. These curves are discussed in any reasonably modern text on Numerical Analysis. One easily accessible source is the UCLA lecture notes of Kirby Baker:
+A cubic uniform B-spline curve with control points $B_0 \ldots B_n$ is a curve parametrized by the interval $[0,n]$, which is, except in degenerate cases, $C^2$-continuous (that is, has continuous curvature) and is on each interval $[k-1,k]$ given by a cubic B\'ezier curve whose control points are derived from the $(B_k)$. These curves are discussed in any reasonably modern text on Numerical Analysis. One easily accessible source is the UCLA lecture notes of Kirby Baker:
\noindent\url{http://www.math.ucla.edu/~baker/149.1.02w/handouts/dd_splines.pdf}
@@ -316,20 +317,27 @@ for k=n-2 downto 1
x(k)=x(k)-m(k)* x(k+1)-c(k)*x(n)
y(k)=y(k)-m(k)* y(k+1)-c(k)*y(n)
\end{verbatim}
-This algorithm is implemented in \TeX/PostScript code in {\tt pst-Bspline.tex} and may be invoked using the macro
+This algorithm is implemented in \TeX/PostScript code in {\tt pst-bspline.tex} and may be invoked using the macro
\begin{verbatim}
\psBsplineInterpC{<node root>}{<index>}
\end{verbatim}
- You must previously have defined a sequence, say {\tt S0} $\cdots$ {\tt S100} of \verb|\pnode|s that you plan to interpolate with a closed curve. Then
+ You must previously have defined a sequence, say {\tt S0} $\cdots$ {\tt S100} of \verb|\pnode|s that you plan to interpolate with a closed curve. If you used \verb|\pnodes| to do this, it would have constructed a macro \verb|\Snodecount| to store the value $100$. Then
\begin{verbatim}
\psBsplineInterpC{S}{100}
\end{verbatim}
constructs the sequence {\tt SB0} $\cdots$ {\tt SB100} of B-spline control points (appending~{\tt B} to the root name) for a closed curve interpolating {\tt S0} $\cdots$ {\tt S100}, which may then be rendered with the command
\begin{verbatim}
-\psBsplineNodesC{SB}{100}
+\psBsplineNodesC{SB}{101}
\end{verbatim}
with any keywords options you wish.
+{\bf IMPORTANT:} The macro \verb|\psBsplineInterpC| modifies the node sequence {\tt S}, setting \verb|S101=S0|, and changing \verb|\Snodecount| to take the value $101$. This is convenient when you use the construction:
+\begin{verbatim}
+\pnodes{S}()()()()% sets \Snodecount to 3
+\psBsplineInterpC{S}{\Snodecount}% constructs B-spline control pts SB0..SB4
+\psBsplineNodesC{SB}{\Snodecount}
+\end{verbatim}
+
The following example illustrates that there is a difference between \verb|\psccurve| and B-spline interpolation, the former having a rounder appearance. Generally speaking, B-spline interpolation comes closer to minimizing the average curvature.
\begin{verbatim}
\documentclass{article}
@@ -456,6 +464,7 @@ The clipping path is drawn by default positively oriented so that objects are cl
\end{document}
\end{verbatim}
+\vspace{12pt}
\begin{center}
\begin{pspicture}[showgrid=true](-.5,-.5)(6,5)
\pnodes{S}(1,0)(5,1)(4,4)(1,3)%
@@ -466,4 +475,39 @@ The clipping path is drawn by default positively oriented so that objects are cl
\end{pspicture}
\end{center}
+\vspace{12pt}
+The \verb|\thickBspline| macro works as expected in the closed (periodic) case, taking advantage of automatic incrementing of the nodecount.
+
+\begin{verbatim}
+\documentclass{article}
+\usepackage{pstricks}
+\usepackage{pst-bspline,pstricks-add}
+\begin{document}
+\begin{pspicture}[showgrid=true](-.5,-.5)(6,5)
+\pnodes{S}(1,0)(5,1)(4,4)(1,3)%
+\psBsplineInterpC{S}{\Snodecount}%
+% defines nodes SB0, SB1, SB2 etc --- the Bspline control points
+% increments \Snodecount by 1 for future macros
+\psBsplineNodes[linestyle=none,showpoints=false]{SB}{\Snodecount}%
+% Constructs the Bezier control points SBR0, SBL1, SBR1, etc
+\thickBspline[linestyle=none]{S}{\Snodecount}{22pt}%
+{\psframe[fillstyle=vlines](-1,-1)(6,6)}%
+\end{pspicture}
+\end{document}
+\end{verbatim}
+
+\vspace{12pt}
+
+\begin{center}
+\begin{pspicture}[showgrid=true](-.5,-.5)(6,5)
+\pnodes{S}(1,0)(5,1)(4,4)(1,3)%
+\psBsplineInterpC{S}{\Snodecount}%
+% defines nodes SB0, SB1, SB2 etc --- the Bspline control points
+% increments \Snodecount by 1 for future macros
+\psBsplineNodes[linestyle=none,showpoints=false]{SB}{\Snodecount}%
+% Constructs the Bezier control points SBR0, SBL1, SBR1, etc
+\thickBspline[linestyle=none]{S}{\Snodecount}{22pt}{\psframe[fillstyle=vlines](-1,-1)(6,6)}%
+\end{pspicture}
+\end{center}
+
\end{document} \ No newline at end of file
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 b5a0b11b139..eaea89f9b77 100644
--- a/Master/texmf-dist/tex/generic/pst-bspline/pst-bspline.tex
+++ b/Master/texmf-dist/tex/generic/pst-bspline/pst-bspline.tex
@@ -5,11 +5,11 @@
\csname PSTBsplineLoaded\endcsname
\let\PSTBsplineLoaded\endinput
-\ifx\PSTricksLoaded\endinput \else\input pstricks.tex\fi
-\ifx\PSTnodeLoaded\endinput \else\input pst-node.tex\fi
+\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.4}
-\def\filedate{2010/10/14}
+\def\fileversion{1.41}
+\def\filedate{2010/10/19}
\message{`pst-bspline' v\fileversion, \filedate\space Bspline routines for pstricks (ms)}
%
@@ -27,6 +27,7 @@
%\newif\ifbsp@showpoints
%\newif\ifbsp@doubleline
\newif\ifbsp@seq
+\newif\ifbsp@per %flag for periodic interpolation
%
\def\bsp@init{%these items are used only within the plotting macros
\def\bsp@arrowA{}%
@@ -196,15 +197,17 @@
\next@NodeX}%
%
\def\make@mcoeff#1{%
-\pstVerb{ /mcoeff #1\space 1 add array def %
+\pstVerb{ tx@Dict begin /mcoeff #1\space 1 add array def %
mcoeff 1 0.25 put %
1 1 #1\space 1 sub %
{/j exch def %j is counter
- mcoeff j 1 add 1 4 mcoeff j get sub div put } for }}%
+ mcoeff j 1 add 1 4 mcoeff j get sub div put } for end }}%
%
-\def\psBsplineInterp#1#2{%
+\def\psBsplineInterp#1#2{{%
% #1=node name root to interpolate, #2=end index,
% eg, if we want to interpolate S0,..., S100, #1=S, #2=100,
+\pst@killglue
+\global\bsp@perfalse %
\newcount\top@mone \top@mone=#2\relax%100
\newcount\top@ndx \top@ndx=\top@mone%
\advance\top@ndx by -1\relax%99
@@ -225,57 +228,68 @@
\else% exactly 3 points to interpolate
\nodexn{1.5(\noderoot1)-.25(\noderoot0)-.25(\noderoot2)}{\noderoot B1}%
\fi\fi%
-}% end def
-\def\psBsplineInterpC#1#2{%
+}\ignorespaces}% end def
+%
+\def\psBsplineInterpC#1#2{{%
% #1=node name root, #2=top index,
% eg, if we want to interpolate S0,..., S100, #1=S, #2=100
% interpolation in this case is periodic (closed curve)
\pst@killglue
+\global\bsp@pertrue %
+\pst@cnta=\csname#1nodecount\endcsname\advance\pst@cnta \@ne %
\newcount\top@mone \top@mone=#2\relax%
+\ifnum \top@mone<\pst@cnta %
+ \expandafter\xdef \csname #1nodecount\endcsname {\the\pst@cnta}%
+ \typeout{Changed #1nodecount to \the\pst@cnta}%
+ %\top@mone=\pst@cnta %
+\else%
+ \ifnum \top@mone>\pst@cnta \top@mone=\pst@cnta\advance\top@mone \m@ne\fi
+\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}%
\def\noderoot{#1}%
-\pstVerb{ /bcoeff #2\space 2 add array def /ccoeff #2\space 2 add array def /xcoeff #2\space 2 add array def /ycoeff #2\space 2 add array def
+\pstVerb{ tx@Dict begin /bcoeff #2\space 2 add array def /ccoeff #2\space 2 add array def /xcoeff #2\space 2 add array def /ycoeff #2\space 2 add array def %
%% initialize b, c, x ,y values
1 1 \the\top@ndx\space %1 add
{/j exch def %j is counter
- ccoeff j 0 put bcoeff j 0 put } for
-bcoeff 1 1 put bcoeff #2\space 1 put bcoeff #2\space 1 add 4 put
-ccoeff 1 0.25 put ccoeff #2\space 1 put }%
+ ccoeff j 0 put bcoeff j 0 put } for %
+ bcoeff 1 1 put bcoeff #2\space 1 put bcoeff #2\space 1 add 4 put %
+ ccoeff 1 0.25 put ccoeff #2\space 1 put end }%
%end \pstVerb
\pnode(\noderoot 0){\noderoot\the\top@ndx}%copy node 0 to top end
-\pstVerb{ xcoeff 1 1 put ycoeff 1 1.5 put }
+\pstVerb{ tx@Dict begin xcoeff 1 1 put ycoeff 1 1.5 put end }%
\pnode(! \psGetNodeCenter{\noderoot 1} xcoeff 1 \noderoot 1.x 1.5 mul put ycoeff 1 \noderoot 1.y 1.5 mul put 1 1){temp@}% 1.5=6*0.25
\multido{\iA=2+1}{\the\top@mone}{\pnode(! ycoeff \iA\space xcoeff \iA\space \psGetNodeCenter{#1\iA} #1\iA.x 6 mul put #1\iA.y 6 mul put 1 1){temp@}}% move x, y coords times 6 to arrays
-\multido{\iA=2+1,\iB=1+1}{\the\top@mtwo}{\pstVerb{%
- ccoeff \iA\space ccoeff \iA\space get ccoeff \iB\space get sub mcoeff \iA\space get mul put
- xcoeff \iA\space xcoeff \iA\space get xcoeff \iB\space get sub mcoeff \iA\space get mul put
+\multido{\iA=2+1,\iB=1+1}{\the\top@mtwo}{\pstVerb{ tx@Dict begin %
+ ccoeff \iA\space ccoeff \iA\space get ccoeff \iB\space get sub mcoeff \iA\space get mul put %
+ xcoeff \iA\space xcoeff \iA\space get xcoeff \iB\space get sub mcoeff \iA\space get mul put %
ycoeff \iA\space ycoeff \iA\space get ycoeff \iB\space get sub mcoeff \iA\space get mul put
-bcoeff \iA\space bcoeff \iA\space get bcoeff \iB\space get mcoeff \iB\space get mul sub put
-bcoeff \the\top@ndx\space bcoeff \the\top@ndx\space get bcoeff \iB\space get ccoeff \iB\space get mul sub put
-xcoeff \the\top@ndx\space xcoeff \the\top@ndx\space get xcoeff \iB\space get bcoeff \iB\space get mul sub put
-ycoeff \the\top@ndx\space ycoeff \the\top@ndx\space get ycoeff \iB\space get bcoeff \iB\space get mul sub put
+ bcoeff \iA\space bcoeff \iA\space get bcoeff \iB\space get mcoeff \iB\space get mul sub put
+ bcoeff \the\top@ndx\space bcoeff \the\top@ndx\space get bcoeff \iB\space get ccoeff \iB\space get mul sub put
+ xcoeff \the\top@ndx\space xcoeff \the\top@ndx\space get xcoeff \iB\space get bcoeff \iB\space get mul sub put
+ ycoeff \the\top@ndx\space ycoeff \the\top@ndx\space get ycoeff \iB\space get bcoeff \iB\space get mul sub put end %
}% end \pstVerb
}% end \multido
-\pstVerb{%
+\pstVerb{ tx@Dict begin %
bcoeff \the\top@ndx\space bcoeff \the\top@ndx\space get bcoeff \the\top@mone\space get
-ccoeff \the\top@mone\space get mul sub put %b(n)=b(n)-b(n-1)*c(n-1)
-xcoeff \the\top@ndx\space xcoeff \the\top@ndx\space get xcoeff \the\top@mone\space get bcoeff \the\top@mone\space get mul sub bcoeff \the\top@ndx\space get div put %x(n)=(x(n)-x(n-1)*b(n-1))/b(n)
-ycoeff \the\top@ndx\space ycoeff \the\top@ndx\space get ycoeff \the\top@mone\space get bcoeff \the\top@mone\space get mul sub bcoeff \the\top@ndx\space get div put %y(n)=(y(n)-y(n-1)*b(n-1))/b(n)
-xcoeff \the\top@mone\space xcoeff \the\top@mone\space get xcoeff \the\top@ndx\space get ccoeff \the\top@mone\space get mul sub put %x(n-1)=x(n-1)-c(n-1)*x(n)
-ycoeff \the\top@mone\space ycoeff \the\top@mone\space get ycoeff \the\top@ndx\space get ccoeff \the\top@mone\space get mul sub put %y(n-1)=y(n-1)-c(n-1)*y(n)
+ ccoeff \the\top@mone\space get mul sub put %b(n)=b(n)-b(n-1)*c(n-1)
+ xcoeff \the\top@ndx\space xcoeff \the\top@ndx\space get xcoeff \the\top@mone\space get bcoeff \the\top@mone\space get mul sub bcoeff \the\top@ndx\space get div put %x(n)=(x(n)-x(n-1)*b(n-1))/b(n)
+ ycoeff \the\top@ndx\space ycoeff \the\top@ndx\space get ycoeff \the\top@mone\space get bcoeff \the\top@mone\space get mul sub bcoeff \the\top@ndx\space get div put %y(n)=(y(n)-y(n-1)*b(n-1))/b(n)
+ xcoeff \the\top@mone\space xcoeff \the\top@mone\space get xcoeff \the\top@ndx\space get ccoeff \the\top@mone\space get mul sub put %x(n-1)=x(n-1)-c(n-1)*x(n)
+ ycoeff \the\top@mone\space ycoeff \the\top@mone\space get ycoeff \the\top@ndx\space get ccoeff \the\top@mone\space get mul sub put end %y(n-1)=y(n-1)-c(n-1)*y(n)
}% end pstVerb
\mmultido{\iA=\the\top@mone+-1,\iB=\the\top@ndx+-1}{\the\top@mtwo}{%
-\pstVerb{ xcoeff \iA\space xcoeff \iA\space get mcoeff \iA\space get xcoeff \iB\space get mul sub ccoeff \iA\space get xcoeff \the\top@ndx\space get mul sub put % x(k)=x(k)-m(k)*x(k+1)-c(k)*x(n)
-ycoeff \iA\space ycoeff \iA\space get mcoeff \iA\space get ycoeff \iB\space get mul sub ccoeff \iA\space get ycoeff \the\top@ndx\space get mul sub put
+\pstVerb{ tx@Dict begin xcoeff \iA\space xcoeff \iA\space get mcoeff \iA\space get xcoeff \iB\space get mul sub ccoeff \iA\space get xcoeff \the\top@ndx\space get mul sub put % x(k)=x(k)-m(k)*x(k+1)-c(k)*x(n)
+ ycoeff \iA\space ycoeff \iA\space get mcoeff \iA\space get ycoeff \iB\space get mul sub ccoeff \iA\space get ycoeff \the\top@ndx\space get mul sub put end %
}}%y(k)=...
\multido{\iA=1+1}{\the\top@ndx}{\pnode(! xcoeff \iA\space get ycoeff \iA\space get )%
{\noderoot B\iA}}%
\pnode(\noderoot B\the\top@ndx){\noderoot B0}%
-\ignorespaces}%
+}\ignorespaces}%
%
\def\thickBspline{\def\pst@par{}\pst@object{thickBspline}}%
\def\thickBspline@i#1#2#3#4{{%
@@ -349,16 +363,35 @@ ycoeff \iA\space ycoeff \iA\space get mcoeff \iA\space get ycoeff \iB\space get
/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
+% 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 #4
-\psclip{\pscustom{%
+\ifbsp@per %periodic
+ \psclip{\pscustom{%
+ \code{ clipary aload pop moveto nseg nplotpt mul %
+ { lineto } repeat closepath %
+ moveto nseg nplotpt mul { lineto } repeat closepath }}}%
+ #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
-\endpsclip%
-\pstVerb{%
-tx@Dict begin %
-}}%
+ \endpsclip%
+\fi%
+}%
\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 6500f4dbefb..1dabf7aafc8 100644
--- a/Master/texmf-dist/tex/latex/pst-bspline/pst-bspline.sty
+++ b/Master/texmf-dist/tex/latex/pst-bspline/pst-bspline.sty
@@ -1,5 +1,7 @@
\ProvidesPackage{pst-bspline}
-
+ [2010/10/19 v1.41 LaTeX wrapper for pst-bspline (MS)]
\input{pst-bspline}
+\ProvidesFile{pst-bspline.tex}
+ [\filedate\space \fileversion\space `pst-bspline' (ms)]
\endinput \ No newline at end of file