%% This is file `pst-vue3d.tex', %% %% IMPORTANT NOTICE: %% %% Package `pst-vue3d.tex' %% %% Manuel Luque (France) %% Herbert Voss beg /xUnit \pst@number\psxunit def /yUnit \pst@number\psyunit def % hv 2005-04-30 <---end /reduction \psk@TroisD@scale\space def /RotX \psk@TroisD@RotX\space def /RotY \psk@TroisD@RotY\space def /RotZ \psk@TroisD@RotZ\space def /A \psk@TroisD@A\space def /B \psk@TroisD@B\space def /C \psk@TroisD@C\space def /RayonBaseTetraedre \psk@TroisD@Rtetraedre\space def /fracHeight \psk@TroisD@fracHeight\space def /Rpoint A 4 div def /nTheta \psk@TroisD@normaleLongitude\space def /nPhi \psk@TroisD@normaleLatitude\space def /S1 \psk@TroisD@normaleLongitude\space sin def /C1 \psk@TroisD@normaleLongitude\space cos def /S2 \psk@TroisD@normaleLatitude\space sin def /C2 \psk@TroisD@normaleLatitude\space cos def /THETA \psk@TroisD@Theta\space def /PHI \psk@TroisD@Phi\space def /dTHETA \psk@TroisD@DeltaTheta\space def /dPHI \psk@TroisD@DeltaPhi\space def /psTHETA \psk@TroisD@PortionSphereTHETA\space def /psPHI \psk@TroisD@PortionSpherePHI\space def /PhiCercle \psk@TroisD@PhiCercle\space def /ThetaMeridien \psk@TroisD@ThetaMeridien\space def /Dobs \psk@TroisD@Dobs\space def /DScreen \psk@TroisD@Ecran\space def /Sin1 THETA sin def /Sin2 PHI sin def /Cos1 THETA cos def /Cos2 PHI cos def /Cos1Sin2 Cos1 Sin2 mul def /Sin1Sin2 Sin1 Sin2 mul def /Cos1Cos2 Cos1 Cos2 mul def /Sin1Cos2 Sin1 Cos2 mul def /XpointVue Dobs Cos1Cos2 mul def /YpointVue Dobs Sin1Cos2 mul def /ZpointVue Dobs Sin2 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 }% % hv 2003-12-20 % -------------- Utilities ----------------- \SpecialCoor \pstheader{pst-vue3d.pro} \def\face{% \pscurve(1;160)(0.8;180)(1;200) \pscustom{\gsave\psarc(0,0){1}{165}{195} \pscurve(1;195)(0.85;180)(1;165) \fill[fillstyle=solid,fillcolor=blue]\grestore} \pscurve[linewidth=.4pt](1;195)(0.85;180)(1;165) \bgroup \psset{linewidth=2pt} \psarc(0,1){1}{180}{270} \psarc(0,-1){1}{90}{180} \egroup \psarc(0,0){1}{150}{210} \psset{linewidth=4pt,linecolor=gray}% \pscurve(-.5,3.5)(-1,3)(-1.2,2.5)(-1.3,2)(-1.4,1)(-1.35,0.5)% (-1.2,-.2)(-1.35,-.5)(-1.4,-1)(-1.5,-1.5)(-1.8,-2)(-1.8,-2.3)% (-1.65,-2.5)(-1.35,-2.55)(-.95,-2.8)(-.95,-3.35)(-1,-3.65)(-.8,-4)(-.4,-4.1) \pscurve(-.8,-4)(-.8,-4.2)(-.5,-4.5)(-.4,-5)(-.25,-5.5)(0,-5.8)(.5,-6)% } \def\eye{% \psarc[linewidth=2pt](0,2.5){2.5}{215}{270}% \psarc[linewidth=2pt](0,-2.5){2.5}{90}{140}% \psarc(-2.5,0){1}{-30}{30}% \psarc(0,0){1.75}{160}{200} \psclip{\pscircle[linestyle=none](0,0){1.75}} \pscircle[fillstyle=solid,fillcolor=lightgray](-2.5,0){0.9} \endpsclip% } % % -------------- Basic Macros -------------- % % hv 2003 \def\AxesThreeD{\pst@object{AxesThreeD}} \def\AxesThreeD@i{\@ifnextchar({\AxesThreeD@iii}{\AxesThreeD@ii}} \def\AxesThreeD@ii#1(#2){% \begingroup \addto@par{arrows=#1}% \begin@OpenObj \AxesThreeD@iv#2,@comma*\relax% } \def\AxesThreeD@iii(#1){% \begingroup \begin@OpenObj \AxesThreeD@iv#1,@comma*\relax% } % \def\AxesThreeD@iv#1,#2*{% \def\@tempa{#2}\def\@tempb{@comma}% \ifx\@tempa\@tempb% only one value \AxesThreeD@v#1,#2\else\AxesThreeD@vi#1,#2\relax% \fi% } \def\AxesThreeD@v#1,#2\relax{% \AxesThreeD@vi#1,#1,#1,#1\relax% } \def\AxesThreeD@vi#1,#2,#3,#4\relax{% \use@par \pNodeThreeD(0,0,0){Origin}% \pNodeThreeD(0,0,#3){ZMax}\pNodeThreeD(#1,0,0){XMax}\pNodeThreeD(0,#2,0){YMax}% \psline(Origin)(ZMax)\psline(Origin)(XMax)\psline(Origin)(YMax)% \uput[0](ZMax){\small Z}\uput[90](XMax){\small X}\uput[0](YMax){\small Y}% \end@OpenObj \endgroup } % % hv 2003 \def\showCoorThreeD{\pst@object{showCoorThreeD}} \def\showCoorThreeD@i(#1){{% \begin@OpenObj \showCoorThreeD@ii#1,@comma*\relax \end@OpenObj }\ignorespaces% } \def\showCoorThreeD@ii#1,#2*{% \def\@tempa{#2}\def\@tempb{@comma}% \ifx\@tempa\@tempb% \showCoorThreeD@iii#1;#2\else\showCoorThreeD@iv#1,#2\relax% \fi% } % \def\showCoorThreeD@iii#1;#2;#3;#4\relax{% \psline(! \variablesTroisD /Radius #1 def /longitude #2 def /latitude #3 def /Zcote Radius latitude sin mul def /Xabscisse Radius longitude cos mul latitude cos mul def /Yordonnee Radius longitude sin mul latitude cos mul def tx@3DDict begin formulesTroisD Xi reduction mul Yi reduction mul end)(! /Zcote 0 def tx@3DDict begin formulesTroisD Xi reduction mul Yi reduction mul end) \psline(! /Zcote 0 def /Xabscisse Radius longitude cos mul latitude cos mul def /Yordonnee Radius longitude sin mul latitude cos mul def tx@3DDict begin formulesTroisD Xi reduction mul Yi reduction mul end)(! /Zcote 0 def /Yordonnee 0 def tx@3DDict begin formulesTroisD Xi reduction mul Yi reduction mul end) \psline(! /Zcote 0 def /Xabscisse Radius longitude cos mul latitude cos mul def /Yordonnee Radius longitude sin mul latitude cos mul def tx@3DDict begin formulesTroisD Xi reduction mul Yi reduction mul end)(! /Zcote 0 def /Xabscisse 0 def tx@3DDict begin formulesTroisD Xi reduction mul Yi reduction mul end) } % \def\showCoorThreeD@iv#1,#2,#3,#4\relax{% % \qdisk(P){1pt} \LineThreeD(#1,#2,#3)(#1,#2,0)% \LineThreeD(#1,#2,0)(#1,0,0)% \LineThreeD(#1,#2,0)(0,#2,0)% } % % \def\CubeThreeD{\def\pst@par{}\pst@object{CubeThreeD}} \def\CubeThreeD@i(#1,#2,#3){{ \begin@ClosedObj % \use@par \addto@pscode{% \variablesTroisD \ifPst@SphericalCoor /Radius #1 def /longitude #2 def /latitude #3 def /CZ Radius latitude sin mul def /CX Radius longitude cos mul latitude cos mul def /CY Radius longitude sin mul latitude cos mul def \else /CX #1 def /CY #2 def /CZ #3 def \fi \ifPst@CubeInside /Condition { ge } def \else /Condition { le } def \fi /CubeColorFaceOne {\psk@TroisD@CubeColorFaceOne} def /CubeColorFaceTwo {\psk@TroisD@CubeColorFaceTwo} def /CubeColorFaceThree {\psk@TroisD@CubeColorFaceThree} def /CubeColorFaceFive {\psk@TroisD@CubeColorFaceFive} def /CubeColorFaceFour {\psk@TroisD@CubeColorFaceFour} def /CubeColorFaceSix {\psk@TroisD@CubeColorFaceSix} def tx@3DDict begin /Condition1 { PS1 0 le } def Cube end }% fin du code ps \end@ClosedObj% }} % \def\DieThreeD{\pst@object{DieThreeD}} \def\DieThreeD@i(#1,#2,#3){{% % (#2,#3,#4) coordonnées du centre \begin@ClosedObj \use@par \addto@pscode{% \variablesTroisD \ifPst@SphericalCoor /Radius #1 def /longitude #2 def /latitude #3 def /CZ Radius latitude sin mul def /CX Radius longitude cos mul latitude cos mul def /CY Radius longitude sin mul latitude cos mul def \else /CX #1 def /CY #2 def /CZ #3 def \fi \ifPst@CubeInside /Condition { ge } def \else /Condition {le } def \fi /CubeColorFaceOne {\psk@TroisD@CubeColorFaceOne} def /CubeColorFaceTwo {\psk@TroisD@CubeColorFaceTwo} def /CubeColorFaceThree {\psk@TroisD@CubeColorFaceThree} def /CubeColorFaceFive {\psk@TroisD@CubeColorFaceFive} def /CubeColorFaceFour {\psk@TroisD@CubeColorFaceFour} def /CubeColorFaceSix {\psk@TroisD@CubeColorFaceSix} def tx@3DDict begin Cube PointsDie end }% fin du code ps \end@ClosedObj% }} % % Dodecahedron : 31 décembre 2003 ml \def\DodecahedronThreeD{\pst@object{DodecahedronThreeD}} \def\DodecahedronThreeD@i(#1,#2,#3){{% \begin@ClosedObj \addto@pscode{% \variablesTroisD /CX #1 def /CY #2 def /CZ #3 def /Condition {le } def tx@3DDict begin Dodecahedron end }% fin du code ps \end@ClosedObj% }} % \def\SphereThreeD{\pst@object{SphereThreeD}} \def\SphereThreeD@i(#1,#2,#3)#4{{% % (#2,#3,#4) coordonnées du centre % #5 rayon \begin@ClosedObj% \use@par \addto@pscode{% \variablesTroisD \ifPst@SphericalCoor /Radius #1 def /longitude #2 def /latitude #3 def /CZ Radius latitude sin mul def /CX Radius longitude cos mul latitude cos mul def /CY Radius longitude sin mul latitude cos mul def \else /CX #1 def /CY #2 def /CZ #3 def \fi reduction reduction scale /Rsphere #4 def /increment 10 def tx@3DDict begin /condition { PSfacette 0 le } def /departPhi -90 def MaillageSphere end }% fin du code ps \showpointsfalse% \end@ClosedObj% }\ignorespaces} % % fin de la commande PSTricks % % 2décembre 2002 % \def\SphereInverseThreeD{\pst@object{SphereInverseThreeD}} \def\SphereInverseThreeD@i(#1,#2,#3)#4{{% % (#2,#3,#4) coordonnées du centre % #5 rayon \begin@ClosedObj \addto@pscode{% \variablesTroisD \ifPst@SphericalCoor /Radius #1 def /longitude #2 def /latitude #3 def /CZ Radius latitude sin mul def /CX Radius longitude cos mul latitude cos mul def /CY Radius longitude sin mul latitude cos mul def \else /CX #1 def /CY #2 def /CZ #3 def \fi reduction reduction scale /Rsphere #4 def /increment 10 def tx@3DDict begin /condition {PSfacette 0 ge} def /departPhi -90 def MaillageSphere end }% fin du code ps \showpointsfalse% \end@ClosedObj% }\ignorespaces} % % fin de la commande PSTricks % fin 2 décembre 2002 % \def\SphereCercleThreeD{\pst@object{SphereCercleThreeD}} \def\SphereCercleThreeD@i(#1,#2,#3)#4{{% % (#2,#3,#4) coordonnées du centre % #5 rayon \begin@ClosedObj \addto@pscode{% \variablesTroisD \ifPst@SphericalCoor /Radius #1 def /longitude #2 def /latitude #3 def /CZ Radius latitude sin mul def /CX Radius longitude cos mul latitude cos mul def /CY Radius longitude sin mul latitude cos mul def \else /CX #1 def /CY #2 def /CZ #3 def \fi reduction reduction scale /Rsphere #4 def tx@3DDict begin 0 2 360 { /ThetaEquateur exch def /Xpoint Rsphere ThetaEquateur cos mul PhiCercle cos mul def /Ypoint Rsphere ThetaEquateur sin mul PhiCercle cos mul def /Zpoint Rsphere PhiCercle sin mul def CalculsPointsAfterTransformations % rayon de las sphère (normale) /nXfacette Xabscisse CX sub def /nYfacette Yordonnee CY sub def /nZfacette Zcote CZ sub def % rayon vers point de vue /RXvue Xabscisse XpointVue sub def /RYvue Yordonnee YpointVue sub def /RZvue Zcote ZpointVue sub def % test de visibilité /PSPoint RXvue nXfacette mul RYvue nYfacette mul add RZvue nZfacette mul add def PSPoint 0 le { newpath CalcCoordinates 0.5 0 360 arc closepath fill } if %lineto } for end }% fin du code ps \showpointsfalse% \end@ClosedObj% }\ignorespaces} % % \def\SphereMeridienThreeD{\pst@object{SphereMeridienThreeD}} \def\SphereMeridienThreeD@i(#1,#2,#3)#4{{% % (#2,#3,#4) coordonnées du centre % #5 rayon \begin@ClosedObj% \use@par \addto@pscode{% \variablesTroisD \ifPst@SphericalCoor /Radius #1 def /longitude #2 def /latitude #3 def /CZ Radius latitude sin mul def /CX Radius longitude cos mul latitude cos mul def /CY Radius longitude sin mul latitude cos mul def \else /CX #1 def /CY #2 def /CZ #3 def \fi reduction reduction scale /Rsphere #4 def tx@3DDict begin 0 2 360 { /PhiCercle exch def /Xpoint Rsphere ThetaMeridien cos mul PhiCercle cos mul def /Ypoint Rsphere ThetaMeridien sin mul PhiCercle cos mul def /Zpoint Rsphere PhiCercle sin mul def CalculsPointsAfterTransformations % rayon de las sphère (normale) /nXfacette Xabscisse CX sub def /nYfacette Yordonnee CY sub def /nZfacette Zcote CZ sub def % rayon vers point de vue /RXvue Xabscisse XpointVue sub def /RYvue Yordonnee YpointVue sub def /RZvue Zcote ZpointVue sub def % test de visibilité /PSPoint RXvue nXfacette mul RYvue nYfacette mul add RZvue nZfacette mul add def PSPoint 0 le{ newpath CalcCoordinates 0.5 0 360 arc closepath fill } if %lineto } for end }% fin du code ps \showpointsfalse% \end@ClosedObj% }\ignorespaces} % \def\CylindreThreeD{\pst@object{CylindreThreeD}} \def\CylindreThreeD@i(#1,#2,#3)#4#5{{% % Le centre de la base sera placé avec % (#2,#3,#4) les paramètres CX,CY et CZ % #5 rayon % #6 hauteur % on peut ensuite faire tourner le cylindre % avec RotX, RotY et RotZ \begin@ClosedObj \use@par \addto@pscode{% \variablesTroisD \ifPst@SphericalCoor /Radius #1 def /longitude #2 def /latitude #3 def /CZ Radius latitude sin mul def /CX Radius longitude cos mul latitude cos mul def /CY Radius longitude sin mul latitude cos mul def \else /CX #1 def /CY #2 def /CZ #3 def \fi reduction reduction scale /Rcylindre #4 def /Hcylindre #5 def /incrementANGLE 10 def /incrementHAUTEUR Hcylindre 5 div def tx@3DDict begin CylinderThreeD end }% fin du code ps \showpointsfalse% \end@ClosedObj }\ignorespaces}% % fin de la commande PSTricks % % hv 2003-12-18 \def\LineThreeD{\pst@object{LineThreeD}} \def\LineThreeD@i(#1,#2,#3)(#4,#5,#6){{% % (#2,#3,#4) coordonnées du point1 % (#5,#6,#7) coordonnées du point2 \begin@OpenObj \pNodeThreeD(#1,#2,#3){tempNodeA} \pNodeThreeD(#4,#5,#6){tempNodeB} \psline(tempNodeA)(tempNodeB) \end@OpenObj }\ignorespaces} % % hv 2003-12-17 \def\pNodeThreeD{\pst@object{pNodeThreeD}} % point can be in cartesian (x,y,z) or sphere coordinates (r;phi;theta) \def\pNodeThreeD@i(#1)#2{{% \begin@ClosedObj \edef\@NodeNameThreeD{#2} \pNodeThreeD@ii#1,@comma*\relax \end@ClosedObj }\ignorespaces% } \def\pNodeThreeD@ii#1,#2*{% \def\@tempa{#2}\def\@tempb{@comma}% \ifx\@tempa\@tempb% \pNodeThreeD@iii#1;#2\else\pNodeThreeD@iv#1,#2\relax% \fi% } \def\pNodeThreeD@iii#1;#2;#3;#4\relax{% \pnode(! \variablesTroisD /Radius #1 def /longitude #2 def /latitude #3 def /Zcote Radius latitude sin mul def /Xabscisse Radius longitude cos mul latitude cos mul def /Yordonnee Radius longitude sin mul latitude cos mul def tx@3DDict begin formulesTroisD Xi reduction mul Yi reduction mul end){\@NodeNameThreeD} } \def\pNodeThreeD@iv#1,#2,#3,#4\relax{% \pnode(! \variablesTroisD \ifPst@SphericalCoor /Radius #1 def /longitude #2 def /latitude #3 def /Zcote Radius latitude sin mul def /Xabscisse Radius longitude cos mul latitude cos mul def /Yordonnee Radius longitude sin mul latitude cos mul def \else /Zcote #3 def /Xabscisse #1 def /Yordonnee #2 def \fi tx@3DDict begin formulesTroisD Xi reduction mul Yi reduction mul end){\@NodeNameThreeD}% } % \iffalse % hv 2005-12-04 \def\pnodeThreeD{\pst@object{pnodeThreeD}} \def\pnodeThreeD@i(#1,#2,#3)#4{% \pst@killglue \begingroup \use@par \pnode(! \psk@embedangle \psk@viewpoint \psk@viewangle \tx@SetMatrixThreeD \ifPst@SphericalCoor /Radius #1 def /longitude #2 def /latitude #3 def Radius longitude cos mul latitude cos mul % x Radius longitude sin mul latitude cos mul % y Radius latitude sin mul % z \else #1 #2 #3 \fi \tx@ProjThreeD){#4}% \endgroup} % \let\pNodeThreeD\pnodeThreeD \fi % \def\TetraedreThreeD{\pst@object{TetraedreThreeD}} \def\TetraedreThreeD@i(#1,#2,#3){{% \begin@ClosedObj \addto@pscode{% \variablesTroisD \ifPst@SphericalCoor /Radius #1 def /longitude #2 def /latitude #3 def /CZ Radius latitude sin mul def /CX Radius longitude cos mul latitude cos mul def /CY Radius longitude sin mul latitude cos mul def \else /CX #1 def /CY #2 def /CZ #3 def \fi tx@3DDict begin Tetraedre end }% fin du code ps \end@ClosedObj }\ignorespaces} % % % pyramide % \def\FaceSAB{\pst@object{FaceSAB}} \def\FaceSAB@i(#1,#2,#3)#4{{% \begin@ClosedObj \addto@pscode{% \variablesTroisD \ifPst@SphericalCoor /Radius #1 def /longitude #2 def /latitude #3 def /CZ Radius latitude sin mul def /CX Radius longitude cos mul latitude cos mul def /CY Radius longitude sin mul latitude cos mul def \else /CX #1 def /CY #2 def /CZ #3 def \fi /Hpyramide #4 def tx@3DDict begin SommetsPyramide PSAB 0 le { % reduction reduction scale newpath 1 setlinejoin /Xabscisse XS 1 fracHeight sub XA XS sub mul add def /Yordonnee YS 1 fracHeight sub YA YS sub mul add def /Zcote ZS CZ sub fracHeight mul CZ add def CalcCoordinates moveto /Xabscisse XA def /Yordonnee YA def /Zcote ZA def CalcCoordinates lineto /Xabscisse XB def /Yordonnee YB def /Zcote ZB def CalcCoordinates lineto /Xabscisse XS 1 fracHeight sub XB XS sub mul add def /Yordonnee YS 1 fracHeight sub YB YS sub mul add def /Zcote ZS CZ sub fracHeight mul CZ add def CalcCoordinates lineto closepath } if end }% fin du code ps \end@ClosedObj }\ignorespaces} % \def\FaceSBC{\pst@object{FaceSBC}} \def\FaceSBC@i(#1,#2,#3)#4{{% \begin@ClosedObj \addto@pscode{% \variablesTroisD \ifPst@SphericalCoor /Radius #1 def /longitude #2 def /latitude #3 def /CZ Radius latitude sin mul def /CX Radius longitude cos mul latitude cos mul def /CY Radius longitude sin mul latitude cos mul def \else /CX #1 def /CY #2 def /CZ #3 def \fi /Hpyramide #4 def tx@3DDict begin SommetsPyramide PSBC 0 le { % reduction reduction scale newpath 1 setlinejoin /Xabscisse XS 1 fracHeight sub XB XS sub mul add def /Yordonnee YS 1 fracHeight sub YB YS sub mul add def /Zcote ZS CZ sub fracHeight mul CZ add def CalcCoordinates moveto /Xabscisse XB def /Yordonnee YB def /Zcote ZB def CalcCoordinates lineto /Xabscisse XC def /Yordonnee YC def /Zcote ZC def CalcCoordinates lineto /Xabscisse XS 1 fracHeight sub XC XS sub mul add def /Yordonnee YS 1 fracHeight sub YC YS sub mul add def /Zcote ZS CZ sub fracHeight mul CZ add def CalcCoordinates lineto closepath } if end }% fin du code ps \end@ClosedObj }\ignorespaces} % % \def\FaceSCD{\pst@object{FaceSCD}} \def\FaceSCD@i(#1,#2,#3)#4{{% \begin@ClosedObj \addto@pscode{% \variablesTroisD \ifPst@SphericalCoor /Radius #1 def /longitude #2 def /latitude #3 def /CZ Radius latitude sin mul def /CX Radius longitude cos mul latitude cos mul def /CY Radius longitude sin mul latitude cos mul def \else /CX #1 def /CY #2 def /CZ #3 def \fi /Hpyramide #4 def tx@3DDict begin SommetsPyramide PSCD 0 le { % reduction reduction scale newpath 1 setlinejoin /Xabscisse XS 1 fracHeight sub XC XS sub mul add def /Yordonnee YS 1 fracHeight sub YC YS sub mul add def /Zcote ZS CZ sub fracHeight mul CZ add def CalcCoordinates moveto /Xabscisse XC def /Yordonnee YC def /Zcote ZC def CalcCoordinates lineto /Xabscisse XD def /Yordonnee YD def /Zcote ZD def CalcCoordinates lineto /Xabscisse XS 1 fracHeight sub XD XS sub mul add def /Yordonnee YS 1 fracHeight sub YD YS sub mul add def /Zcote ZS CZ sub fracHeight mul CZ add def CalcCoordinates lineto closepath } if end }% fin du code ps \end@ClosedObj }\ignorespaces} % \def\FaceSDA{\pst@object{FaceSDA}} \def\FaceSDA@i(#1,#2,#3)#4{{% \begin@ClosedObj \addto@pscode{% \variablesTroisD \ifPst@SphericalCoor /Radius #1 def /longitude #2 def /latitude #3 def /CZ Radius latitude sin mul def /CX Radius longitude cos mul latitude cos mul def /CY Radius longitude sin mul latitude cos mul def \else /CX #1 def /CY #2 def /CZ #3 def \fi /Hpyramide #4 def tx@3DDict begin SommetsPyramide PSDA 0 le { % reduction reduction scale newpath 1 setlinejoin /Xabscisse XS 1 fracHeight sub XD XS sub mul add def /Yordonnee YS 1 fracHeight sub YD YS sub mul add def /Zcote ZS CZ sub fracHeight mul CZ add def CalcCoordinates moveto /Xabscisse XD def /Yordonnee YD def /Zcote ZD def CalcCoordinates lineto /Xabscisse XA def /Yordonnee YA def /Zcote ZA def CalcCoordinates lineto /Xabscisse XS 1 fracHeight sub XA XS sub mul add def /Yordonnee YS 1 fracHeight sub YA YS sub mul add def /Zcote ZS CZ sub fracHeight mul CZ add def CalcCoordinates lineto closepath } if end }% fin du code ps \end@ClosedObj }\ignorespaces} % \def\FaceABCD{\pst@object{FaceABCD}} \def\FaceABCD@i(#1,#2,#3)#4{{% \begin@ClosedObj \addto@pscode{% \variablesTroisD \ifPst@SphericalCoor /Radius #1 def /longitude #2 def /latitude #3 def /CZ Radius latitude sin mul def /CX Radius longitude cos mul latitude cos mul def /CY Radius longitude sin mul latitude cos mul def \else /CX #1 def /CY #2 def /CZ #3 def \fi /Hpyramide #4 def tx@3DDict begin SommetsPyramide PSABCD 0 le { % reduction reduction scale newpath 1 setlinejoin /Xabscisse XA def /Yordonnee YA def /Zcote ZA def CalcCoordinates moveto /Xabscisse XB def /Yordonnee YB def /Zcote ZB def CalcCoordinates lineto /Xabscisse XC def /Yordonnee YC def /Zcote ZC def CalcCoordinates lineto /Xabscisse XD def /Yordonnee YD def /Zcote ZD def CalcCoordinates lineto closepath } if end }% fin du code ps \end@ClosedObj }\ignorespaces} % % hv 2003 \def\FaceABCDTop{\pst@object{FaceABCDTop}} \def\FaceABCDTop@i(#1,#2,#3)#4{{% \begin@ClosedObj \addto@pscode{% \variablesTroisD \ifPst@SphericalCoor /Radius #1 def /longitude #2 def /latitude #3 def /CZ Radius latitude sin mul def /CX Radius longitude cos mul latitude cos mul def /CY Radius longitude sin mul latitude cos mul def \else /CX #1 def /CY #2 def /CZ #3 def \fi /Hpyramide #4 def tx@3DDict begin SommetsPyramide PSABCD 0 gt { % reduction reduction scale newpath 1 setlinejoin /Xabscisse XS 1 fracHeight sub XD XS sub mul add def /Yordonnee YS 1 fracHeight sub YD YS sub mul add def /Zcote ZS CZ sub fracHeight mul CZ add def CalcCoordinates moveto /Xabscisse XS 1 fracHeight sub XA XS sub mul add def /Yordonnee YS 1 fracHeight sub YA YS sub mul add def /Zcote ZS CZ sub fracHeight mul CZ add def CalcCoordinates lineto /Xabscisse XS 1 fracHeight sub XB XS sub mul add def /Yordonnee YS 1 fracHeight sub YB YS sub mul add def /Zcote ZS CZ sub fracHeight mul CZ add def CalcCoordinates lineto /Xabscisse XS 1 fracHeight sub XC XS sub mul add def /Yordonnee YS 1 fracHeight sub YC YS sub mul add def /Zcote ZS CZ sub fracHeight mul CZ add def CalcCoordinates lineto closepath } if end }% fin du code ps \end@ClosedObj }\ignorespaces} % \def\PyramideThreeD{\@ifnextchar[{\PyramideThreeD@i}{\PyramideThreeD@i[]}} % (#2,#3,#4) the coordinates of the origin % #5 the height of the pyrimide \def\PyramideThreeD@i[#1](#2,#3,#4)#5{{% \FaceSAB[fillcolor=\psk@TroisD@TetraedreColorFaceA,#1](#2,#3,#4){#5}% \FaceSBC[fillcolor=\psk@TroisD@TetraedreColorFaceB,#1](#2,#3,#4){#5}% \FaceSCD[fillcolor=\psk@TroisD@TetraedreColorFaceC,#1](#2,#3,#4){#5}% \FaceSDA[fillcolor=\psk@TroisD@TetraedreColorFaceD,#1](#2,#3,#4){#5}% \FaceABCD[fillcolor=\psk@TroisD@TetraedreColorFaceE,#1](#2,#3,#4){#5}% \FaceABCDTop[fillcolor=\psk@TroisD@TetraedreColorFaceE,#1](#2,#3,#4){#5}% }\ignorespaces} % % \def\ConeThreeD{\pst@object{ConeThreeD}} \def\ConeThreeD@i(#1,#2,#3)#4#5{% % Le centre de la base sera placé avec % (#2,#3,#4) les paramètres CX,CY et CZ % #5 rayon % #6 hauteur % on peut ensuite faire tourner le cylindre % avec RotX, RotY et RotZ \begin@ClosedObj \addto@pscode{% \variablesTroisD \ifPst@SphericalCoor /Radius #1 def /longitude #2 def /latitude #3 def /CZ Radius latitude sin mul def /CX Radius longitude cos mul latitude cos mul def /CY Radius longitude sin mul latitude cos mul def \else /CX #1 def /CY #2 def /CZ #3 def \fi reduction reduction scale /Rcone #4 def /Hcone #5 def tx@3DDict begin ConeThreeD end }% fin du code ps \showpointsfalse \end@ClosedObj \ignorespaces}% % \def\CircleThreeD{\pst@object{CircleThreeD}} \def\CircleThreeD@i(#1,#2,#3)#4{{% % (#2,#3,#4) les paramètres CX,CY et CZ % #5 rayon du cercle \begin@ClosedObj \addto@pscode{% /Rcercle #4 def \variablesTroisD \ifPst@SphericalCoor /Radius #1 def /longitude #2 def /latitude #3 def /CZ Radius latitude sin mul def /CX Radius longitude cos mul latitude cos mul def /CY Radius longitude sin mul latitude cos mul def \else /CX #1 def /CY #2 def /CZ #3 def \fi tx@3DDict begin reduction reduction scale /TableauxPoints [ 0 1 360 {% on décrit le cercle /Angle exch def [ /Xcercle Rcercle Angle cos mul def /Ycercle Rcercle Angle sin mul def /Xabscisse Xcercle S1 mul Ycercle S2 C1 mul mul add CX add def /Yordonnee Xcercle C1 mul neg Ycercle S2 S1 mul mul add CY add def /Zcote Ycercle C2 mul neg CZ add def CalcCoordinates ] } for ] def TableauxPoints 0 get aload pop moveto 0 1 360 { /compteur exch def TableauxPoints compteur get aload pop lineto } for end }% fin du code ps \showpointsfalse \end@ClosedObj }\ignorespaces} % % \def\FrameThreeD{\pst@object{FrameThreeD}} \def\FrameThreeD@i(#1,#2,#3)(#4,#5)(#6,#7){{% % (#2,#3,#4) the origin % (#5,#6) d'un sommet % (#7,#8) du sommet opposé % rectangle ABCD \begin@ClosedObj \addto@pscode{% /XA #4 def /YA #5 def /XC #6 def /YC #7 def % on en déduit les autres sommets /XB XC def /YB YA def /XD XA def /YD YC def \variablesTroisD \ifPst@SphericalCoor /Radius #1 def /longitude #2 def /latitude #3 def /CZ Radius latitude sin mul def /CX Radius longitude cos mul latitude cos mul def /CY Radius longitude sin mul latitude cos mul def \else /CX #1 def /CY #2 def /CZ #3 def \fi tx@3DDict begin reduction reduction scale newpath /Xframe XA def /Yframe YA def /Xabscisse Xframe S1 mul Yframe S2 C1 mul mul add CX add def /Yordonnee Xframe C1 mul neg Yframe S2 S1 mul mul add CY add def /Zcote Yframe C2 mul neg CZ add def CalcCoordinates moveto /Xframe XB def /Yframe YB def /Xabscisse Xframe S1 mul Yframe S2 C1 mul mul add CX add def /Yordonnee Xframe C1 mul neg Yframe S2 S1 mul mul add CY add def /Zcote Yframe C2 mul neg CZ add def CalcCoordinates lineto /Xframe XC def /Yframe YC def /Xabscisse Xframe S1 mul Yframe S2 C1 mul mul add CX add def /Yordonnee Xframe C1 mul neg Yframe S2 S1 mul mul add CY add def /Zcote Yframe C2 mul neg CZ add def CalcCoordinates lineto /Xframe XD def /Yframe YD def /Xabscisse Xframe S1 mul Yframe S2 C1 mul mul add CX add def /Yordonnee Xframe C1 mul neg Yframe S2 S1 mul mul add CY add def /Zcote Yframe C2 mul neg CZ add def CalcCoordinates lineto /Xframe XA def /Yframe YA def /Xabscisse Xframe S1 mul Yframe S2 C1 mul mul add CX add def /Yordonnee Xframe C1 mul neg Yframe S2 S1 mul mul add CY add def /Zcote Yframe C2 mul neg CZ add def CalcCoordinates lineto closepath end }% fin du code ps \showpointsfalse \end@ClosedObj }\ignorespaces}% % fin de la commande PSTricks % % \def\QuadrillageThreeD{\pst@object{QuadrillageThreeD}} \def\QuadrillageThreeD@i(#1,#2,#3)(#4,#5)(#6,#7){{% \begin@OpenObj \addto@pscode{% \variablesTroisD \ifPst@SphericalCoor /Radius #1 def /longitude #2 def /latitude #3 def /CZ Radius latitude sin mul def /CX Radius longitude cos mul latitude cos mul def /CY Radius longitude sin mul latitude cos mul def \else /CX #1 def /CY #2 def /CZ #3 def \fi /Xmin #4 def /Xmax #6 def /Ymin #5 def /Ymax #7 def /pas \psk@TroisD@pas\space def /grille \psk@TroisD@grille\space def tx@3DDict begin reduction reduction scale Ymin grille Ymax {% balayage suivant Oy /Ygrille exch def /TableauxPoints [ Xmin pas Xmax { % balayage suivant Ox /Xgrille exch def /Xabscisse Xgrille S1 mul Ygrille S2 C1 mul mul add CX add def /Yordonnee Xgrille C1 mul neg Ygrille S2 S1 mul mul add CY add def /Zcote Ygrille C2 mul neg CZ add def formulesTroisD [ Xi 28.45 mul Yi 28.45 mul ] } for ] def TableauxPoints 0 get aload pop moveto 0 1 Xmax Xmin sub pas div { /compteur exch def TableauxPoints compteur get aload pop lineto } for % stroke } for % Xmin grille Xmax {% balayage suivant Ox /Xgrille exch def /TableauxPoints [ Ymin pas Ymax { % balayage suivant Ox /Ygrille exch def /Xabscisse Xgrille S1 mul Ygrille S2 C1 mul mul add CX add def /Yordonnee Xgrille C1 mul neg Ygrille S2 S1 mul mul add CY add def /Zcote Ygrille C2 mul neg CZ add def formulesTroisD [ Xi 28.45 mul Yi 28.45 mul ] } for ] def TableauxPoints 0 get aload pop moveto 0 1 Ymax Ymin sub pas div { /compteur exch def TableauxPoints compteur get aload pop lineto } for \pst@number\pslinewidth SLW \pst@usecolor\pslinecolor \@nameuse{psls@\pslinestyle} % stroke } for % fin du tracé end }% fin du code ps \end@OpenObj }\ignorespaces}% % fin de la commande PSTricks % \newif\ifPstThreeDplot@showInside \define@key[psset]{pst-vue3d}{showInside}[true]{\@nameuse{PstThreeDplot@showInside@#1}} \define@key[psset]{pst-vue3d}{SegmentColor}{\pst@getcolor{#1}\psk@ThreeDplot@SegmentColor} \define@key[psset]{pst-vue3d}{increment}{\pst@getint{#1}\psk@ThreeDplot@increment} \psset[pst-vue3d]{showInside,SegmentColor={[cmyk]{0.2,0.6,1,0}},increment=10} % \def\ParaboloidThreeD{\pst@object{ParaboloidThreeD}} \def\ParaboloidThreeD@i#1#2{% \begin@SpecialObj% \addto@pscode{% \psk@embedangle \psk@viewpoint \psk@viewangle \tx@SetMatrixThreeD % Vecteur ViewPoint \psk@viewpoint /vZ ED /vY ED /vX ED /increment \psk@ThreeDplot@increment\space def /height #1 def /radius #2 #1 sqrt div def /cmyk {} def 1 setlinejoin % les rayons de lumière /xLight 1 def /yLight 0.1 def /zLight 0.2 def % précision du tracé /pas 0.5 def /pas10 {pas 10 div} bind def % /NormeLight {xLight dup mul yLight dup mul zLight dup mul add add sqrt} bind def % l'ellipse du plan de coupe : le contour /calculate2DPoint { % four values on stack; x2D y2D are returned /V0 ED /Z0 ED /U20 ED /U10 ED U10 cos V0 mul radius mul \pst@number\psunit mul U20 sin V0 mul radius mul \pst@number\psunit mul Z0 \pst@number\psunit mul \tx@ProjThreeD } def /PlanCoupe { /Z height store /V {Z sqrt} bind def /TableauxPoints [ 0 1 359 { /U exch def [ U U Z V caclculate2DPoint ] % on décrit le cercle } for ] def newpath TableauxPoints 0 get aload pop moveto 0 1 359 { /compteur exch def TableauxPoints compteur get aload pop lineto } for closepath } def % /facette { newpath U U Z V calculate2DPoint moveto U 1 U increment add {% /U1 exch def U1 U1 Z V calculate2DPoint lineto } for Z pas10 Z pas add pas10 add{ /Z1 exch def /V {Z1 sqrt} bind def U1 U1 Z1 V calculate2DPoint lineto } for U increment add -1 U {% /U2 exch def U2 U2 Z pas add V calculate2DPoint lineto } for Z pas add pas10 sub pas10 neg Z pas10 sub{ /Z2 exch def /V {Z2 abs sqrt} bind def U U Z2 V calculate2DPoint lineto } for closepath } def % facette % /MaillageParaboloid { 0 pas height pas sub{% /Z ED /V {Z sqrt} bind def 0 increment 360 increment sub {% /U exch def % Centre de la facette /Ucentre {U increment 2 div add} bind def /Vcentre {Z pas 2 div add sqrt} bind def % normale à la facette /nXfacette {2 Vcentre dup mul mul Ucentre cos mul radius mul} bind def /nYfacette {2 Vcentre dup mul mul Ucentre sin mul radius mul} bind def /nZfacette {Vcentre neg radius dup mul mul} bind def /NormeN { nXfacette dup mul nYfacette dup mul nZfacette dup mul add add sqrt} bind def NormeN 0 eq {/NormeN 1e-10 def} if % test de visibilité /PSfacette vX nXfacette mul vY nYfacette mul add vZ nZfacette mul add def condition { facette /cosV {1 xLight nXfacette mul yLight nYfacette mul zLight nZfacette mul add add NormeLight NormeN mul div sub} bind def \psk@ThreeDplot@SegmentColor\space cosV mul 4 1 roll cosV mul 4 1 roll cosV dup mul mul 4 1 roll cosV dup mul mul 4 1 roll setcmykcolor fill 0 setgray facette stroke } if } for } for } def /conditionGE {PSfacette 0 ge} def /conditionLE {PSfacette 0 le} def \ifPstThreeDplot@showInside /condition {conditionGE} def MaillageParaboloid vZ 0 ge {% PlanCoupe 1 0.5 0.5 setrgbcolor fill PlanCoupe 0 setgray stroke} if \else /condition {conditionLE} def MaillageParaboloid /condition {conditionGE} def MaillageParaboloid% \fi } % fin du code ps \showpointsfalse \end@SpecialObj} % % % 11 novembre \def\DemiSphereThreeD{\pst@object{DemiSphereThreeD}} \def\DemiSphereThreeD@i(#1,#2,#3)#4{{% % (#2,#3,#4) coordinates of the center % #5 rayon \begin@ClosedObj \addto@pscode{% \variablesTroisD \ifPst@SphericalCoor /Radius #1 def /longitude #2 def /latitude #3 def /CZ Radius latitude sin mul def /CX Radius longitude cos mul latitude cos mul def /CY Radius longitude sin mul latitude cos mul def \else /CX #1 def /CY #2 def /CZ #3 def \fi reduction reduction scale /Rsphere #4 def /increment 10 def tx@3DDict begin /condition { PSfacette 0 le } def /departPhi 0 def MaillageSphere % centre de la base inférieure après transformations /CxFaceInf CX def /CyFaceInf CY def /CzFaceInf CZ def % correction 16 novembre 2002 % /Xpoint CxFaceInf def % /Ypoint CyFaceInf def % /Zpoint CzFaceInf def /Xpoint 0 def /Ypoint 0 def /Zpoint 0 def % fin correction 16/11/2002 CalculsPointsAfterTransformations /CxBaseInf Xabscisse def /CyBaseInf Yordonnee def /CzBaseInf Zcote def /RXvueInf CxBaseInf XpointVue sub def /RYvueInf CyBaseInf YpointVue sub def /RZvueInf CzBaseInf ZpointVue sub def % Sommet de la sphère /Xpoint 0 def /Ypoint 0 def /Zpoint Rsphere def CalculsPointsAfterTransformations /XsommetSphere Xabscisse def /YsommetSphere Yordonnee def /ZsommetSphere Zcote def % Normale extérieure à la base inférieure /nXBaseInf CxFaceInf XsommetSphere sub def /nYBaseInf CyFaceInf YsommetSphere sub def /nZBaseInf CzFaceInf ZsommetSphere sub def % Visibilité de la base inférieure /PSbaseSphere nXBaseInf RXvueInf mul nYBaseInf RYvueInf mul add nZBaseInf RZvueInf mul add def PSbaseSphere 0 le { /TableauxPoints [ 0 1 359 {% on décrit le cercle /theta exch def [ /Xpoint Rsphere theta cos mul def /Ypoint Rsphere theta sin mul def /Zpoint 0 def CalculsPointsAfterTransformations CalcCoordinates ] } for ] def gsave newpath TableauxPoints 0 get aload pop moveto 0 1 359 { /compteur exch def TableauxPoints compteur get aload pop lineto } for 0.7 setgray closepath fill grestore } if end }% fin du code ps \showpointsfalse% \end@ClosedObj }\ignorespaces}% % fin de la commande PSTricks % % \def\SphereCreuseThreeD{\pst@object{SphereCreuseThreeD}} \def\SphereCreuseThreeD@i(#1,#2,#3)#4{{% % (#2,#3,#4) coordinates of the center % #5 rayon \begin@ClosedObj \addto@pscode{% \variablesTroisD \ifPst@SphericalCoor /Radius #1 def /longitude #2 def /latitude #3 def /CZ Radius latitude sin mul def /CX Radius longitude cos mul latitude cos mul def /CY Radius longitude sin mul latitude cos mul def \else /CX #1 def /CY #2 def /CZ #3 def \fi reduction reduction scale /Rsphere #4 def /increment 10 def tx@3DDict begin /SphereInside { /condition {PSfacette 0 ge} def /departPhi 0 def MaillageSphere } def %% centre de la base inférieure après transformations /CxFaceInf CX def /CyFaceInf CY def /CzFaceInf CZ def /Xpoint CxFaceInf def /Ypoint CyFaceInf def /Zpoint CzFaceInf def CalculsPointsAfterTransformations /CxBaseInf Xabscisse def /CyBaseInf Yordonnee def /CzBaseInf Zcote def /RXvueInf CxBaseInf XpointVue sub def /RYvueInf CyBaseInf YpointVue sub def /RZvueInf CzBaseInf ZpointVue sub def % Sommet de la sphère /Xpoint 0 def /Ypoint 0 def /Zpoint Rsphere def CalculsPointsAfterTransformations /XsommetSphere Xabscisse def /YsommetSphere Yordonnee def /ZsommetSphere Zcote def % Normale extérieure à la base inférieure /nXBaseInf CxFaceInf XsommetSphere sub def /nYBaseInf CyFaceInf YsommetSphere sub def /nZBaseInf CzFaceInf ZsommetSphere sub def % Visibilité de la base inférieure /PSbaseSphere nXBaseInf RXvueInf mul nYBaseInf RYvueInf mul add nZBaseInf RZvueInf mul add def /base { /TableauxPoints [ 0 1 359 {% on décrit le cercle /theta exch def [ /Xpoint Rsphere theta cos mul def /Ypoint Rsphere theta sin mul def /Zpoint 0 def CalculsPointsAfterTransformations CalcCoordinates ] } for ] def % gsave newpath TableauxPoints 0 get aload pop moveto 0 1 359 { /compteur exch def TableauxPoints compteur get aload pop lineto } for 0.7 setgray closepath % stroke %grestore } def PSbaseSphere 0 le { base clip SphereInside }{ 0 0 0.01 0 360 arc } ifelse end }% fin du code ps \showpointsfalse% \end@ClosedObj }\ignorespaces}% % fin de la commande PSTricks % % 30 novembre 2002 % révisé le 30 octobre 2003 \def\PortionSphereThreeD{\pst@object{PortionSphereThreeD}} \def\PortionSphereThreeD@i(#1,#2,#3)#4{{% % (#2,#3,#4) coordinates of the center % #5 rayon \begin@ClosedObj% \addto@pscode{% \variablesTroisD \ifPst@SphericalCoor /Radius #1 def /longitude #2 def /latitude #3 def /CZ Radius latitude sin mul def /CX Radius longitude cos mul latitude cos mul def /CY Radius longitude sin mul latitude cos mul def \else /CX #1 def /CY #2 def /CZ #3 def \fi reduction reduction scale /Rsphere #4 def /increment 1 def % /increment 2.5 def tx@3DDict begin PortionSphere end }% fin du code ps \showpointsfalse% \end@ClosedObj% }\ignorespaces}% % fin de la commande PSTricks % \catcode`\@=\PstAtCode\relax % %% END: pst-vue3D.tex \endinput