%% This is file `pst-vue3d.tex',
%%
%% IMPORTANT NOTICE:
%%
%% Package `pst-vue3d.tex'
%%
%% Manuel Luque <Mluque5130@aol.com> (France)
%% Herbert Voss <voss _at_ pstricks.de (Germany)
%%
%% 2008/02/21
%%
%% 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-vue3d' is a PSTricks package to define 3d views
%% ChangeLog (at end)
%%
\csname PSTVueTroisDLoaded\endcsname
\let\PSTVueTroisDLoaded\endinput
% Require PSTricks and pst-node packages
\ifx\PSTricksLoaded\endinput\else\input pstricks.tex\fi
\ifx\PSTnodesLoaded\endinput\else\input pst-node.tex\fi
\ifx\PSTthreeDLoaded\endinput\else\input pst-3d.tex\fi
\ifx\PSTXKeyLoaded\endinput\else\input pst-xkey\fi
%
\def\fileversion{1.24}%
\def\filedate{2008/02/21}%
\message{`pst-vue3d v\fileversion, \filedate\space (ML,hv)}%
\edef\PstAtCode{\the\catcode`\@}\catcode`\@=11\relax
\pst@addfams{pst-vue3d}% for pst-xkey
%%%%
\define@key[psset]{pst-vue3d}{scale}{\def\psk@TroisD@scale{#1}} % echelle
\define@key[psset]{pst-vue3d}{RotX}{\def\psk@TroisD@RotX{#1}} % rotation autour de Ox en degrés
\define@key[psset]{pst-vue3d}{RotY}{\def\psk@TroisD@RotY{#1}} % rotation autour de Oy en degrés
\define@key[psset]{pst-vue3d}{RotZ}{\def\psk@TroisD@RotZ{#1}} % rotation autour de OZ en degrés
\define@key[psset]{pst-vue3d}{A}{\def\psk@TroisD@A{#1}} % double  d'une arête du parallèlépipède
\define@key[psset]{pst-vue3d}{B}{\def\psk@TroisD@B{#1}} % double  d'une arête du parallèlépipède
\define@key[psset]{pst-vue3d}{C}{\def\psk@TroisD@C{#1}} % double  de l'arête du parallèlépipède
\define@key[psset]{pst-vue3d}{Rtetraedre}{\def\psk@TroisD@Rtetraedre{#1}} % Rayon du cercle tétraèdre
\define@key[psset]{pst-vue3d}{ColorFaceA}{\def\psk@TroisD@TetraedreColorFaceA{#1}} % couleur de la face A du tétraèdre
\define@key[psset]{pst-vue3d}{ColorFaceB}{\def\psk@TroisD@TetraedreColorFaceB{#1}} % couleur de la face B du tétraèdre
\define@key[psset]{pst-vue3d}{ColorFaceC}{\def\psk@TroisD@TetraedreColorFaceC{#1}} % couleur de la face C du tétraèdre
\define@key[psset]{pst-vue3d}{ColorFaceD}{\def\psk@TroisD@TetraedreColorFaceD{#1}} % couleur de la face D du tétraèdre
\define@key[psset]{pst-vue3d}{ColorFaceE}{\def\psk@TroisD@TetraedreColorFaceE{#1}} % couleur de la face D du tétraèdre
\define@key[psset]{pst-vue3d}{fracHeight}{\def\psk@TroisD@fracHeight{#1}} % fraction de la hauteur du cone
\define@key[psset]{pst-vue3d}{fracHcone}{\def\psk@TroisD@fracHeight{#1}} % for compatibility
%
\define@key[psset]{pst-vue3d}{normaleLongitude}{\def\psk@TroisD@normaleLongitude{#1}} % coordonnées angulaires de la normale
\define@key[psset]{pst-vue3d}{normaleLatitude}{\def\psk@TroisD@normaleLatitude{#1}} % coordonnées angulaires de la normale
\define@key[psset]{pst-vue3d}{pas}{\def\psk@TroisD@pas{#1}} % en cm résolution du tracé
\define@key[psset]{pst-vue3d}{grille}{\def\psk@TroisD@grille{#1}} % Pas de la grille en cm
%
\define@key[psset]{pst-vue3d}{THETA}{\def\psk@TroisD@Theta{#1}}
\define@key[psset]{pst-vue3d}{PHI}{\def\psk@TroisD@Phi{#1}}
\define@key[psset]{pst-vue3d}{DeltaTHETA}{\def\psk@TroisD@DeltaTheta{#1}}
\define@key[psset]{pst-vue3d}{DeltaPHI}{\def\psk@TroisD@DeltaPhi{#1}}
\define@key[psset]{pst-vue3d}{PortionSphereTHETA}{\def\psk@TroisD@PortionSphereTHETA{#1}}
\define@key[psset]{pst-vue3d}{PortionSpherePHI}{\def\psk@TroisD@PortionSpherePHI{#1}}
\define@key[psset]{pst-vue3d}{PhiCercle}{\def\psk@TroisD@PhiCercle{#1}}
\define@key[psset]{pst-vue3d}{ThetaMeridien}{\def\psk@TroisD@ThetaMeridien{#1}}
\define@key[psset]{pst-vue3d}{Dobs}{\def\psk@TroisD@Dobs{#1}}
\define@key[psset]{pst-vue3d}{Decran}{\def\psk@TroisD@Ecran{#1}}
%
\psset[pst-vue3d]{THETA=30,PHI=10,%
    Dobs=100,Decran=10,%
    normaleLongitude=45,%
    normaleLatitude=45,%
    PhiCercle=0,%
    ThetaMeridien=0,%
    pas=1,%
    grille=10,%
    scale=1,%
    RotX=0,RotY=0,RotZ=0,%
    A=10,B=10,C=10,%
    Rtetraedre=5,%
    ColorFaceD=cyan,ColorFaceA=magenta,ColorFaceB=red,%
    ColorFaceC=blue,ColorFaceE=yellow,%
    fracHeight=1,%
    DeltaTHETA=10,DeltaPHI=10,%
    PortionSphereTHETA=0,PortionSpherePHI=0}
% ajout du 28 août 2003
% colorier au choix les faces du cube
\define@key[psset]{pst-vue3d}{CubeColorFaceOne}{\def\psk@TroisD@CubeColorFaceOne{#1}} % couleur de la face 1 du cube
\define@key[psset]{pst-vue3d}{CubeColorFaceTwo}{\def\psk@TroisD@CubeColorFaceTwo{#1}} % couleur de la face 2 du cube
\define@key[psset]{pst-vue3d}{CubeColorFaceThree}{\def\psk@TroisD@CubeColorFaceThree{#1}} % couleur de la face 3 du cube
\define@key[psset]{pst-vue3d}{CubeColorFaceFour}{\def\psk@TroisD@CubeColorFaceFour{#1}} % couleur de la face 4 du cube
\define@key[psset]{pst-vue3d}{CubeColorFaceFive}{\def\psk@TroisD@CubeColorFaceFive{#1}} % couleur de la face 5 du cube
\define@key[psset]{pst-vue3d}{CubeColorFaceSix}{\def\psk@TroisD@CubeColorFaceSix{#1}} % couleur de la face 6 du cube
\psset[pst-vue3d]{CubeColorFaceOne= 1 1 0 ,
    CubeColorFaceTwo= 0.9 0.9 0 ,
    CubeColorFaceThree= 0.8 0.8 0 ,
    CubeColorFaceFour= 0.7 0.7 0 ,
    CubeColorFaceFive= 0.6 0.6 0 ,
    CubeColorFaceSix= 0.5 0.5 0 }
% fin 28 août 2003
% ajout 27 octobre 2003
\define@boolkey[psset]{pst-vue3d}[Pst@]{CubeInside}[true]{}
\psset[pst-vue3d]{CubeInside=false}
% hv 2003-12-20
\define@boolkey[psset]{pst-vue3d}[Pst@]{SphericalCoor}[true]{}
\psset[pst-vue3d]{SphericalCoor=false}
%
\def\variablesTroisD{%
 0 0 translate
% hv 2005-04-30   --->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

