\chapter{\texttt{pst-solides3d}}
Bien qu'il y ait de nombreux exemples empruntés à
\texttt{pst-solides3d} dans les parties précédentes, cette partie
constitue un hommage au travail des auteurs de ce package. C'est ma
façon de les remercier pour les conseils, les encouragements et les
approfondissements qu'ils m'ont apportés.
\par C'est également ici que l'on trouvera certaines fonctionnalités
avancées {\em non documentées} et/ou {\em non implantées}.
\paragraph{Exemple 1}\hfill\newline
\begin{minipage}{8cm}
  \begin{figurefixe}
    \centering
    \includegraphics[width=7cm]{figures/hommage11.pdf}
    \caption{Une spirale conique}
  \end{figurefixe}
\end{minipage}
\hfill
\begin{minipage}{10cm}
  \begin{lstlisting}[frame=tb]
 %1'9"
 figureespace(-10u,-10u,10u,10u);
 Initialisation(200,20,20,15);
 arcenciel:=true;
 incolor:=gris;
 draw Tuben("(0.5*t*sin(0.707)*cos(t),0.5*sin(0.707)*t*sin(t),-0.5*t*cos(0.707))","(0.5*sin(0.707)*(cos(t)-t*sin(t)),0.5*sin(0.707)*(sin(t)+t*cos(t)),-0.5*cos(0.707))",0.4,-25.4,508,0.1);
 finespace;
\end{lstlisting}
\end{minipage}
\paragraph{Exemple 2}\hfill\newline
  \begin{figure}[!ht]
    \centering
    \includegraphics[scale=0.9]{figures/hommage21.pdf}
    \caption{La surface $z=\dfrac{\sin(x^2+y^2)}3$}
  \end{figure}
\begin{lstlisting}[frame=tb]
 satu:=1;

 %1'9"
 figureespace(-10u,-10u,10u,10u);
 Initialisation(5000,30,30,40);
 arcenciel:=true;
 incolor:=0.9[gris,blanc];
 draw SurfZ("sin((X**2+Y**2)/3)",-5,5,-5,5,90,120);
 TraceAxesD(4,3,3);
 finespace;
\end{lstlisting}
\paragraph{Exemple 3}\hfill\newline
\begin{figure}[!ht]
  \centering
  \includegraphics{figures/hommage31.pdf}
  \caption{La surface $z=xy(x^2-y^2)$}
\end{figure}
\begin{lstlisting}[frame=tb]
 %1"
 figureespace(-10u,-10u,10u,10u);
 Initialisation(500,50,60,40);
 arcenciel:=true;
 incolor:=0.9[gris,blanc];
 draw SurfZ("X*Y*(X**2-Y**2)*0.1",-3,3,-3,3,30,60);
 TraceAxesD(3,3,5);
 finespace;
\end{lstlisting}
\paragraph{Exemple 4}\hfill\newline
\begin{minipage}{8cm}
  \begin{figurefixe}
    \centering
    \includegraphics[width=7cm]{figures/hommage41.pdf}
    \caption{Un coquillage}
  \end{figurefixe}
\end{minipage}
\hfill
\begin{minipage}{10cm}
  \begin{lstlisting}[frame=tb]
 %2"
 figureespace(-10u,-10u,10u,10u);
 Initialisation(2000,20,-10,25);
 arcenciel:=true;
 incolor:=0.5[gris,white];
 draw Sparam("(1.21**v*(sin(u)*cos(u)),1.21**v*(sin(u)**2*sin(v)),1.21**v*(sin(u)**2*cos(v)))",pi/24,11*pi/12,pi/24,0,10*pi/4,pi/24);
 TraceAxesD(8,5,5);
 finespace;
\end{lstlisting}
\end{minipage}
\paragraph{Exemple 5} Cet exemple nous permet d'utiliser le paramètre
\param{\verb!Ferme1!} qui indique si le solide \no1 est \og fermé\fg
(c'est-à-dire sans creux visibles) ou non (c'est-à-dire avec des creux
visibles ou si l'on souhaite voir l'intérieur du solide). L'intérêt
réside dans une diminution du nombre de faces à traiter; ce qui
contribue à un meilleur temps de compilation.\\Ici, les
paramètres \param{\verb!Ferme1!}\ldots sont tous à \texttt{true} : en
effet, on ne souhaite pas voir l'intérieur des champignons.
\begin{figure}
  \centering
  \includegraphics[width=7cm]{figures/hommage51.pdf}
  \caption{Des champignons}
