[pstricks] computed coordinates

Michael Sharpe msharpe at ucsd.edu
Sun Apr 25 18:10:21 CEST 2010


On Apr 25, 2010, at 7:00 AM, Zbigniew Nitecki wrote:

> I'm still confused about how to introduce computations on inputs into a macro.
> 
> I am trying to create a macro to then include in a \multido for drawing an arrow
> indicating a vector field.  The following two-dimensional version works fine: I can
> insert a postscript formula for the components of the last two inputs and get a reasonable
> picture.
> 	\newcommand{\vectorfieldtwo}[8]{
> 			\multido{\rx=#1+#2}{#3}{%
> 				\multido{\ry=#4+#5}{#6}{%
> 					\psline{->}(!\rx\space \ry)(!\rx\space #7 add \ry\space #8 add)
> 						}}
> 				}%2-dim vectorfield: x starts at #1, increments by #2, #3 iterations;
> 				%y starts at #4, increments by #5, #6 iterations;
> 				%#7, #8 components of vector (in terms of \rx & \ry, postscript style
> 
> The following also works in 3D, but I am giving both endpoints of the vector explicitly:
> 	\newcommand{\vecThree}[6]{\pstThreeDLine[arrows=->]%
> 		(#1\space,#2\space,#3\space)(#4\space,#5\space,#6\space)
> 	}
> 		%arrow from (#1,#2,#3) to (#4,#5,#6)
> However, when I try to do the following, which uses as input the components of the vector
> instead of explicit coordinates for its endpoint, I get an error message (the error is the same
> whether I use an exclamation before the coordinates or not):
> 
> 	\newcommand{\vecatThree}[6]{\pstThreeDLine[arrows=->]%
> 		(#1\space  #2\space  #3\space)
> 		(#1\space #4\space add #2\space #5\space add #3\space #6\space add)
> 	}
> 		% arrow pinned to (#1,#2,#3) with components (#4,#5,#6)
> 
>> Runaway argument?
>> \@nil \edef \pst at coors {\pst at coor \pst at coors }\@ifnextchar ({\pst@@getcoors \ET
>> C.
>> ! Paragraph ended before \cartesianIIID at coor was complete.
>> <to be read again> 
>>                    \par 
>> l.41 
> 
> I would like, ultimately, to insert such a macro either into a multido as in the 2-dim example,
> or to do something more sophisticated:  given a surface plotted via say parametricplotThreeD,
> to insert a formula for the entries #1, #2, and #3 as well (to plot the vectors only along the points
> of the surface).  
> 
> I would also prefer to use the algebraic rather than postscript form for formulas, but that is a minor
> and separate matter.
> 

Just change (#1\space #4\space add #2\space #5\space add #3\space #6\space add) to
> (#1\space #4\space add, #2\space #5\space add ,#3\space #6\space add)

The three-d coordinate parser always expects coordinates separated by commas, unlike the two-d coordinate parser.

Michael


More information about the PSTricks mailing list