summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/generic/pst-3dplot
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2006-01-12 23:46:03 +0000
committerKarl Berry <karl@freefriends.org>2006-01-12 23:46:03 +0000
commit873660d1a83ece926fe7206288dda9c36b349c1b (patch)
treea48f77125c309a355b5d0eb58d6b24446abe9d62 /Master/texmf-dist/tex/generic/pst-3dplot
parent2939242967231097459df0fc3150fabc2f639111 (diff)
generic 1
git-svn-id: svn://tug.org/texlive/trunk@613 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/generic/pst-3dplot')
-rw-r--r--Master/texmf-dist/tex/generic/pst-3dplot/pst-3dplot.tex1635
1 files changed, 1635 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/generic/pst-3dplot/pst-3dplot.tex b/Master/texmf-dist/tex/generic/pst-3dplot/pst-3dplot.tex
new file mode 100644
index 00000000000..990149460fe
--- /dev/null
+++ b/Master/texmf-dist/tex/generic/pst-3dplot/pst-3dplot.tex
@@ -0,0 +1,1635 @@
+%%
+%% This is file `pst-3dplot.tex',
+%%
+%% IMPORTANT NOTICE:
+%%
+%% Package `pst-3dplot.tex'
+%%
+%% Herbert Voss <voss _at_ perce.de>
+%%
+%% This program can be redistributed and/or modified under the terms
+%% of the LaTeX Project Public License Distributed from CTAN archives
+%% in directory macros/latex/base/lppl.txt.
+%%
+%% DESCRIPTION:
+%% `pst-3dplot' is a PSTricks package to draw 3d curves,
+%% data and different graphical objects
+%%
+\csname PSTThreeDplotLoaded\endcsname
+\let\PSTThreeDplotLoaded\endinput
+% Requires PSTricks, pst-node, pst-plot, multido packages
+\ifx\PSTricksLoaded\endinput\else\input pstricks.tex\fi
+\ifx\PSTnodesLoaded\endinput\else\input pst-3d.tex\fi
+\ifx\PSTnodesLoaded\endinput\else\input pst-node.tex\fi
+\ifx\PSTplotLoaded\endinput\else\input pst-plot.tex\fi% plotpoints
+\ifx\PSTVueTroisDLoaded\endinput\else\input pst-vue3d.tex\fi
+\ifx\PSTMultidoLoaded\endinput\else\input multido.tex\fi
+%
+\def\fileversion{1.63}
+\def\filedate{2005/02/19}
+\message{`PST-3dplot' v\fileversion, \filedate\space (HV)}
+%
+\edef\PstAtCode{\the\catcode`\@} \catcode`\@=11\relax
+\ifx\PSTXKeyLoaded\endinput\else\input pst-xkey \fi
+\pst@addfams{pst-3dplot}
+\SpecialCoor
+%
+%%%%%%%%%%%%%%%%%% Macrolist %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% \def\pstThreeDPut
+% \def\pstThreeDLine
+% \def\pstThreeDDot
+% \def\pstThreeDNode
+% \def\pstUThreeDPut
+% \def\pstThreeDSquare
+% \def\pstThreeDBox
+% \def\pstThreeDSphere
+% \def\pstThreeDEllipse
+% \def\pstThreeDPlotFunc
+% \def\psplotThreeD
+% \def\parametricplotThreeD
+% \def\psThreeDPlot
+% \def\pstThreeDCoor
+% \def\fileplotThreeD
+% \def\dataplotThreeD
+% \def\listplotThreeD
+%
+%
+\newdimen\pst@dimf
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% ---------------- the if's -----------------
+%
+\newif\ifPst@drawing% draw the coordinates?
+\define@key[psset]{pst-3dplot}{drawing}[true]{\@nameuse{Pst@drawing#1}}
+\newif\ifPst@drawCoor% draw the coordinates of a dot?
+\define@key[psset]{pst-3dplot}{drawCoor}[false]{\@nameuse{Pst@drawCoor#1}}
+\newif\ifPst@hiddenLine% emulate hidden line surface?
+\define@key[psset]{pst-3dplot}{hiddenLine}[false]{\@nameuse{Pst@hiddenLine#1}}
+\newif\ifPst@SphericalCoor% (r,phi,theta)
+\define@key[psset]{pst-3dplot}{SphericalCoor}[true]{\@nameuse{Pst@SphericalCoor#1}}
+\psset{SphericalCoor=false}
+%
+% ------- the global definitions for the pspicture frame ------
+%
+\define@key[psset]{pst-3dplot}{xMin}{\def\psk@ThreeDplot@xMin{#1}}
+\define@key[psset]{pst-3dplot}{xMax}{\def\psk@ThreeDplot@xMax{#1}}
+\define@key[psset]{pst-3dplot}{yMin}{\def\psk@ThreeDplot@yMin{#1}}
+\define@key[psset]{pst-3dplot}{yMax}{\def\psk@ThreeDplot@yMax{#1}}
+\define@key[psset]{pst-3dplot}{zMin}{\def\psk@ThreeDplot@zMin{#1}}
+\define@key[psset]{pst-3dplot}{zMax}{\def\psk@ThreeDplot@zMax{#1}}
+\define@key[psset]{pst-3dplot}{xThreeDunit}{\def\psk@ThreeDplot@xThreeDunit{#1}}
+\define@key[psset]{pst-3dplot}{yThreeDunit}{\def\psk@ThreeDplot@yThreeDunit{#1}}
+\define@key[psset]{pst-3dplot}{zThreeDunit}{\def\psk@ThreeDplot@zThreeDunit{#1}}
+%
+% -------------- the angles and the plotpoints -------------
+%
+\define@key[psset]{pst-3dplot}{Alpha}{\def\psk@ThreeDplot@Alpha{#1}} % Horizontal turn
+\define@key[psset]{pst-3dplot}{Beta}{\def\psk@ThreeDplot@Beta{#1}}% Vertical turn
+\define@key[psset]{pst-3dplot}{RotX}{\def\psk@ThreeD@RotX{#1}}% x rotation
+\define@key[psset]{pst-3dplot}{RotY}{\def\psk@ThreeD@RotY{#1}}% y rotation
+\define@key[psset]{pst-3dplot}{RotZ}{\def\psk@ThreeD@RotZ{#1}}% z
+\define@key[psset]{pst-3dplot}{RotSequence}{\def\psk@ThreeD@RotS{#1}}%
+\def\drawStyle@xLines{xLines}% 0
+\def\drawStyle@yLines{yLines}% 1
+\def\drawStyle@xyLines{xyLines}% 2
+\def\drawStyle@yxLines{yxLines}% 3
+\define@key[psset]{pst-3dplot}{drawStyle}{% how to draw 3D functions
+ \def\pst@tempa{#1}%
+ \ifx\pst@tempa\drawStyle@xLines\let\psk@ThreeDplot@drawStyle\z@\else%
+ \ifx\pst@tempa\drawStyle@yLines\let\psk@ThreeDplot@drawStyle\@ne\else%
+ \ifx\pst@tempa\drawStyle@xyLines\let\psk@ThreeDplot@drawStyle\tw@\else%
+ \ifx\pst@tempa\drawStyle@yxLines\let\psk@ThreeDplot@drawStyle\thr@@\else%
+ \@pstrickserr{Bad draw style: `\pst@tempa'}\@ehpa%
+ \fi\fi\fi\fi%
+% \typeout{drawStyle: \the\psk@ThreeDplot@drawStyle}
+ }
+\psset[pst-3dplot]{drawStyle=xLines}
+%
+\define@key[psset]{pst-3dplot}{xPlotpoints}{\def\psk@ThreeDplot@xPlotpoints{#1}}
+\define@key[psset]{pst-3dplot}{yPlotpoints}{\def\psk@ThreeDplot@yPlotpoints{#1}}
+\define@key[psset]{pst-3dplot}{beginAngle}{% for ellipse/circle arc
+ \def\psk@ThreeDplot@beginAngle{#1}}
+\define@key[psset]{pst-3dplot}{endAngle}{% for ellipse/circle arc
+ \def\psk@ThreeDplot@endAngle{#1}}
+\define@key[psset]{pst-3dplot}{linejoin}{% how lines come together 0,1,2
+ \def\psk@ThreeDplot@linejoin{#1}}
+\define@key[psset]{pst-3dplot}{plane}{% xy,xz,yz
+ \def\psk@ThreeDplot@plane{#1}}
+\define@key[psset]{pst-3dplot}{pOrigin}{% combination of (lr)(tBb)
+ \def\psk@ThreeDplot@pOrigin{#1}}
+\def\ThreeDplot@planeXY{xy}
+\def\ThreeDplot@planeXZ{xz}
+\def\ThreeDplot@planeYZ{yz}
+%
+% -------------- the length and node definitions -------------
+%
+\define@key[psset]{pst-3dplot}{XO}{% the X-offset
+ \def\psk@ThreeDplot@XO{#1}}
+\define@key[psset]{pst-3dplot}{YO}{% the y-offset
+ \def\psk@ThreeDplot@YO{#1}}
+\define@key[psset]{pst-3dplot}{angleStep}{% for circles
+ \def\psk@ThreeDplot@angleStep{#1}}
+\define@key[psset]{pst-3dplot}{posStart}{% where the arrows start
+ \def\psk@ThreeDplot@posStart{#1}}
+\define@key[psset]{pst-3dplot}{length}{% the length of the before|outlines
+ \def\psk@ThreeDplot@length{#1}}
+\define@key[psset]{pst-3dplot}{arrowOffset}{% offset for \arrowLine
+ \def\psk@ThreeDplot@arrowOffset{#1}}
+\define@key[psset]{pst-3dplot}{visibleLineStyle}{% offset for \arrowLine
+ \def\psk@ThreeDplot@visibleLineStyle{#1}}
+\define@key[psset]{pst-3dplot}{invisibleLineStyle}{% offset for \arrowLine
+ \def\psk@ThreeDplot@invisibleLineStyle{#1}}
+%
+\newif\if@IIIDticks% draw the ticks?
+\define@key[psset]{pst-3dplot}{IIIDticks}[true]{\@nameuse{@IIIDticks#1}}
+\define@key[psset]{pst-3dplot}{Dz}{\def\psk@Dz{#1}}
+\define@key[psset]{pst-3dplot}{IIIDxTicksPlane}{\def\psk@IIIDxTicksPlane{#1}}
+\define@key[psset]{pst-3dplot}{IIIDyTicksPlane}{\def\psk@IIIDyTicksPlane{#1}}
+\define@key[psset]{pst-3dplot}{IIIDzTicksPlane}{\def\psk@IIIDzTicksPlane{#1}}
+\define@key[psset]{pst-3dplot}{IIIDticksize}{\def\psk@IIIDticksize{#1}}
+\define@key[psset]{pst-3dplot}{IIIDxticksep}{\def\psk@IIIDxticksep{#1}}
+\define@key[psset]{pst-3dplot}{IIIDyticksep}{\def\psk@IIIDyticksep{#1}}
+\define@key[psset]{pst-3dplot}{IIIDzticksep}{\def\psk@IIIDzticksep{#1}}
+\define@key[psset]{pst-3dplot}{nameX}{% start of the object arrow
+ \def\psk@ThreeDplot@nameX{#1}}
+\define@key[psset]{pst-3dplot}{spotX}{% where to draw the label
+ \def\psk@ThreeDplot@spotX{#1}}
+\define@key[psset]{pst-3dplot}{nameY}{\def\psk@ThreeDplot@nameY{#1}}
+\define@key[psset]{pst-3dplot}{spotY}{\def\psk@ThreeDplot@spotY{#1}}
+\define@key[psset]{pst-3dplot}{nameZ}{\def\psk@ThreeDplot@nameZ{#1}}
+\define@key[psset]{pst-3dplot}{spotZ}{\def\psk@ThreeDplot@spotZ{#1}}
+%
+% ### begin Torsten Suhling
+\define@key[psset]{pst-3dplot}{planecorr}{% make plane tags readable
+ \def\psk@ThreeDplot@planecorr{#1}}
+\def\ThreeDplot@planecorrOff{off} % default
+\def\ThreeDplot@planecorrNormal{normal} % make planes readable
+\def\ThreeDplot@planecorrXYrot{xyrot} % and put tag for xy-plane
+% % parallel to the y-axis
+% ### end Torsten Suhling
+%
+\def\psds@none{\pst@gdot{}}% define none for the dotstyle
+%
+\newpsstyle{hiddenStyle}{fillstyle=solid,fillcolor=white}
+\newcount\pst@cntx\newcount\pst@cnty\newcount\pst@cntz
+\newdimen\pst@dimx\newdimen\pst@dimy\newdimen\pst@dimz
+%
+\define@key[psset]{pst-3dplot}{planeGrid}{\def\psk@planeGrid{#1}}
+\define@key[psset]{pst-3dplot}{planeGridOffset}{\def\psk@planeGridOffset{#1}}
+\define@key[psset]{pst-3dplot}{subticks}{\def\psk@xsubticks{#1}\def\psk@ysubticks{#1}}
+\define@key[psset]{pst-3dplot}{xsubticks}{\def\psk@xsubticks{#1}}
+\define@key[psset]{pst-3dplot}{ysubticks}{\def\psk@ysubticks{#1}}
+%
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% B A S I C S %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+\pstheader{pst-3dplot.pro}
+% ---- only shortcuts -------
+\def\pst@3ddict{tx@3DPlotDict begin }
+\def\tx@saveCoor{\pst@3ddict saveCoor end }
+\def\tx@X{\pst@3ddict x end }
+\def\tx@Y{\pst@3ddict y end }
+\def\tx@Z{\pst@3ddict z end }
+\def\tx@xIID{\pst@3ddict x2D end }
+\def\tx@yIID{\pst@3ddict y2D end }
+\def\tx@ConvertToIID{\pst@3ddict ConvertTo2D end }
+\def\tx@SphericalCoor{\pst@3ddict SphericalCoor end }
+\def\tx@ConvertToCartesian{\pst@3ddict ConvertToCartesian end }
+%
+\def\setDefaults{%
+ \psset[pst-3dplot]{%
+ drawing=true,hiddenLine=false,xMin=-1,xMax=4,yMin=-1,yMax=4,zMin=-1,zMax=4,%
+ xThreeDunit=1.0,yThreeDunit=1.0,zThreeDunit=1.0,Alpha=45,Beta=30,%
+ RotX=0,RotY=0,RotZ=0,RotSequence=xyz,%
+ drawStyle=xLines,xPlotpoints=25,yPlotpoints=25,beginAngle=0,endAngle=360,%
+ linejoin=1,XO=0,YO=0,angleStep=1,posStart=0,length=2,arrowOffset=0,%
+ visibleLineStyle=solid,invisibleLineStyle=dashed,nameX=$x$,spotX=180,%
+ nameY=$y$,spotY=0,nameZ=$z$,spotZ=90,plane=xy,pOrigin=c,SphericalCoor=false,%
+ Dz=1,IIIDticks=false,IIIDxTicksPlane=xy,IIIDyTicksPlane=yz,IIIDzTicksPlane=yz,%
+ IIIDticksize=0.1,IIIDxticksep=-0.4,IIIDyticksep=-0.2,IIIDzticksep=0.2,
+ planecorr=off,%
+ planeGrid=xy,planeGridOffset=0,subticks=10%
+ }%
+}
+\setDefaults
+%
+\def\variablesIIID{
+% 0 0 translate
+ /RotX \psk@ThreeD@RotX\space def
+ /RotY \psk@ThreeD@RotY\space def
+ /RotZ \psk@ThreeD@RotZ\space def
+ /dxUnit \psk@ThreeDplot@xThreeDunit\space def
+ /dyUnit \psk@ThreeDplot@yThreeDunit\space def
+ /dzUnit \psk@ThreeDplot@zThreeDunit\space def
+ /RotSequence (\psk@ThreeD@RotS) def
+ /Alpha \psk@ThreeDplot@Alpha\space def
+ /Beta \psk@ThreeDplot@Beta\space def
+ /Sin1 Beta sin def
+ /Sin2 Alpha sin def
+ /Cos1 Beta cos def
+ /Cos2 Alpha cos def
+ /Cos1Sin2 Cos1 Sin2 mul def
+ /Sin1Sin2 Sin1 Sin2 mul def
+ /Cos1Cos2 Cos1 Cos2 mul def
+ /Sin1Cos2 Sin1 Cos2 mul def
+ /M11 RotZ cos RotY cos mul def
+ /M12 RotZ cos RotY sin mul RotX sin mul RotZ sin RotX cos mul sub def
+ /M13 RotZ cos RotY sin mul RotX cos mul RotZ sin RotX sin mul add def
+ /M21 RotZ sin RotY cos mul def
+ /M22 RotZ sin RotY sin RotX sin mul mul RotZ cos RotX cos mul add def
+ /M23 RotZ sin RotY sin mul RotX cos mul RotZ cos RotX sin mul sub def
+ /M31 RotY sin neg def
+ /M32 RotX sin RotY cos mul def
+ /M33 RotX cos RotY cos mul def
+}%
+%
+% (#1) -> #1 #2 #3
+\def\getThreeDCoor#1#2{\pst@getThreeDcoor(#1)\let#2\pst@coorIIID}
+\def\pst@getThreeDcoor(#1,#2,#3){%
+ \edef\pst@coorIIID{#1\space #2\space #3\space}%
+}
+\def\pst@addThreeDVec(#1)(#2)#3#4#5{%
+ \pst@calcThreeDVec(#1)(#2)%
+ \let#3\pst@getValueX%
+ \let#4\pst@getValueY%
+ \let#5\pst@getValueZ%
+}
+\def\pst@subThreeDVec(#1)(#2,#3,#4)#5#6#7{%
+ \pst@calcThreeDVec(#1)(-#2,-#3,-#4)%
+ \let#5\pst@getValueX%
+ \let#6\pst@getValueY%
+ \let#7\pst@getValueZ%
+}
+\def\pst@calcThreeDVec(#1,#2,#3)(#4,#5,#6){{%
+ \pst@dima=#1 pt%
+ \pst@dimb=#2 pt%
+ \pst@dimc=#3 pt%
+ \pst@dimf=#4 pt%
+ \pst@dimg=#5 pt%
+ \pst@dimh=#6 pt%
+ \advance\pst@dima by \pst@dimf%
+ \advance\pst@dimb by \pst@dimg%
+ \advance\pst@dimc by \pst@dimh%
+ \xdef\pst@getValueX{\pst@number\pst@dima}%
+ \xdef\pst@getValueY{\pst@number\pst@dimb}%
+ \xdef\pst@getValueZ{\pst@number\pst@dimc}%
+}}%
+%
+% the ThreeD coordinate system
+%
+\def\psxyzlabel#1{\bgroup\footnotesize\textsf{#1}\egroup}
+%
+\def\pstThreeDCoor{\pst@object{pstThreeDCoor}}
+\def\pstThreeDCoor@i{%
+ \pst@killglue
+ \begingroup
+ \addbefore@par{linewidth=0.5pt,linecolor=red,arrows=->,dotstyle=|}%
+ \use@par%
+ \pstThreeDNode(\psk@ThreeDplot@xMin,0,0){xMin}%
+ \pstThreeDNode(\psk@ThreeDplot@xMax,0,0){xMax}%
+ \pstThreeDNode(0,\psk@ThreeDplot@yMin,0){yMin}%
+ \pstThreeDNode(0,\psk@ThreeDplot@yMax,0){yMax}%
+ \pstThreeDNode(0,0,\psk@ThreeDplot@zMin){zMin}%
+ \pstThreeDNode(0,0,\psk@ThreeDplot@zMax){zMax}%
+ \ifPst@drawing% ThreeDplot axes
+ \psline(xMin)(xMax)%
+ \psline(yMin)(yMax)%
+ \psline(zMin)(zMax)%
+ \uput[\psk@ThreeDplot@spotX](xMax){\psk@ThreeDplot@nameX}%
+ \uput[\psk@ThreeDplot@spotY](yMax){\psk@ThreeDplot@nameY}%
+ \uput[\psk@ThreeDplot@spotZ](zMax){\psk@ThreeDplot@nameZ}%
+ \if@IIIDticks%
+% \ifnum\psk@ThreeDplot@Alpha=90\else
+ \pst@dimx=\psk@ThreeDplot@xMax\p@%
+ \pst@dima=\psk@ThreeDplot@xThreeDunit\p@%
+ \divide\pst@dimx by \pst@dima%
+ \pst@cntx=\number\pst@dimx\advance\pst@cntx by -1%
+ \multido{%
+ \rA=\psk@Dx+\psk@Dx,%
+ \rB=\psk@ThreeDplot@xThreeDunit+\psk@ThreeDplot@xThreeDunit}{\pst@cntx}{%
+ \pstThreeDLine[arrows=-](\rB,-\psk@IIIDticksize,0)(\rB,\psk@IIIDticksize,0)%
+ \pstPlanePut[plane=\psk@IIIDxTicksPlane]%
+ (\rB,\psk@IIIDxticksep,0){\psxyzlabel{\rA}}%
+ }%
+ \pst@dimx=\psk@ThreeDplot@xMin\p@%
+ \pst@dima=\psk@ThreeDplot@xThreeDunit\p@%
+ \divide\pst@dimx by \pst@dima%
+ \ifnum\psk@ThreeDplot@xMin<\z@\pst@cntx=-\number\pst@dimx%
+ \else\pst@cntx=\number\pst@dimx%
+ \fi%
+ \multido{\rA=-\psk@Dx+-\psk@Dx,%
+ \rB=-\psk@ThreeDplot@xThreeDunit+-\psk@ThreeDplot@xThreeDunit}{\pst@cntx}{%
+ \pstThreeDLine[arrows=-](\rB,-\psk@IIIDticksize,0)(\rB,\psk@IIIDticksize,0)%
+ \pstPlanePut[plane=\psk@IIIDxTicksPlane](\rB,\psk@IIIDxticksep,0){\psxyzlabel{\rA}}%
+ }%
+% \fi%
+% \ifnum\psk@ThreeDplot@Alpha=0\else
+ \pst@dimy=\psk@ThreeDplot@yMax\p@%
+ \pst@dima=\psk@ThreeDplot@yThreeDunit\p@%
+ \divide\pst@dimy by \pst@dima%
+ \pst@cnty=\number\pst@dimy\advance\pst@cnty by -1%
+ \mmultido{\rA=0.0+\psk@Dy,\rB=0.0+\psk@ThreeDplot@yThreeDunit}{\pst@cnty}{%
+ \pstThreeDLine[arrows=-](-\psk@IIIDticksize,\rB,0)(\psk@IIIDticksize,\rB,0)%
+ \pstPlanePut[plane=\psk@IIIDyTicksPlane](\psk@IIIDyticksep,\rB,0){\psxyzlabel{\rA}}%
+ }%
+ \pst@dimy=\psk@ThreeDplot@yMin\p@%
+ \pst@dima=\psk@ThreeDplot@yThreeDunit\p@%
+ \divide\pst@dimy by \pst@dima%
+ \ifnum\psk@ThreeDplot@yMin<\z@\pst@cnty=-\number\pst@dimy%
+ \else\pst@cnty=\number\pst@dimy%
+ \fi%
+ \multido{\rA=-\psk@Dy+-\psk@Dy,%
+ \rB=-\psk@ThreeDplot@yThreeDunit+-\psk@ThreeDplot@yThreeDunit}{\pst@cnty}{%
+ \pstThreeDLine[arrows=-](-\psk@IIIDticksize,\rB,0)(\psk@IIIDticksize,\rB,0)%
+ \pstPlanePut[plane=\psk@IIIDyTicksPlane](\psk@IIIDyticksep,\rB,0){\psxyzlabel{\rA}}%
+ }%
+% \fi%
+ \pst@dimz=\psk@ThreeDplot@zMax\p@%
+ \pst@dima=\psk@ThreeDplot@zThreeDunit\p@%
+ \divide\pst@dimz by \pst@dima%
+ \pst@cntz=\number\pst@dimz\advance\pst@cntz by -1%
+ \mmultido{\rA=0.0+\psk@Dz,\rB=0.0+\psk@ThreeDplot@zThreeDunit}{\pst@cntz}{%
+ \pstThreeDLine[arrows=-](0,-\psk@IIIDticksize,\rB)(0,\psk@IIIDticksize,\rB)%
+ \pstPlanePut[plane=\psk@IIIDzTicksPlane](0,\psk@IIIDzticksep,\rB){\psxyzlabel{\rA}}%
+ }%
+ \pst@dimz=\psk@ThreeDplot@zMin\p@%
+ \pst@dima=\psk@ThreeDplot@zThreeDunit\p@%
+ \divide\pst@dimz by \pst@dima%
+ \ifnum\psk@ThreeDplot@zMin<\z@\pst@cntz=-\number\pst@dimz%
+ \else\pst@cntz=\number\pst@dimz%
+ \fi%
+ \multido{\rA=-\psk@Dz+-\psk@Dz,%
+ \rB=-\psk@ThreeDplot@zThreeDunit+-\psk@ThreeDplot@zThreeDunit}{\pst@cntz}{%
+ \pstThreeDLine[arrows=-](0,-\psk@IIIDticksize,\rB)(0,\psk@IIIDticksize,\rB)%
+ \pstPlanePut[plane=\psk@IIIDzTicksPlane](0,\psk@IIIDzticksep,\rB){\psxyzlabel{\rA}}%
+ }%
+ \fi\fi%
+ \endgroup\ignorespaces%
+}
+%
+% planeGrids
+%
+\newdimen\pst@dx\newdimen\pst@dy
+\def\pstThreeDPlaneGrid{\pst@object{pstThreeDPlaneGrid}}
+\def\pstThreeDPlaneGrid@i(#1,#2)(#3,#4){{%
+ \pst@killglue
+ \use@par
+ \pssetxlength\pst@dima{#1}
+ \pssetxlength\pst@dimb{#3}
+ \advance\pst@dimb by -\pst@dima
+ \divide\pst@dimb by \psk@xsubticks
+ \pst@dx=\pst@dimb
+%
+ \pssetylength\pst@dima{#2}
+ \pssetylength\pst@dimb{#4}
+ \advance\pst@dimb by -\pst@dima
+ \divide\pst@dimb by \psk@ysubticks
+ \pst@dy=\pst@dimb
+%
+ \pssetylength\pst@dimx{#2}
+ \pssetylength\pst@dimy{#4}
+ \pssetylength\pst@dimz{#1}
+ \pssetylength\pst@dimf{#3}
+ \pst@getlength\psk@planeGridOffset\pst@dima
+ \pst@cntx=\psk@xsubticks\advance\pst@cntx by \@ne
+ \pst@cnty=\psk@ysubticks\advance\pst@cnty by \@ne
+ \psset{unit=1pt,planeGridOffset=\pst@dima}% we need everything in pt
+ \ifx\psk@planeGrid\ThreeDplot@planeXY
+ \multido{\rA=#1+\strip@pt\pst@dx}{\pst@cntx}{%
+ \pstThreeDLine(\rA,\strip@pt\pst@dimx,\psk@planeGridOffset)%
+ (\rA,\strip@pt\pst@dimy,\psk@planeGridOffset)}
+ \multido{\rA=#2+\strip@pt\pst@dy}{\pst@cnty}{%
+ \pstThreeDLine(\strip@pt\pst@dimz,\rA,\psk@planeGridOffset)%
+ (\strip@pt\pst@dimf,\rA,\psk@planeGridOffset)}
+ \else
+ \ifx\psk@planeGrid\ThreeDplot@planeXZ
+ \multido{\rA=#1+\strip@pt\pst@dx}{\pst@cntx}{%
+ \pstThreeDLine(\rA,\psk@planeGridOffset,\strip@pt\pst@dimx)%
+ (\rA,\psk@planeGridOffset,\strip@pt\pst@dimy)}
+ \multido{\rA=#2+\strip@pt\pst@dy}{\pst@cnty}{%
+ \pstThreeDLine(\strip@pt\pst@dimz,\psk@planeGridOffset,\rA)%
+ (\strip@pt\pst@dimf,\psk@planeGridOffset,\rA)}
+ \else
+ \multido{\rA=#1+\strip@pt\pst@dx}{\pst@cntx}{%
+ \pstThreeDLine(\psk@planeGridOffset,\rA,\strip@pt\pst@dimx)%
+ (\psk@planeGridOffset,\rA,\strip@pt\pst@dimy)}
+ \multido{\rA=#2+\strip@pt\pst@dy}{\pst@cnty}{%
+ \pstThreeDLine(\psk@planeGridOffset,\strip@pt\pst@dimz,\rA)%
+ (\psk@planeGridOffset,\strip@pt\pst@dimf,\rA)}
+ \fi
+ \fi%
+}\ignorespaces}
+%
+% put anything at (#2,#3,#4)
+%
+\def\pstThreeDPut{\@ifnextchar[{\pst@ThreeDPut}{\pst@ThreeDPut[]}}
+\def\pst@ThreeDPut[#1](#2,#3,#4)#5{{%
+ \pst@killglue%
+ \psset{#1}%
+ \pstThreeDNode(#2,#3,#4){temp@pstNode}%
+% \def\@tempa{c}
+% \ifx\pst@ThreeDplot@pOrigin\@tempa%
+% \rput(temp@pstNode){#5}%
+% \else%
+ \rput[\psk@ThreeDplot@pOrigin](temp@pstNode){#5}%
+% \fi%
+}\ignorespaces}
+%
+% draws a 3d line
+%
+\def\cartesianIIID@coor#1,#2,#3,#4\@nil{\edef\pst@coor{#1 #2 #3 }}
+\def\NormalIIIDCoor{%
+ \def\pst@@getcoor##1{\pst@expandafter\cartesianIIID@coor{##1}, ,\@nil}%
+ \def\pst@@getangle##1{%
+ \pst@checknum{##1}\pst@angle%
+ \edef\pst@angle{\pst@angle \pst@angleunit}%
+ }%
+ \def\psput@##1{\pst@@getcoor{##1}\leavevmode\psput@cartesian}%
+}%
+
+\def\pstThreeDLine{\NormalIIIDCoor\pst@object{lineIIID}}
+\def\lineIIID@i{%
+ \pst@killglue%
+ \pst@getarrows{%
+ \begin@OpenObj%
+ \pst@getcoors[\lineIIID@ii%
+ }%
+}
+\def\lineIIID@ii{%
+ \addto@pscode{%
+ \pst@3ddict
+ \variablesIIID
+ /dxUnit \psk@ThreeDplot@xThreeDunit\space def
+ /dyUnit \psk@ThreeDplot@yThreeDunit\space def
+ /dzUnit \psk@ThreeDplot@zThreeDunit\space def
+ \ifPst@SphericalCoor /SphericalCoor true def
+ \else /SphericalCoor false def
+ \fi %
+ /xUnit { \pst@number\psxunit\space mul } def
+ /yUnit { \pst@number\psyunit\space mul } def
+ convertStackTo2D
+ end
+ \pst@cp\space \psline@iii\space \tx@Line
+ }%
+ \end@OpenObj%
+ \SpecialCoor%
+ \ignorespaces
+}
+%
+% set a 3d dot
+%
+\def\pstThreeDDot{\@ifnextchar[{\pst@ThreeDDot}{\pst@ThreeDDot[]}}
+\def\pst@ThreeDDot[#1](#2,#3,#4){{%
+ \pst@killglue
+ \psset{linestyle=dashed,linewidth=0.5pt}% default
+ \psset{#1}%
+ \pstThreeDNode[#1](#2,#3,#4){A}%
+ \ifx\psk@dotstyle\@none\else\psdots(A)\fi%
+ \ifPst@drawCoor%
+ \addto@pscode{
+ \pst@3ddict
+ \variablesIIID
+ \ifPst@SphericalCoor
+ #2\space #3\space #4\space
+ ConvertToCartesian
+ \else
+ /x #2\space\psk@ThreeDplot@xThreeDunit\space mul def
+ /y #3\space\psk@ThreeDplot@yThreeDunit\space mul def
+ /z #4\space\psk@ThreeDplot@zThreeDunit\space mul def
+ \fi
+ ConvertTo2D
+ x2D \pst@number\psxunit\space mul
+ y2D \pst@number\psyunit\space mul
+ moveto /RotX 0 def /RotY 0 def /RotZ 0 def
+ /z 0 def
+ ConvertTo2D /x2DOld x2D def /y2DOld y2D def
+ x2D \pst@number\psxunit\space mul
+ y2D \pst@number\psyunit\space mul
+ lineto
+ /y@i y def /y 0 def
+ ConvertTo2D
+ x2D \pst@number\psxunit\space mul
+ y2D \pst@number\psyunit\space mul
+ lineto
+ x2DOld \pst@number\psxunit\space mul
+ y2DOld \pst@number\psyunit\space mul
+ moveto
+ /y y@i def /x 0 def
+ ConvertTo2D
+ x2D \pst@number\psxunit\space mul
+ y2D \pst@number\psyunit\space mul
+ lineto
+ \ifx\pslinestyle\@none\else
+ gsave
+ \pst@number\pslinewidth SLW
+ \pst@usecolor\pslinecolor
+ \@nameuse{psls@\pslinestyle}
+ grestore
+ \fi
+ end
+ }%
+ \use@pscode%
+ \fi%
+}\ignorespaces}
+%
+% transform the 3d coordinates of the node (#1,#2,#3)
+% into a 2d node with the name #4
+%
+\def\pstThreeDNode{\@ifnextchar[{\pst@ThreeDNode}{\pst@ThreeDNode[]}}
+\def\pst@ThreeDNode[#1](#2,#3,#4)#5{{%
+ \psset{#1}%
+ \pnode(!%
+ \pst@3ddict
+ \variablesIIID
+ \ifPst@SphericalCoor
+ #2\space #3\space #4\space
+ ConvertToCartesian
+ \else
+ /x #2\space\psk@ThreeDplot@xThreeDunit\space mul def
+ /y #3\space\psk@ThreeDplot@yThreeDunit\space mul def
+ /z #4\space\psk@ThreeDplot@zThreeDunit\space mul def
+ \fi
+ ConvertTo2D x2D y2D end ){#5}%
+}\ignorespaces}
+%
+% a 3d uput[](){}
+%
+\def\pstUThreeDPut{\@ifnextchar[{\pst@UThreeDPut}{\pst@UThreeDPut[]}}
+\def\pst@UThreeDPut[#1](#2,#3,#4)#5{{%
+ \uput[#1](!%
+ \pst@3ddict
+ \variablesIIID
+ \ifPst@SphericalCoor
+ #2\space #3\space #4\space
+ ConvertToCartesian
+ \else
+ /x #2\space\psk@ThreeDplot@xThreeDunit\space mul def
+ /y #3\space\psk@ThreeDplot@yThreeDunit\space mul def
+ /z #4\space\psk@ThreeDplot@zThreeDunit\space mul def
+ \fi
+ ConvertTo2D x2D y2D
+ end ){#5}%
+}\ignorespaces}
+%
+% Trangle [options](Point1)(Point2)(Point3)
+%
+\def\pstThreeDTriangle{\@ifnextchar[%
+ {\do@ThreeDTriangle}%
+ {\do@ThreeDTriangle[]}%
+}
+\def\do@ThreeDTriangle[#1](#2)(#3)(#4){{%
+ \ifx#1\empty\else\psset{#1}\fi%
+ \ifPst@drawCoor%
+ \pstThreeDDot[drawCoor=true](#2)%
+ \pstThreeDDot[drawCoor=true](#3)%
+ \pstThreeDDot[drawCoor=true](#4)%
+ \fi%
+ \pstThreeDNode(#2){A}%
+ \pstThreeDNode(#3){B}%
+ \pstThreeDNode(#4){C}%
+ \ifx\psk@fillstyle\@none%
+ \else%
+ \pscustom{%
+ \code{\psk@ThreeDplot@linejoin\space setlinejoin}%
+ \fi%
+ \psline[#1](A)(B)(C)(A)(B)%
+ \ifx\psk@fillstyle\@none\else}\fi%
+}\ignorespaces}
+%
+% draws a threeD square as a polygon
+%
+% [#1] options
+% (#2) starting vector ax,ay,az
+% (#3) first direction vector ux,uy,uz
+% (#4) second direction vector wx,wy,wz
+%
+\def\pstThreeDSquare{\pst@object{squareIIID}}
+\def\squareIIID@i{\squareIIID@ii}
+\def\squareIIID@ii(#1)(#2)(#3){%
+ \ifPst@drawCoor%
+ {%
+ \psset{linestyle=dashed,linewidth=0.5pt}%
+ \pstThreeDDot(#1)%
+ \pst@addThreeDVec(#1)(#2)\pst@tempa\pst@tempb\pst@tempc%
+ \pstThreeDDot(\pst@tempa,\pst@tempb,\pst@tempc)%
+ \pst@addThreeDVec(#1)(#3)\pst@tempa\pst@tempb\pst@tempc
+ \pstThreeDDot(\pst@tempa,\pst@tempb,\pst@tempc)%
+ \pst@addThreeDVec(\pst@tempa,\pst@tempb,\pst@tempc)%
+ (#2)\pst@tempa\pst@tempb\pst@tempc%
+ \pstThreeDDot(\pst@tempa,\pst@tempb,\pst@tempc)%
+ }%
+ \fi%
+ \getThreeDCoor{#1}\pst@tempa%
+ \getThreeDCoor{#2}\pst@tempb%
+ \getThreeDCoor{#3}\pst@tempc%
+ \begin@OpenObj
+ \addto@pscode{%
+ \pst@3ddict
+ \variablesIIID
+ /P1 { \pst@tempa\space } def % x y z or Radius longitude lattitude
+ /P2 { \pst@tempb\space } def %
+ /P3 { \pst@tempc\space } def %
+ /SphericalCoor \ifPst@SphericalCoor true \else false \fi def %
+ /xUnit { \pst@number\psxunit\space mul } def
+ /yUnit { \pst@number\psyunit\space mul } def
+ P1 saveCoor
+ SphericalCoor { ConvertToCartesian } if
+ ConvertTo2D
+ /x0 x2D xUnit def /y0 y2D yUnit def
+ P2 saveCoor
+ SphericalCoor { ConvertToCartesian } if
+ ConvertTo2D
+ /x1 x2D xUnit x0 add def /y1 y2D yUnit y0 add def
+ P3 saveCoor
+ SphericalCoor { ConvertToCartesian } if
+ ConvertTo2D
+ /x2 x2D xUnit x1 add def /y2 y2D yUnit y1 add def
+ P2 saveCoor
+ SphericalCoor { ConvertToCartesian } if
+ ConvertTo2D
+ /x3 x2D xUnit neg x2 add def /y3 y2D yUnit neg y2 add def
+ [ x0 y0 x1 y1 x2 y2 x3 y3 x0 y0
+ \pst@cp\space \psline@iii\space \tx@Line\space
+ end
+ }%
+ \end@OpenObj%
+}
+
+%
+% draws a threeD Box
+% [#1] options
+% (#2) first direction vector ux,uy,uz
+% (#3) second direction vector vx,vy,vz
+% (#4) third direction vector wx,wy,wz
+%
+\def\pstThreeDBox{\@ifnextchar[{\pstThreeDBox@i}{\pstThreeDBox@i[]}}
+\def\pstThreeDBox@i[#1](#2)(#3)(#4)(#5){%
+ \pst@killglue%
+ \begingroup%
+ \psset{linestyle=\psk@ThreeDplot@invisibleLineStyle}%
+ \psset{#1}%
+ \pstVerb{
+ \pst@3ddict
+ \variablesIIID
+ end
+ }%
+ \pstThreeDSquare[#1](#2)(#4)(#5) % lower square
+ \pstThreeDSquare(#2)(#3)(#4)% back square
+%
+ \psset{linestyle=\psk@ThreeDplot@visibleLineStyle}%
+ \pst@addThreeDVec(#2)(#4)\pst@tempa\pst@tempb\pst@tempc
+ \pstThreeDSquare[#1](\pst@tempa,\pst@tempb,\pst@tempc)(#3)(#5)% left square
+ \pst@addThreeDVec(#2)(#3)\pst@tempa\pst@tempb\pst@tempc
+ \pstThreeDSquare[#1](\pst@tempa,\pst@tempb,\pst@tempc)(#4)(#5)% top square
+ \pst@addThreeDVec(#2)(#5)\pst@tempa\pst@tempb\pst@tempc
+ \pstThreeDSquare[#1](\pst@tempa,\pst@tempb,\pst@tempc)(#3)(#4)% front square
+ \endgroup%
+ \ignorespaces%
+}
+%
+% Sphere
+%
+\def\pstThreeDSphere{\@ifnextchar[{\pst@ThreeDSphere}{\pst@ThreeDSphere[]}}
+\def\pst@ThreeDSphere[#1](#2,#3,#4)#5{{%
+ \psset{THETA=\psk@ThreeDplot@Beta,PHI=\psk@ThreeDplot@Beta,Dobs=10,Decran=10}%
+ \psset{#1}%
+ \pstThreeDNode(#2,#3,#4){SphereCenter}%
+ \rput(SphereCenter){\SphereThreeD(0,0,0){#5}}%
+}\ignorespaces}
+%
+% set a 3d ellipse/circle
+%
+% #1 options
+% #2 center cx,cy,cz
+% #3 radius ax,ay,az
+% #4 radius bx,by,bz
+%
+\def\pstThreeDEllipse{\pst@object{pstThreeDEllipse}}
+\def\pstThreeDEllipse@i(#1)(#2)(#3){%
+ \addbefore@par{plotstyle=curve}%
+ \@nameuse{beginplot@\psplotstyle}%
+ \getThreeDCoor{#1}\pst@tempc% center
+ \getThreeDCoor{#2}\pst@tempa% a
+ \getThreeDCoor{#3}\pst@tempb% b
+ \addto@pscode{%
+ \pst@3ddict \variablesIIID end
+ \ifPst@SphericalCoor
+ \pst@tempc\space \tx@ConvertToCartesian
+ /zM \tx@Z def /yM \tx@Y def /xM \tx@X def % center
+ \pst@tempa\space \tx@ConvertToCartesian
+ /zA \tx@Z def /yA \tx@Y def /xA \tx@X def % a
+ \pst@tempb\space \tx@ConvertToCartesian
+ /zB \tx@Z def /yB \tx@Y def /xB \tx@X def % b
+ \else
+ \pst@tempc\space /zM exch def /yM exch def /xM exch def % center
+ \pst@tempa\space /zA exch def /yA exch def /xA exch def % a
+ \pst@tempb\space /zB exch def /yB exch def /xB exch def % b
+ \fi
+ /aStart \psk@ThreeDplot@beginAngle\space def
+ /aEnd \psk@ThreeDplot@endAngle\space dup aStart lt { 360 add } if def
+ /da aEnd aStart sub \psk@plotpoints\space div abs def
+ /xyz {
+ xM xA angle cos mul add xB angle sin mul add
+ yM yA angle cos mul add yB angle sin mul add
+ zM zA angle cos mul add zB angle sin mul add
+ \pst@3ddict saveCoor ConvertTo2D
+ x2D \pst@number\psxunit mul y2D \pst@number\psyunit mul end
+ } def
+ /angle aStart def
+ }%
+ \gdef\psplot@init{}%
+ \@pstfalse%
+ \@nameuse{testqp@\psplotstyle}%
+ \if@pst\pstThreeDEllipse@ii\else\pstThreeDEllipse@iii\fi%
+ \ignorespaces}
+%
+\def\pstThreeDEllipse@ii{%
+ \addto@pscode{%
+ xyz \@nameuse{beginqp@\psplotstyle}
+ \psk@plotpoints 1 sub {
+ /angle angle da add def
+ xyz \@nameuse{doqp@\psplotstyle}
+ } repeat
+ /angle aEnd def
+ xyz \@nameuse{doqp@\psplotstyle}}%
+ \@nameuse{endqp@\psplotstyle}}
+
+\def\pstThreeDEllipse@iii{%
+ \addto@pscode{%
+ mark
+ /n 2 def
+ \psk@plotpoints {
+ xyz
+ n 2 roll
+ /n n 2 add def
+ /angle angle da add def
+ } repeat
+ /angle aEnd def
+ xyz
+ n 2 roll}%
+ \@nameuse{endplot@\psplotstyle}}
+%
+\def\pstThreeDCircle{\pstThreeDEllipse}
+\def\pstThreeDPlotFunc{\psplotThreeD}% only for compatibility
+%
+\def\pstRotNodeIIID{\pst@object{RotNodeIIID}}
+\def\RotNodeIIID@i(#1,#2,#3)(#4,#5,#6)#7{%
+ \pst@killglue
+ \begingroup%
+ \use@par%
+ \def\pst@ThreeDplot@ThetaX{#4}% rotating angle
+ \def\pst@ThreeDplot@ThetaY{#5}% rotating angle
+ \def\pst@ThreeDplot@ThetaZ{#6}% rotating angle
+ \pnode(!%
+ \pst@3ddict
+ \variablesIIID
+ \ifPst@SphericalCoor
+ #1\space #2\space #3\space
+ ConvertToCartesian
+ \else
+ /x #1\space\psk@ThreeDplot@xThreeDunit\space mul def
+ /y #2\space\psk@ThreeDplot@yThreeDunit\space mul def
+ /z #3\space\psk@ThreeDplot@zThreeDunit\space mul def
+ \fi
+ ConvertTo2D x2D y2D
+ end ){#7}%
+ \endgroup%
+ \ignorespaces}
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+\def\psplotinit#1{\xdef\psplot@init{#1 }}
+\def\psplot@init{}
+%
+%\def\psplotThreeD{\@ifnextchar[{\ps@plotThreeD}{\ps@plotThreeD[]}}
+\def\psplotThreeD{\def\pst@par{}\pst@object{psplotThreeD}}
+\def\psplotThreeD@i(#1,#2)(#3,#4)#5{{%
+ \pst@killglue
+ \use@par%
+ \ifcase\psk@ThreeDplot@drawStyle%
+ \psplotThreeD@xLines(#1,#2)(#3,#4){#5}\or%
+ \psplotThreeD@yLines(#1,#2)(#3,#4){#5}\or
+ \psplotThreeD@xLines(#1,#2)(#3,#4){#5}%
+ \psplotThreeD@yLines(#1,#2)(#3,#4){#5}\or%
+ \psplotThreeD@yLines(#1,#2)(#3,#4){#5}%
+ \psplotThreeD@xLines(#1,#2)(#3,#4){#5}%
+ \fi%
+}\ignorespaces}
+%
+%\def\doPlotThreeD@xLines{\pst@object{psplotThreeD@xLines}}
+%\def\doPlotThreeD@yLines{\pst@object{psplotThreeD@yLines}}
+%
+\def\psplotThreeD@xLines(#1,#2)(#3,#4)#5{%
+ \pst@killglue%
+ \begingroup%
+% \use@par%
+ \@pstfalse%
+ \@nameuse{beginplot@\psplotstyle}%
+ \gdef\psplot@init{}%
+ \@nameuse{testqp@\psplotstyle}%
+ \if@pst% lines and dots
+ \addto@pscode{
+ \variablesIIID
+ /xMin #1 def
+ /x xMin def
+ /x1 #2 def
+ /y #3 def
+ /y1 #4 def
+ /dx x1 x sub \psk@ThreeDplot@xPlotpoints\space dup 0 gt {div}{pop} ifelse def
+ /dy y1 y sub \psk@ThreeDplot@yPlotpoints\space dup 0 gt {div}{pop} ifelse def
+ /func {#5} def
+ /xyz {
+ x neg Alpha cos mul y Alpha sin mul add \pst@number\psxunit mul
+ x Alpha sin mul y Alpha cos mul add neg Beta sin mul
+ func Beta cos mul add \pst@number\psyunit mul} def
+ }%
+ \psplotThreeD@xLines@ii
+ \else% curves
+ \endgroup%
+ \multido{\n@Y=0+1}{\psk@ThreeDplot@yPlotpoints}{%
+ \ifPst@hiddenLine\pscustom[style=hiddenStyle]{\fi%
+ \@nameuse{beginplot@\psplotstyle}%
+ \addto@pscode{
+ \variablesIIID
+ /xMin #1 def
+ /x xMin def
+ /x1 #2 def
+ /dx x1 x sub \psk@ThreeDplot@xPlotpoints\space dup 0 gt {div}{pop} ifelse def
+ /dy #4\space #3\space sub \psk@ThreeDplot@yPlotpoints\space dup 0 gt {div}{pop} ifelse def
+ /y #3\space \n@Y\space dy mul add def
+ /func {#5} def
+ /xyz {
+ x neg Alpha cos mul y Alpha sin mul add \pst@number\psxunit mul
+ x Alpha sin mul y Alpha cos mul add neg Beta sin mul
+ func Beta cos mul add \pst@number\psyunit mul} def
+ }%
+ \psplotThreeD@xLines@iii%
+ \ifPst@hiddenLine }\fi%
+ }%
+ \fi%
+ \endgroup%
+ \ignorespaces%
+}
+%
+\def\psplotThreeD@xLines@ii{%
+ \addto@pscode{%
+ xyz \@nameuse{beginqp@\psplotstyle}
+ \psk@ThreeDplot@yPlotpoints\space 1 add {
+ /x xMin def
+ xyz moveto
+ \psk@ThreeDplot@xPlotpoints\space 1 add {
+ xyz \@nameuse{doqp@\psplotstyle}
+ /x x dx add def
+ } repeat
+ /y y dy add def
+ } repeat
+ /x x1 def
+ /y y1 def
+ xyz \@nameuse{doqp@\psplotstyle}
+ }%
+ \@nameuse{endqp@\psplotstyle}%
+}
+\def\psplotThreeD@xLines@iii{% curves
+ \addto@pscode{%
+ /x xMin def
+ mark
+ /n 2 def
+ \psk@ThreeDplot@xPlotpoints {
+ xyz
+ n 2 roll
+ /n n 2 add def
+ /x x dx add def
+ } repeat
+ /x x1 def
+ xyz
+ n 2 roll
+ }%
+ \@nameuse{endplot@\psplotstyle}%
+}
+%
+\def\psplotThreeD@yLines(#1,#2)(#3,#4)#5{%
+ \pst@killglue
+ \begingroup
+% \use@par%
+ \@pstfalse
+ \@nameuse{beginplot@\psplotstyle}%
+ \gdef\psplot@init{}%
+ \@nameuse{testqp@\psplotstyle}%
+ \if@pst% lines and dots
+ \addto@pscode{%
+ \variablesIIID
+ /x #1 def
+ /x1 #2 def
+ /yMin #3 def
+ /y yMin def
+ /y1 #4 def
+ /dx x1 x sub \psk@ThreeDplot@xPlotpoints\space dup 0 gt {div}{pop} ifelse def
+ /dy y1 y sub \psk@ThreeDplot@yPlotpoints\space dup 0 gt {div}{pop} ifelse def
+ /func {#5} def
+ /xyz {
+ x neg Alpha cos mul y Alpha sin mul add \pst@number\psxunit mul
+ x Alpha sin mul y Alpha cos mul add neg Beta sin mul
+ func Beta cos mul add \pst@number\psyunit mul} def
+ }%
+ \psplotThreeD@yLines@ii
+ \else% curves
+ \endgroup
+ \multido{\n@X=0+1}{\psk@ThreeDplot@xPlotpoints}{%
+ \ifPst@hiddenLine\pscustom[style=hiddenStyle]{\fi
+ \@nameuse{beginplot@\psplotstyle}%
+ \addto@pscode{%
+ \variablesIIID
+ /yMin #3 def
+ /y yMin def
+ /y1 #4 def
+ /dy y1 y sub \psk@ThreeDplot@yPlotpoints\space dup 0 gt {div}{pop} ifelse def
+ /dx #2\space #1\space sub \psk@ThreeDplot@xPlotpoints\space dup 0 gt {div}{pop} ifelse def
+ /x #1\space \n@X\space dx mul add def
+ /func {#5} def
+ /xyz {
+ x neg Alpha cos mul y Alpha sin mul add \pst@number\psxunit mul
+ x Alpha sin mul y Alpha cos mul add neg Beta sin mul
+ func Beta cos mul add \pst@number\psyunit mul} def
+ }%
+ \psplotThreeD@yLines@iii%
+ \ifPst@hiddenLine }\fi%
+ }%
+ \fi
+ \endgroup
+ \ignorespaces%
+}
+\def\psplotThreeD@yLines@ii{%
+ \addto@pscode{%
+ xyz \@nameuse{beginqp@\psplotstyle}
+ \psk@ThreeDplot@xPlotpoints\space 1 add {
+ /y yMin def
+ xyz moveto
+ \psk@ThreeDplot@yPlotpoints\space 1 add {
+ xyz \@nameuse{doqp@\psplotstyle}
+ /y y dy add def
+ } repeat
+ /x x dx add def
+ } repeat
+ /x x1 def
+ /y y1 def
+ xyz \@nameuse{doqp@\psplotstyle}
+ }%
+ \@nameuse{endqp@\psplotstyle}%
+}
+\def\psplotThreeD@yLines@iii{% curves
+ \addto@pscode{%
+ /y yMin def
+ mark
+ /n 2 def
+ \psk@ThreeDplot@yPlotpoints {
+ xyz
+ n 2 roll
+ /n n 2 add def
+ /y y dy add def
+ } repeat
+ /y y1 def
+ xyz
+ n 2 roll
+ }%
+ \@nameuse{endplot@\psplotstyle}%
+}
+%
+% parametricplot ----------------------------------------------------------------
+%
+\def\parametricplotThreeD{\def\pst@par{}\pst@object{parametricPlotThreeD}}
+\def\parametricPlotThreeD@i(#1){%
+ \@ifnextchar({\parametricPlotThreeD@ii(#1)}{\parametricPlotThreeD@ii(#1)(0,0)}%
+}
+\def\parametricPlotThreeD@ii(#1,#2)(#3,#4)#5{{%
+ \pst@killglue%
+ \use@par%
+ \@pstfalse%
+ \@nameuse{beginplot@\psplotstyle}%
+ \@nameuse{testqp@\psplotstyle}% quick plot or something special
+ \pstVerb{%
+ /3D2DConv {
+ 3 -1 roll % y z x
+ \psk@ThreeDplot@xThreeDunit\space mul
+ dup % y z x x
+ neg Alpha cos mul % y z x (x)
+ 4 -1 roll % z x (x) y
+ \psk@ThreeDplot@yThreeDunit\space mul
+ dup % z x (x) y y
+ 5 1 roll % y z x (x) y
+ Alpha sin mul add \pst@number\psxunit mul % y z x (x2)
+ 4 1 roll % (x2) y z x
+ Alpha sin mul % (x2) y z (x)
+ 3 -1 roll % (x2) z (x) y
+ Alpha cos mul add neg Beta sin mul % (x2) z (x)
+ exch % (x2) (x) z
+ \psk@ThreeDplot@zThreeDunit\space mul
+ Beta cos mul add \pst@number\psyunit mul % (x2) (y2)
+ } def
+ }%
+ \if@pst%
+ \def\pslinetype{0}%
+ \addto@pscode{%
+ \variablesIIID
+ /tMin #1 def
+ /t tMin def
+ /t1 #2 def
+ /u #3 def
+ /u1 #4 def
+ /dt t1 t sub \psk@ThreeDplot@xPlotpoints\space dup 1 gt %
+ { 1 sub div }{ pop pop 0 } ifelse def % step for t
+ /du u1 u sub \psk@ThreeDplot@yPlotpoints\space dup 1 gt %
+ { 1 sub div }{ pop pop 0 } ifelse def % step for u
+ /xyz { #5 3D2DConv } def
+ }%
+ \parametricPlotThreeD@iii%
+ \else%
+ \def\pslinetype{-3}%
+ \endgroup%
+ \pst@dima=#3pt\pst@dimb=#4pt
+ \ifdim\pst@dima=\pst@dimb\psset{yPlotpoints=1}\fi% #3=#4 ??
+ \multido{\n@Y=0+1}{\psk@ThreeDplot@yPlotpoints}{%
+ \@nameuse{beginplot@\psplotstyle}%
+ \addto@pscode{%
+ \variablesIIID
+ /tMin #1 def
+ /t tMin def
+ /t1 #2 def
+ /u1 #2 def
+ /dt t1 t sub \psk@ThreeDplot@xPlotpoints\space dup 1 gt %
+ { 1 sub div }{ pop pop 0 } ifelse def % step for t
+ /du #4\space #3\space sub \psk@ThreeDplot@yPlotpoints\space dup 1 gt %
+ { 1 sub div }{ pop pop 0 } ifelse def % step for t
+ /u #3\space \n@Y\space du mul add def
+ /xyz { #5 3D2DConv } def
+ }%
+ \parametricPlotThreeD@iv%
+ }%
+ \fi%
+}\ignorespaces}
+\def\parametricPlotThreeD@iii{% without arrows (quickplot)
+ \addto@pscode{%
+ \psk@ThreeDplot@yPlotpoints\space {
+ /t tMin def
+ xyz \@nameuse{beginqp@\psplotstyle}
+ \psk@ThreeDplot@xPlotpoints {
+ xyz \@nameuse{doqp@\psplotstyle}
+ /t t dt add def
+ } repeat
+ /u u du add def
+ } repeat
+ }%
+ \@nameuse{endqp@\psplotstyle}%
+}
+\def\parametricPlotThreeD@iv{% with arrows or curve
+ \addto@pscode{%
+% /t tMin def
+ mark
+ /n 0 def
+ \psk@ThreeDplot@xPlotpoints\space {
+ xyz
+ /n n 2 add def
+ n 2 roll
+ /t t dt add def
+ } repeat
+% /t t1 def
+% /u u1 def
+% xyz
+% n 2 roll
+ }%
+ \@nameuse{endplot@\psplotstyle}%
+}
+%
+% Plot 3D data
+%
+\def\fileplotThreeD{\def\pst@par{}\pst@object{fileplotThreeD}}
+\def\fileplotThreeD@i#1{%
+ \pst@killglue%
+ \begingroup%
+ \use@par%
+ \@pstfalse%
+ \@nameuse{testqp@\psplotstyle}%%
+ \if@pst
+ \dataplotThreeD@ii{\pst@readfile{#1}}%
+ \else
+ \listplotThreeD@ii{\pst@altreadfile{#1}}%
+ \fi
+ \endgroup%
+ \ignorespaces%
+}
+%
+% dataplot
+%
+\def\dataplotThreeD{\def\pst@par{}\pst@object{dataplotThreeD}}
+\def\dataplotThreeD@i#1{%
+ \pst@killglue
+ \begingroup
+ \use@par
+ \@pstfalse
+ \@nameuse{testqp@\psplotstyle}%
+ \if@pst
+ \dataplotThreeD@ii{\addto@pscode{#1}}%
+ \else
+ \listplot@ii{\addto@pscode{#1}}%
+ \fi
+ \endgroup
+ \ignorespaces%
+}
+\def\dataplotThreeD@ii#1{%
+ \@nameuse{beginplot@\psplotstyle}%
+ \addto@pscode{%
+ \variablesIIID
+ /Dx { /D { Dy } def } def
+ /Dy { /D { Dz } def } def
+ /Dz { % now we have x y z
+ 3 -1 roll % y z x
+ \psk@ThreeDplot@xThreeDunit\space div
+ dup % y z x x
+ neg Alpha cos mul % y z x (x)
+ 4 -1 roll % z x (x) y
+ \psk@ThreeDplot@yThreeDunit\space div
+ dup % z x (x) y y
+ 5 1 roll % y z x (x) y
+ Alpha sin mul add \pst@number\psxunit mul % y z x (x2)
+ 4 1 roll % (x2) y z x
+ Alpha sin mul % (x2) y z (x)
+ 3 -1 roll % (x2) z (x) y
+ Alpha cos mul add neg Beta sin mul % (x2) z (x)
+ exch % (x2) (x) z
+ \psk@ThreeDplot@zThreeDunit\space div
+ Beta cos mul add \pst@number\psyunit mul % (x2) (y2)
+ Do /D { Dx } def } def
+ /D { /D { Dx } def } def
+ /Do {
+ \@nameuse{beginqp@\psplotstyle}%
+ /Do { \@nameuse{doqp@\psplotstyle}} def
+ } def}%
+ #1%
+ \addto@pscode{D}%
+ \@nameuse{endqp@\psplotstyle}%
+}
+%
+%
+\pst@def{ScalePointsThreeD}<%
+ counttomark dup dup cvi eq not { exch pop } if
+ /m exch def /n m 3 div cvi def
+ n { % now we have x y z
+ 3 -1 roll % y z x
+ \psk@ThreeDplot@xThreeDunit\space div
+ dup % y z x x
+ neg Alpha cos mul % y z x (x)
+ 4 -1 roll % z x (x) y
+ \psk@ThreeDplot@yThreeDunit\space div
+ dup % z x (x) y y
+ 5 1 roll % y z x (x) y
+ Alpha sin mul add \pst@number\psxunit mul % y z x (x2)
+ 4 1 roll % (x2) y z x
+ Alpha sin mul % (x2) y z (x)
+ 3 -1 roll % (x2) z (x) y
+ Alpha cos mul add neg Beta sin mul % (x2) z (x)
+ exch % (x2) (x) z
+ \psk@ThreeDplot@zThreeDunit\space div
+ Beta cos mul add \pst@number\psyunit mul % (x2) (y2)
+ m 1 sub 1 roll m 1 sub 1 roll /m m 3 sub def } repeat>
+%
+% listplotThreeD
+%
+\def\listplotThreeD{\def\pst@par{}\pst@object{listplotThreeD}}
+\def\listplotThreeD@i#1{\listplotThreeD@ii{\addto@pscode{#1}}}
+\def\listplotThreeD@ii#1{%
+ \@nameuse{beginplot@\psplotstyle}%
+ \addto@pscode{%
+ \variablesIIID
+ /D {} def mark %
+ }%
+ #1%
+ \addto@pscode{\tx@ScalePointsThreeD}%
+ \@nameuse{endplot@\psplotstyle}%
+}
+%
+% adopted from pst-3d
+%
+\pst@def{TMSave}<%
+ tx@Dict /TMatrix known not { /TMatrix { } def /RAngle { 0 } def } if
+ /TMatrix [ TMatrix CM ] cvx def>
+%
+\pst@def{TMRestore}<%
+ CP /TMatrix [ TMatrix setmatrix ] cvx def moveto>
+%
+\pst@def{TMChange}<%
+ \tx@TMSave
+ /cp [ currentpoint ] cvx def
+ CM
+ CP T \tx@STV
+ CM matrix invertmatrix
+ matrix concatmatrix
+ exch exec
+ concat cp moveto>
+%
+\def\pstPlanePut{\@ifnextchar[{\pst@PlanePut}{\pst@PlanePut[]}}
+\def\pst@PlanePut[#1](#2)#3{{%
+ \pst@killglue%
+ \psset{pOrigin=lB}%
+ \psset{#1}%
+ \pstThreeDPut[#1](#2){\ps@Plane{#3}}%
+}}
+%
+\def\ps@Plane{\pst@makebox{\psPlane@}}
+\def\psPlane@{%
+ \begingroup
+ \leavevmode%
+ \hbox{%
+% \kern\wd\pst@hbox%
+ \pst@Verb{%
+ { [ 1 0
+ \variablesIIID
+%
+% ### begin Torsten Suhling
+% ------------------------------------------------------------------------
+% ===================================================================
+% How should 'Alpha' be for planes, if real Alpha and Beta are:
+% Alpha Beta xy xy (par. y-axis) yz xz
+% -------------------------------------------------------------------
+% 75 > 0[1] 180 + Alpha 90 + Alpha Alpha Alpha + 180
+% 165 > 0 Alpha 90 + Alpha Alpha Alpha
+% 255 > 0 Alpha 270 + Alpha Alpha + 180 Alpha
+% 345 > 0 180 + Alpha 270 + Alpha Alpha + 180 Alpha + 180
+% -------------------------------------------------------------------
+% 75 < 0 180 - Alpha 270 - Alpha Alpha Alpha + 180
+% 165 < 0 -Alpha 270 - Alpha Alpha Alpha
+%
+% 255 < 0 -Alpha 90 - Alpha Alpha + 180 Alpha
+%
+% 345 < 0 180 -Alpha 90 - Alpha Alpha + 180 Alpha + 180
+% ------------------------------------------------------------------
+% How should 'Beta' be for planes, if real Alpha and Beta are:
+% Alpha Beta xy xy (par. y-axis) yz xz
+% -------------------------------------------------------------------
+% 75 > 0 Beta Beta Beta[2] Beta
+% 165 > 0 Beta Beta Beta Beta
+% 255 > 0 Beta Beta Beta Beta
+% 345 > 0 Beta Beta Beta Beta
+% ...................................................................
+% 75 < 0 -Beta -Beta Beta Beta
+% 165 < 0 -Beta -Beta Beta Beta
+% 255 < 0 -Beta -Beta Beta Beta
+% 345 < 0 -Beta -Beta Beta Beta
+% ================================================================
+ \ifx\psk@ThreeDplot@planecorr\ThreeDplot@planecorrOff
+ /SignFlag 1 def
+ /AlphaOffset 0 def
+ \else%
+ \ifx\psk@ThreeDplot@plane\ThreeDplot@planeXY % XY-layer's tag
+ \ifx\psk@ThreeDplot@planecorr\ThreeDplot@planecorrXYrot % Tag written parallel y-axis
+ Beta sin 0 lt {/SignFlag -1}{/SignFlag 1}ifelse def
+ Alpha sin 0 gt {/AlphaOffset 180 -90 SignFlag mul add}
+ {/AlphaOffset 180 90 SignFlag mul add} ifelse def
+ \else% % Normal (par. x-axis)
+ Beta sin 0 gt {/SignFlag 1}{/SignFlag -1}ifelse def
+ Alpha cos 0 gt {/AlphaOffset 180}{/AlphaOffset 0}ifelse def
+ \fi%
+ \else % Vertical layers
+ \ifx\psk@ThreeDplot@plane\ThreeDplot@planeYZ % YZ-layer's tag
+ /SignFlag 1 def
+ Alpha sin 0 gt {/AlphaOffset 0}{/AlphaOffset 180}ifelse def
+ \else% % XZ-layer's tag
+ /SignFlag 1 def
+ Alpha cos 0 gt {/AlphaOffset 180}{/AlphaOffset 0}ifelse def
+ \fi% which vert. layer's tag
+ \fi% vert. or xy-layer's tag
+ \fi% planecorr or not
+% ------------------------------------------------------------------ Ende
+% ------------------------------------------------------------------------
+% ### Aenderung --> es werden die Operatoren SignFlag und AlphaOffset
+% eingefuegt
+% ------------------------------------------------------------------------
+% /Delta Beta sin Alpha sin mul Alpha cos atan neg 90 add def
+% /Gamma Beta sin Alpha cos mul neg Alpha sin atan def
+% ------------------------------------------------------------------------
+ /Delta Beta SignFlag mul sin Alpha SignFlag mul AlphaOffset add sin mul Alpha SignFlag mul AlphaOffset add cos atan neg 90 add def
+ /Gamma Beta SignFlag mul sin Alpha SignFlag mul AlphaOffset add cos mul neg Alpha SignFlag mul AlphaOffset add sin atan def
+% ------------------------------------------------------------------- Ende
+ \ifx\psk@ThreeDplot@plane\ThreeDplot@planeXY
+ 270 Delta sub rotate
+ /Rho 90 Gamma add Delta add def
+ \else%
+ \ifx\psk@ThreeDplot@plane\ThreeDplot@planeXZ
+ 270 Delta sub rotate
+ /Rho 180 Delta add def
+ \else%
+ Gamma rotate
+ /Rho 90 Gamma sub def
+ \fi%
+ \fi%
+ Rho cos Rho sin 0 0 ] concat} \tx@TMChange%
+ }%
+ \box\pst@hbox%
+ \pst@Verb{\tx@TMRestore}%
+% \kern\ht\pst@hbox%
+ }%
+ \endgroup%
+}
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Utility stuff
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% posStart=Starting point
+% length= Arrow length.
+\def\Arrows{\@ifnextchar[{\pst@Arrows}{\pst@Arrows[]}}
+\def\pst@Arrows[#1](#2)(#3){{%
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempa
+ \pst@getcoor{#3}\pst@tempb
+ \pnode(!%
+ /StartArrow \psk@ThreeDplot@posStart\space def
+ /LengthArrow \psk@ThreeDplot@length\space def
+ \pst@tempa /YA exch \pst@number\psyunit div def
+ /XA exch \pst@number\psxunit div def
+ \pst@tempb /YB exch \pst@number\psyunit div def
+ /XB exch \pst@number\psxunit div def
+ /denominateur XB XA sub def
+ /numerateur YB YA sub def
+ /angleDirectionAB numerateur denominateur Atan def
+ /XD StartArrow angleDirectionAB cos mul XA add def
+ /YD StartArrow angleDirectionAB sin mul YA add def
+ /XF XD LengthArrow angleDirectionAB cos mul add def
+ /YF YD LengthArrow angleDirectionAB sin mul add def
+ XD YD ){ArrowStart}
+ \pnode(! XF YF){ArrowEnd}
+ \psset{arrows=->}%
+ \psline[#1](ArrowStart)(ArrowEnd)%
+}\ignorespaces}
+%
+% draw a line (===) outside: #2-----#3=======#4
+%
+\def\psOutLine{\@ifnextchar[{\pst@ToDrawOut}{\pst@ToDrawOut[]}}
+\def\pst@ToDrawOut[#1](#2)(#3)#4{{%
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempa
+ \pst@getcoor{#3}\pst@tempb
+ \pnode(!%
+ /LengthArrow \psk@ThreeDplot@length\space def
+ \pst@tempa /YA exch \pst@number\psyunit div def
+ /XA exch \pst@number\psxunit div def
+ \pst@tempb /YB exch \pst@number\psyunit div def
+ /XB exch \pst@number\psxunit div def
+ /denominateur XB XA sub def
+ /numerateur YB YA sub def
+ /angleDirectionAB numerateur denominateur Atan def
+ /Xend XB LengthArrow angleDirectionAB cos mul add def
+ /Yend YB LengthArrow angleDirectionAB sin mul add def
+ Xend Yend){#4}
+ \psline[#1](#3)(#4)
+}\ignorespaces}
+%
+% draw a line (===) before: #4========#2-----#3
+%
+\def\psBeforeLine{\@ifnextchar[{\pst@BeforeLine}{\pst@BeforeLine[]}}
+\def\pst@BeforeLine[#1](#2)(#3)#4{{%
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempa
+ \pst@getcoor{#3}\pst@tempb
+ \pnode(!%
+ /LengthArrow \psk@ThreeDplot@length\space def
+ \pst@tempa /YA exch \pst@number\psyunit div def
+ /XA exch \pst@number\psxunit div def
+ \pst@tempb /YB exch \pst@number\psyunit div def
+ /XB exch \pst@number\psxunit div def
+ /denominateur XB XA sub def
+ /numerateur YB YA sub def
+ /angleDirectionAB numerateur denominateur Atan def
+ /Xstart XA LengthArrow angleDirectionAB cos mul sub def
+ /Ystart YA LengthArrow angleDirectionAB sin mul sub def
+ Xstart Ystart){#4}
+ \psline[#1](#4)(#2)%
+}\ignorespaces}
+%
+% intersection de deux droites
+% 2 juillet 2001/ rewritten 2003-01-27 Herbert
+%
+\def\ABinterCD(#1)(#2)(#3)(#4)#5{%
+ \pst@getcoor{#1}\pst@tempa
+ \pst@getcoor{#2}\pst@tempb
+ \pst@getcoor{#3}\pst@tempc
+ \pst@getcoor{#4}\pst@tempd
+\pnode(!%
+ /YA \pst@tempa exch pop \pst@number\psyunit div def
+ /XA \pst@tempa pop \pst@number\psxunit div def
+ /YB \pst@tempb exch pop \pst@number\psyunit div def
+ /XB \pst@tempb pop \pst@number\psxunit div def
+ /YC \pst@tempc exch pop \pst@number\psyunit div def
+ /XC \pst@tempc pop \pst@number\psxunit div def
+ /YD \pst@tempd exch pop \pst@number\psyunit div def
+ /XD \pst@tempd pop \pst@number\psxunit div def
+ /dY1 YB YA sub def
+ /dX1 XB XA sub def
+ /dY2 YD YC sub def
+ /dX2 XD XC sub def
+ dX1 abs 0.01 lt {
+ /m2 dY2 dX2 div def
+ XA dup XC sub m2 mul YC add
+ }{
+ dX2 abs 0.01 lt {
+ /m1 dY1 dX1 div def
+ XC dup XA sub m1 mul YA add
+ }{%
+ /m1 dY1 dX1 div def
+ /m2 dY2 dX2 div def
+ m1 XA mul m2 XC mul sub YA sub YC add m1 m2 sub div dup
+ XA sub m1 mul YA add
+ } ifelse
+ } ifelse ){#5}
+}
+%
+% draw a parallel line
+% #2---------#3
+% #4----------#5(new)
+\def\Parallel{\@ifnextchar[{\pst@Parallel}{\pst@Parallel[]}}
+\def\pst@Parallel[#1](#2)(#3)(#4)#5{{%
+ \psset{#1}%
+ \pst@getcoor{#2}\pst@tempa
+ \pst@getcoor{#3}\pst@tempb
+ \pst@getcoor{#4}\pst@tempc
+ \pnode(!%
+ /LengthArrow \psk@ThreeDplot@length\space def
+ \pst@tempa /YA exch \pst@number\psyunit div def
+ /XA exch \pst@number\psxunit div def
+ \pst@tempb /YB exch \pst@number\psyunit div def
+ /XB exch \pst@number\psxunit div def
+ \pst@tempc /YC exch \pst@number\psyunit div def
+ /XC exch \pst@number\psxunit div def
+ /denominateur XB XA sub def
+ /numerateur YB YA sub def
+ /angleDirectionAB numerateur denominateur Atan def
+ /XstartParallel XC LengthArrow angleDirectionAB cos mul add def
+ /YstartParallel YC LengthArrow angleDirectionAB sin mul add def
+ XstartParallel YstartParallel){#5}
+ \psline[#1](#4)(#5)
+}\ignorespaces}
+%
+% arrowLine[options](A)(B){n}
+% #2---->---->---->---->----#3 #4-arrows inside
+\def\arrowLine{\@ifnextchar[{\pst@arrowLine}{\pst@arrowLine[]}}
+\def\pst@arrowLine[#1](#2)(#3)#4{{%
+ \psset{arrowsize=4pt,arrows=->}% the defaults
+ \psset{#1}%
+ \def\pst@ThreeDplot@n{#4}%
+ \pst@getcoor{#2}\pst@tempa
+ \pst@getcoor{#3}\pst@tempb
+ \pnode(!%
+ /YA \pst@tempa exch pop \pst@number\psyunit div def
+ /XA \pst@tempa pop \pst@number\psxunit div def
+ /YB \pst@tempb exch pop \pst@number\psyunit div def
+ /XB \pst@tempb pop \pst@number\psxunit div def
+ /dY YB YA sub \pst@ThreeDplot@n\space 1 add div def
+ /dX XB XA sub \pst@ThreeDplot@n\space 1 add div def
+ /Alpha dY dX atan def
+ /dYOffset \psk@ThreeDplot@arrowOffset\space Alpha sin mul def
+ /dXOffset \psk@ThreeDplot@arrowOffset\space Alpha cos mul def
+ XA YA ){tempArrowC}
+ \multido{\i=1+1}{#4}{%
+ \pnode(!%
+ XA dX \i\space mul add dXOffset add
+ YA dY \i\space mul add dYOffset add ){tempArrowB}
+ \psline(tempArrowC)(tempArrowB)
+ \pnode(tempArrowB){tempArrowC}
+ }
+ \psline[arrows=-](tempArrowB)(#3)
+}\ignorespaces}
+%
+% #1------#3------#2
+\def\nodeBetween(#1)(#2)#3{% Herbert 2003/01/05
+ \pst@getcoor{#1}\pst@tempa
+ \pst@getcoor{#2}\pst@tempb
+ \pnode(!%
+ /XA \pst@tempa pop \pst@number\psxunit div def
+ /YA \pst@tempa exch pop \pst@number\psyunit div def
+ /XB \pst@tempb pop \pst@number\psxunit div def
+ /YB \pst@tempb exch pop \pst@number\psyunit div def
+ XB XA add 2 div YB YA add 2 div){#3}
+}
+%
+% rotateNode(A)
+% (A) the node
+% #2 the angle
+% Herbert Voss <voss@perce.de> 2003-01-26
+\def\rotateNode{\pst@rotateNode}
+\def\pst@rotateNode(#1)#2{{%
+ \pst@getcoor{#1}\pst@tempa%
+ \def\pst@ThreeDplot@angle{#2}% the rotating angle
+ \pnode(!%
+ /YA \pst@tempa exch pop \pst@number\psyunit div def
+ /XA \pst@tempa pop \pst@number\psxunit div def
+ YA 0 eq XA 0 eq and {0 0}{
+ /r XA dup mul YA dup mul add sqrt def
+ /AlphaOld YA XA atan def
+ /AlphaNew AlphaOld \pst@ThreeDplot@angle\space add def
+ r AlphaNew cos mul r AlphaNew sin mul
+ } ifelse ){temp}%
+ \pnode(temp){#1}%
+}\ignorespaces}
+%
+\def\rotateTriangle{\pst@rotateTriangle}
+\def\pst@rotateTriangle(#1)(#2)(#3)#4{{%
+ \rotateNode(#1){#4}%
+ \rotateNode(#2){#4}%
+ \rotateNode(#3){#4}%
+}\ignorespaces}
+%
+\def\rotateFrame{\pst@rotateFrame}
+\def\pst@rotateFrame(#1)(#2)(#3)(#4)#5{{%
+ \rotateNode(#1){#5}%
+ \rotateNode(#2){#5}%
+ \rotateNode(#3){#5}%
+ \rotateNode(#4){#5}%
+}\ignorespaces}
+%
+% An add macro for integer values
+% \pstAdd{34}{6}\value ==> \value is 30
+%
+\def\pstAdd#1#2#3{%
+ \begingroup%
+ \pst@dima=#1pt
+ \advance\pst@dima by #2pt
+ \edef\pst@value{\endgroup\def\noexpand#3{\pst@number\pst@dima}}\pst@value%
+}
+\def\pstSub#1#2#3{%
+ \begingroup%
+ \pst@dima=#1pt\relax
+ \pst@dimb=#2pt\relax
+ \advance\pst@dima by -\pst@dimb
+ \edef\pst@value{\endgroup%
+ \def\noexpand#3{\pst@number\pst@dima}}\pst@value%
+}
+% An mul macro for real values
+% \pstmul{2.5}{1,5}\value ==> \value is 6.25
+%
+\def\pstMul#1#2#3{%
+ \begingroup%
+ \pst@dima=#1pt\relax
+ \pst@dimb=#2\pst@dima\relax
+ \edef\pst@value{\endgroup
+ \def\noexpand#3{\pst@number\pst@dimb}}\pst@value%
+}
+%
+\let\pstDiv\pst@divide
+%
+% A macro for sin cos values
+% \pstSinCos{30}\SinVal\CosVal ==> \SinVal 0.5 \CosVal 0.86
+ %
+\def\pstSinCos#1#2#3{%
+\begingroup%
+ \pst@getsinandcos{#1}
+ \edef\pst@values{\endgroup%
+ \def\noexpand#2{\ifcase\pst@quadrant\or\or-\or-\fi\pst@sin}%
+ \def\noexpand#3{\ifcase\pst@quadrant\or-\or-\or\fi\pst@cos}}\pst@values%
+}
+\def\pstRotPointIIID{\pst@object{RotPointIIID}}% A real TeX solution
+\def\RotPointIIID@i(#1,#2,#3)#4#5#6{%
+ \pst@killglue%
+ \begingroup%
+ \use@par%
+% x- axis
+ \pstSinCos{\psk@ThreeD@RotX}\pst@sinTheta\pst@cosTheta
+ \def\pst@xVala{#1}
+ \pstMul{#2}{\pst@cosTheta}\pst@tempA
+ \pstMul{#3}{\pst@sinTheta}\pst@tempB
+ \pstSub{\pst@tempA}{\pst@tempB}\pst@yVala
+ \pstMul{#2}{\pst@sinTheta}\pst@tempA
+ \pstMul{#3}{\pst@cosTheta}\pst@tempB
+ \pstAdd{\pst@tempA}{\pst@tempB}\pst@zVala
+% y- axis
+ \pstSinCos{\psk@ThreeD@RotY}\pst@sinTheta\pst@cosTheta
+ \pstMul{\pst@xVala}{\pst@cosTheta}\pst@tempA
+ \pstMul{\pst@zVala}{\pst@sinTheta}\pst@tempB
+ \pstSub{\pst@tempA}{\pst@tempB}\pst@xValb
+ \let\pst@yValb\pst@yVala
+ \pstMul{\pst@xVala}{\pst@sinTheta}\pst@tempA
+ \pstMul{\pst@zVala}{\pst@cosTheta}\pst@tempB
+ \pstAdd{\pst@tempA}{\pst@tempB}\pst@zValb
+% z- axis
+ \pstSinCos{\psk@ThreeD@RotZ}\pst@sinTheta\pst@cosTheta
+ \pstMul{\pst@xValb}{\pst@cosTheta}\pst@tempA
+ \pstMul{\pst@yValb}{\pst@sinTheta}\pst@tempB
+ \pstSub{\pst@tempA}{\pst@tempB}\pst@xValc
+ \pstMul{\pst@xValb}{\pst@sinTheta}\pst@tempA
+ \pstMul{\pst@yValb}{\pst@cosTheta}\pst@tempB
+ \pstAdd{\pst@tempA}{\pst@tempB}\pst@yValc
+ \let\pst@zValc\pst@zValb
+ %
+ \edef\pst@values{\endgroup%
+ \def\noexpand#4{\pst@xValc}%
+ \def\noexpand#5{\pst@yValc}%
+ \def\noexpand#6{\pst@zValc}}\pst@values%
+ \ignorespaces%
+}
+%
+\catcode`\@=\PstAtCode\relax
+%
+%% END: pst-3dplot.tex
+\endinput
+