\end{figure}
\begin{lstlisting}[frame=tb]%
 figureespace(-10u,-10u,10u,10u);
 Initialisation(500,20,10,10);
 
 vardef Pp(expr R,h)=(0,0)--
   for k=-33 step 10 until 43:
     (cosd(k)*0.5*h-0.2*h,0.3*h+0.5*h*sind(k))--
   endfor
   for l=0 step 15 until 90:
     (0.8*R*cosd(l)+0.2*R,0.8*R*sind(l)+0.6*h)--
   endfor
   (0,h)
 enddef;%pour la section des champignons

 outcolor:=blanc;
 nb:=30;subh:=15;
 h=10;R=5;
 Ferme1:=true;%pour ne pas tenir compte des faces non vues
 ObjetAnneau1("nbp=18",Pp(R,h));
 angx:=-20;
 outcolor:=0.5[rouge,blanc];
 TR:=(-4,2.5,0);
 h:=5;R:=2.5;
 Ferme2:=true;
 ObjetAnneau2("nbp=18",Pp(R,h));
 angx:=30;
 TR:=(-4,-4,0);
 h:=4;R:=2;
 outcolor:=0.5[jaune,white];
 Ferme3:=true;
 ObjetAnneau3("nbp=18",Pp(R,h));
 nbobj:=3;
 DessineFusion;
 finespace;
\end{lstlisting}
 \paragraph{Exemple 6} Manuel Luque a proposé un
 document\footnote{\url{http://melusine.eu.org/syracuse/mluque/solides3d2007/fusee_tintin/objectif_fusee.pdf}} sur la fusée lunaire utilisée par Tintin dans les deux tomes \og Objetif Lune\fg\ et \og On a marché sur la Lune\fg. J'ai donc repris comme base son travail.
 \begin{figure}[!ht]
   \centering
   \includegraphics{figures/fuseetintin1.pdf}
   \caption{La fusée de Tintin}
 \end{figure}
 \begin{lstlisting}[frame=tb]%
 %Il est nécessaire de redéfinir l'ordre des rotations.
 vardef Transform(expr PT)=RotX(RotY(RotZ(PT)))
 enddef;

 transformation:=true;

 %30"
 figureespace(-10u,-10u,10u,10u);
 fill feuillet;
 for k=1 upto 100:
 fill fullcircle scaled (2*uniformdeviate(1)*mm) shifted((uniformdeviate(1))[coinbg,coinbd]+uniformdeviate(1)*(coinhg-coinbg)) withcolor jaune;
 endfor;
 
 Initialisation(500,-50,20,50);
 unit:=0.2;
 traits:=false;
 angx:=-80;
 angy:=20;
 outcolor:=rouge;
 path rocket[];
 rocket1=(0,4.6)--(-0.8,4.6)--(-0.85,5.6)--(-0.95,6.6)--(-1.05,7.6)--(-1.1,8.6)--(-1.2,9.6);
 rocket2=(-1.2,9.6)--(-1.25,10.6)--(-1.3,11.6)--(-1.35,12.6)--(-1.4,13.6)--(-1.4,14.6)--(-1.375,15.6)--(-1.27,16.6)--(-1.2,17.6)--(-1.05,18.6);
 rocket3=(-1.05,18.6)--(-0.85,19.6)--(-0.65,20.6)--(-0.35,21.6)--(-0.1,22.2)--(-0.1,23.75)--(0,23.75);
 subh:=24;
 path propulsion;
 propulsion=(0,4.6)--(-0.8,4.6)--(0,0);
 perso1:=true;
 Ferme1:=false;
 string couleurperso;
 couleurperso="if ((tapj mod 48)=0) or ((tapj mod 48)=1) or ((tapj mod 48)=2) or ((tapj mod 48)=6) or ((tapj mod 48)=7) or ((tapj mod 48)=8) or ((tapj mod 48)=12) or ((tapj mod 48)=13) or ((tapj mod 48)=14) or ((tapj mod 48)=18) or ((tapj mod 48)=19) or ((tapj mod 48)=20) or ((tapj mod 48)=27) or ((tapj mod 48)=28) or ((tapj mod 48)=29) or ((tapj mod 48)=33) or ((tapj mod 48)=34) or ((tapj mod 48)=35) or ((tapj mod 48)=39) or ((tapj mod 48)=40) or ((tapj mod 48)=41) or ((tapj mod 48)=45) or ((tapj mod 48)=46) or ((tapj mod 48)=47):red else: white fi;";
 ObjetAnneau1("nbp=10",rocket2);
 outcolor:=rouge;
 for k=3 upto 6:
 Ferme[k]:=true;
 endfor;
 incolor:=0.5[jaune,orange];
 Ferme2:=false;
 ObjetAnneau2("nbp=7",rocket1);
 ObjetAnneau3("nbp=7",rocket3);
 Ferme10:=true;
 outcolor:=0.5[jaune,orange];
 ObjetAnneau10("nbp=3",propulsion);
 outcolor:=rouge;
 path amortisseur;
 amortisseur=for k=-90 step 10 until 0:(cosd(k),sind(k)+1)--endfor for k=0 step 2 until 22:(cosd(k)*11.78-10.78,11.78*sind(k)+1)-- endfor (0,5.75);
 TR:=Image((0,-5,0));
 ObjetAnneau4("nbp=22",amortisseur);
 angz:=120;
 TR:=(0,0,0);
 TR:=Image((0,-5,0));
 ObjetAnneau5("nbp=22",amortisseur);
 angz:=-120;
 TR:=(0,0,0);
 TR:=Image((0,-5,0));
 ObjetAnneau6("nbp=22",amortisseur);
 TR:=(0,0,0);
 angz:=0;
 subh:=1;
 ObjetBiface7((0,-0.8,4.6),(0,-0.85,5.6),(0,-0.95,6.6),(0,-1.05,7.6),(0,-1.1,8.6),(0,-1.2,9.6),(0,-2,9.2),(0,-3,8.3),(0,-4,7.2),(0,-5,5.75),(0,-4.5765,4.6402),(0,-4.35,3.8498),(0,-4.1789,3.0456),(0,-4.0645,2.2313),(0,-4.0072,1.4111),(0,-4,1),(0,-3.2,2.2),(0,-2.5,3),(0,-1.6,4));
 angz:=120;
 ObjetBiface8((0,-0.8,4.6),(0,-0.85,5.6),(0,-0.95,6.6),(0,-1.05,7.6),(0,-1.1,8.6),(0,-1.2,9.6),(0,-2,9.2),(0,-3,8.3),(0,-4,7.2),(0,-5,5.75),(0,-4.5765,4.6402),(0,-4.35,3.8498),(0,-4.1789,3.0456),(0,-4.0645,2.2313),(0,-4.0072,1.4111),(0,-4,1),(0,-3.2,2.2),(0,-2.5,3),(0,-1.6,4));
 angz:=-120;
 ObjetBiface9((0,-0.8,4.6),(0,-0.85,5.6),(0,-0.95,6.6),(0,-1.05,7.6),(0,-1.1,8.6),(0,-1.2,9.6),(0,-2,9.2),(0,-3,8.3),(0,-4,7.2),(0,-5,5.75),(0,-4.5765,4.6402),(0,-4.35,3.8498),(0,-4.1789,3.0456),(0,-4.0645,2.2313),(0,-4.0072,1.4111),(0,-4,1),(0,-3.2,2.2),(0,-2.5,3),(0,-1.6,4));
 nbobj:=10;
 DessineFusion;
 clip currentpicture to (fullcircle scaled 16cm);
 finespace;
 end
 \end{lstlisting}
On voit ici apparaître les paramètres \param{\verb!perso!}. Ils ont
été spécialement crées pour cette fusée. En effet, le principal
problème pour définir cette fusée est l'alternance des couleurs
blanche et rouge sur le corps de la fusée. Aussi à l'aide de ces
paramètres, on peut faire adopter un style spécial à un objet. Par
contre, il existe une {\em contrainte} : la définition de ce style
spécial doit se faire par le \texttt{string}
\param{\verb!couleurperso!}.
\par Voici un autre exemple\par
\begin{minipage}{8cm}
  \includegraphics[width=8cm]{figures/torecolore1.pdf}
\end{minipage}
\hfill
\begin{minipage}{9cm}
  \begin{lstlisting}[frame=tb]
 perso1:=true;
 couleurperso:="if ((tapj div subh) mod 3)=0:if (tapj mod 3)=0: rouge elseif (tapj mod 3)=1: noir else: bleu fi elseif ((tapj div subh) mod 3)=1:if (tapj mod 3)=1: rouge elseif (tapj mod 3)=2: noir else: bleu fi elseif ((tapj div subh) mod 3)=2:if (tapj mod 3)=2: rouge elseif (tapj mod 3)=0: noir else: bleu fi fi;";

 nb:=12;
 subh:=18;
 
 figureespace(-10u,-10u,10u,10u);
 Initialisation(1500,30,20,50);
 angy:=25;angz:=-20;
 Objettore1("R=3","r=1");
 AffichageObjet1;
 finespace;
  \end{lstlisting}
\end{minipage}
\paragraph{Exemple 7} Manuel a également construis une
image\footnote{D'autres sont également disponibles à l'adresse
\begin{center}
\url{http://melusine.eu.org/lab/bpst/pst- solides3d/tintin}
\end{center}} melant
le package \texttt{pst-map} et \texttt{pst-solides3d}. Il était
tentant alors de meler \texttt{mp-solides} et \texttt{mp-geo}.
\begin{figure}[!ht]
  \centering
  \includegraphics{figures/Terrefusee1.pdf}
  \caption{La fusée s'éloignant de la Terre}
\end{figure}
\begin{lstlisting}[frame=tb]
%figure obtenue en modifiant un petit peu la macro
 %originelle Mappemonde.
 input mp-geo
 input mp-solid;
 
 vardef mappemonde(expr longobs,latobs)=
   projection:="non";
   Initialisation(5,longobs,latobs,500);
   numeric phim,phip,phii;%phi moins -- phi plus - phi intermediaire
   phim=Phi+arcsind(rayon/Rho)-90;
   phip=Phi+90-arcsind(rayon/Rho);
   color pte[];
   pte1=rayon*(cosd(phim)*cosd(Theta),cosd(phim)*sind(Theta),sind(phim));
   pte2=rayon*(cosd(phip)*cosd(Theta),cosd(phip)*sind(Theta),sind(phip));
   pte3=1/2[pte1,pte2];
   pte4-pte3=Normal((0,0,0),pte1,pte2);
   if (Phi>90):
     phip:=180-phip;
     phii:=180-phim;
     phim:=phip;
     phip:=phii;
   fi;
   if (Phi<-90):
     phip:=-180-phip;
     phii:=-180-phim;
     phim:=phip;
     phip:=phii;
   fi;
   fill cercles(pte3,pte1,pte3,pte1,pte4) withcolor ciel;
   Lecture("Cameriquesud.dat");
   Lecture("Ccaraibes.dat");
   Lecture("Cameriquecentrale.dat");
   Lecture("Cameriquenord.dat");
   Lecture("Casie.dat");
   Lecture("Ceurope.dat");
   Lecture("Cafrique.dat");
   if volcans=true:
     Lecturevolcans;
   fi;
   if lacs=true:
     Lecturelacs;
     Lecturelacssup;
   fi;
   Lectureiles;
   if capitales=true:
     Lecturecapitales;
   fi;
   if fleuves=true:
     Lecturerivieres;
   fi;
   if maillage=true:
     drawoptions(withcolor gris);
     MaillageSphere;
     drawoptions();
   fi;
   if maille=true:
     Maille;
   fi;
   draw cercles(pte3,pte1,pte3,pte1,pte4);
 enddef;

 vardef Transform(expr PT)=RotY(RotX(RotZ(PT)))
 enddef;

 transformation:=true;

 figureespace(-10u,-10u,10u,10u);
 picture terre;
 fleuves:=false;
 lacs:=false;
 capitales:=false;
 terre=image(
   mappemonde(80,20);
 );
 fill feuillet;
 for k=1 upto 100:
   fill fullcircle scaled (2*uniformdeviate(1)*mm) shifted((uniformdeviate(1))[coinbg,coinbd]+uniformdeviate(1)*(coinhg-coinbg)) withcolor jaune;
 endfor;
 draw terre;

 Initialisation(500,160,20,50);
 unit:=0.2;
 traits:=false;
 angy:=-60;
 outcolor:=rouge;
 path rocket[];
 rocket1=(0,4.6)--(-0.8,4.6)--(-0.85,5.6)--(-0.95,6.6)--(-1.05,7.6)--(-1.1,8.6)--(-1.2,9.6);
 rocket2=(-1.2,9.6)--(-1.25,10.6)--(-1.3,11.6)--(-1.35,12.6)--(-1.4,13.6)--(-1.4,14.6)--(-1.375,15.6)--(-1.27,16.6)--(-1.2,17.6)--(-1.05,18.6);
 rocket3=(-1.05,18.6)--(-0.85,19.6)--(-0.65,20.6)--(-0.35,21.6)--(-0.1,22.2)--(-0.1,23.75)--(0,23.75);
 subh:=24;
 perso1:=true;
 Ferme1:=false;
 string couleurperso;
 couleurperso="if ((tapj mod 48)=0) or ((tapj mod 48)=1) or ((tapj mod 48)=2) or ((tapj mod 48)=6) or ((tapj mod 48)=7) or ((tapj mod 48)=8) or ((tapj mod 48)=12) or ((tapj mod 48)=13) or ((tapj mod 48)=14) or ((tapj mod 48)=18) or ((tapj mod 48)=19) or ((tapj mod 48)=20) or ((tapj mod 48)=27) or ((tapj mod 48)=28) or ((tapj mod 48)=29) or ((tapj mod 48)=33) or ((tapj mod 48)=34) or ((tapj mod 48)=35) or ((tapj mod 48)=39) or ((tapj mod 48)=40) or ((tapj mod 48)=41) or ((tapj mod 48)=45) or ((tapj mod 48)=46) or ((tapj mod 48)=47):red else: white fi;";
 TR:=(0,-15,0);
 ObjetAnneau1("nbp=10",rocket2);
 outcolor:=rouge;
 for k=2 upto 6:
 Ferme[k]:=true;
 endfor;
 ObjetAnneau2("nbp=7",rocket1);
 ObjetAnneau3("nbp=7",rocket3);
 path amortisseur;
 amortisseur=for k=-90 step 10 until 0:(cosd(k),sind(k)+1)--endfor for k=0 step 2 until 22:(cosd(k)*11.78-10.78,11.78*sind(k)+1)-- endfor (0,5.75);
 TR:=(0,-15,0)+(0,-5,0);
 ObjetAnneau4("nbp=22",amortisseur);
 angz:=150;
 TR:=(0,0,0);
 TR:=(0,-15,0)+Image((0,-5,0));
 ObjetAnneau5("nbp=22",amortisseur);
 angz:=-90;
 TR:=(0,0,0);
 TR:=(0,-15,0)+Image((0,-5,0));
 ObjetAnneau6("nbp=22",amortisseur);
 TR:=(0,-15,0)+(0,0,0);
 angz:=0;
 subh:=1;
 ObjetBiface7((0,-0.8,4.6),(0,-0.85,5.6),(0,-0.95,6.6),(0,-1.05,7.6),(0,-1.1,8.6),(0,-1.2,9.6),(0,-2,9.2),(0,-3,8.3),(0,-4,7.2),(0,-5,5.75),(0,-4.5765,4.6402),(0,-4.35,3.8498),(0,-4.1789,3.0456),(0,-4.0645,2.2313),(0,-4.0072,1.4111),(0,-4,1),(0,-3.2,2.2),(0,-2.5,3),(0,-1.6,4));
 angz:=150;
 ObjetBiface8((0,-0.8,4.6),(0,-0.85,5.6),(0,-0.95,6.6),(0,-1.05,7.6),(0,-1.1,8.6),(0,-1.2,9.6),(0,-2,9.2),(0,-3,8.3),(0,-4,7.2),(0,-5,5.75),(0,-4.5765,4.6402),(0,-4.35,3.8498),(0,-4.1789,3.0456),(0,-4.0645,2.2313),(0,-4.0072,1.4111),(0,-4,1),(0,-3.2,2.2),(0,-2.5,3),(0,-1.6,4));
 angz:=-90;
 ObjetBiface9((0,-0.8,4.6),(0,-0.85,5.6),(0,-0.95,6.6),(0,-1.05,7.6),(0,-1.1,8.6),(0,-1.2,9.6),(0,-2,9.2),(0,-3,8.3),(0,-4,7.2),(0,-5,5.75),(0,-4.5765,4.6402),(0,-4.35,3.8498),(0,-4.1789,3.0456),(0,-4.0645,2.2313),(0,-4.0072,1.4111),(0,-4,1),(0,-3.2,2.2),(0,-2.5,3),(0,-1.6,4));
 nbobj:=9;
 DessineFusion;
 finespace;
 end
\end{lstlisting}