\chapter{Dessinons !}
\begin{flushleft}
  {\em Je compterai toujours, pour ma part, au nombre des heures les
    plus douces, les plus heureuses de ma vie, celles où j'ai pu
    saisir dans l'espace et étudier sans trève quelques-uns de ces
    êtres géométriques qui flottent en quelque sorte autour de nous.}
\par\hfill{\sc Gaston Darboux}
\end{flushleft}
\section{La lecture externe}
Avant de se lancer dans les calculs, profitons du fait que de nombreux
logiciels de contruction 3D exportent leurs données dans divers
formats de fichiers. Pourquoi donc ne pas s'en servir, couplé à \MP,
pour représenter de tels objets ?
\subsection{Les fichiers \texttt{OFF}}
Si vous disposez d'un
fichier \texttt{toto.off}, on l'utilisera comme ceci :
\begin{center}
  \macro{\verb!LectureOFF("toto.off")!}
\end{center}
\begin{Danger}
  \begin{itemize}
    \item Avant l'utilisation des fichiers \verb!OFF!, il faudra
      s'assurer qu'ils aient une syntaxe du type
      \begin{lstlisting}[frame=tb]
        nbsommets nbfaces
        
        x1 y1 z1
        x2 y2 z2
        ...
        nbsommetsface1 1 2 3
        nbsommetsface2 2 3 4
        ...
      \end{lstlisting}
    \item Suivant les fichiers \texttt{OFF}, il y aura deux paramètres
      à modifier : \param{\texttt{echelle}} qui applique un coefficient
      divisant les données numériques du fichier par la valeur
      choisie; \param{\texttt{debut}} qui indiquera quel est le chiffre
      correspondant au premier sommet (bien souvent, c'est 0 mais pour
      quelques fichiers, cela peut-être 1).
    \item Le paramètre \param{\texttt{invnormale}} devra {\em parfois} être
      adapté. Par défaut, il est à 1. On devra le mettre parfois comme
      étant égal à $-1$.
    \end{itemize}
\end{Danger}
\begin{figure}[h]
\centering
\includegraphics[scale=0.9]{figures/OFF1.pdf}
\caption{Un tricératops.}
\end{figure}
\begin{minipage}{\linewidth}
  \begin{lstlisting}[frame=tb]
%fichier off:http://www.irit.fr/~Loic.Barthe/Enseignements/TPs_OpenGL/L3_IUP_SI/TP7/Maillages/triceratops.off
echelle:=2;
debut:=0;

invnormale:=-1;

figureespace(-10u,-10u,10u,10u);
Initialisation(500,-25,10,50);
outcolor:=0.8*white;
incolor:=gris;
LectureOFF("triceratops.off");
finespace;
  \end{lstlisting}
\end{minipage}
\par
L'exemple\footnote{Assez long en compilation, 28 secondes environ.}
ci-dessous montre un {\em noeud creusé}. Pour cela, on a un paramètre
 booléen \verb!Creux! (positionné à \verb!true! par défaut) qui
 permet d'indiquer si le solide envisagé est creusé ou pas. Ce
 paramètre n'est, pour le moment, disponible que pour la lecture des
 fichiers externes.
\par\noindent
\begin{minipage}{6cm}
  \includegraphics[scale=0.5]{figures/OFF11.pdf}
\end{minipage}
\hfill
\begin{minipage}{10cm}
  \begin{lstlisting}[frame=tb]
 %www-c.inria.fr/gamma/download/download.php
 echelle:=2; debut:=1;
 Creux:=false;
 outcolor:=0.5[jaune,white];
 incolor:=0.5[bleu,white];

 figureespace(-10u,-10u,10u,10u);
 Initialisation(500,-25,10,50);
 LectureOFF("10-61.off");
 finespace;
  \end{lstlisting}
\end{minipage}
\par
Pour ne pas abuser, un dernier exemple.\\
\begin{minipage}{6cm}
  \includegraphics[scale=0.7]{figures/OFF21.pdf}
\end{minipage}
\hfill
\begin{minipage}{10cm}
  \begin{lstlisting}[frame=tb]
 echelle:=5;
 debut:=1;
 arcenciel:=true;
 invnormale:=-1;
 figureespace(-10u,-10u,10u,10u);
 Initialisation(500,30,20,50);
 LectureOFF("5_1.pc.off");
 finespace;
  \end{lstlisting}
\end{minipage}
\subsection{Les fichiers \texttt{OBJ}}
Si vous disposez d'un
fichier \texttt{toto.obj}, on l'utilisera comme ceci :
\begin{center}
  \macro{\verb!LectureOBJ("toto.obj")!}
\end{center}
\begin{Danger}
  \begin{itemize}
    \item Avant l'utilisation des fichiers \verb!OBJ!, il faudra
      s'assurer qu'ils aient une syntaxe du type
      \begin{lstlisting}[frame=tb]
        v x1 y1 z1
        v x2 y2 z2
        ...
        v xn yn zn
        f nbsommetsface1 1 2 3 ...
        f nbsommetsface2 2 3 4 ...
        ...
      \end{lstlisting}
      \par En effet, certains fichiers \texttt{OBJ} contiennent
      également les descriptions des vecteurs normaux aux faces. Ils
      ne sont pas nécessaires pour nous car \MP\ fait les calculs
      nécessaires\footnote{Il pourrait cependant être utile d'utiliser
        directement de tels fichiers pour gagner du temps de compilation.}.
    \item Suivant les fichiers \texttt{OBJ}, il y aura à modifier le paramètre \param{\texttt{echelle}}.
    \item Le paramètre \param{\texttt{invnormale}} devra {\em parfois} être
      adapté. Par défaut, il est à 1. On devra le mettre parfois comme
      étant égal à $-1$.
    \end{itemize}
\end{Danger}
\begin{minipage}{8cm}
  \includegraphics[width=8cm]{figures/OBJ1.pdf}
\end{minipage}
\hfill
\begin{minipage}{10cm}
  \begin{lstlisting}[frame=tb]
%http://www-c.inria.fr/gamma/download/
echelle:=50;

figureespace(-10u,-10u,10u,20u);
Initialisation(2500,80,-70,50);
outcolor:=0.7[rose,white];
incolor:=jaune;
LectureOBJ("../../data/Midpoly_04.obj");
finespace;
  \end{lstlisting}
\end{minipage}
\par
\begin{minipage}{8cm}
  \includegraphics[width=8cm]{figures/OBJ11.pdf}
\end{minipage}
\hfill
\begin{minipage}{10cm}
  \begin{lstlisting}[frame=tb]
%http://www-c.inria.fr/gamma/download/
%avec modification
echelle:=0.25;

figureespace(-10u,-10u,10u,20u);
Initialisation(2500,-80,80,50);
outcolor:=0.7[rose,white];
incolor:=jaune;
LectureOBJ("../../data/Y3483.obj");
finespace;
  \end{lstlisting}
\end{minipage}
\section{Les courbes}
%\subsection{\ldots du type $(x,y,z)=(f(t),g(t),h(t))$}
Pour tracer une fonction du type $M(x,y,z)=(f(t),g(t),h(t))$, on
utilisera la macro
\texttt{Fonction}.
\begin{center}
  \macro{\verb!Fonction(expr fn,tmin,tmax,pas)!}
\end{center}
où \param{\verb!fn!} est un type \verb!string! donnant les fonctions $f$, $g$
et $h$ (ne pas oublier de la mettre sous forme d'un triplet);
\param{\verb!tmin!} et \param{\verb!tmax!} sont les bornes de
l'intervalle de tracé et \param{\verb!pas!} le pas d'incrémentation
pour positionner les points et les relier ensuite.
\par\begin{minipage}{6cm}
  \includegraphics{figures/courbe11.pdf}
\end{minipage}
\hfill
\begin{minipage}{10cm}
  \begin{lstlisting}[frame=tb]
 figureespace(-10u,-10u,10u,10u);
 Initialisation(5,30,50,20);
 draw Fonction("(sin(t),cos(t),t/3)",-2,25,0.01);
 finespace;
 \end{lstlisting}
\end{minipage}
\par
\begin{minipage}{6cm}
  \includegraphics[scale=0.7]{figures/courbe21.pdf}
\end{minipage}
\hfill
\begin{minipage}{10cm}
  \begin{lstlisting}[frame=tb]
 figureespace(-10u,-10u,10u,10u);
 Initialisation(5,30,20,20);
 draw Fonction("(cos(t)*(1+abs(t)/5),1.5*sin(t),0.2*t)",-15,15,0.1);
 finespace;
 \end{lstlisting}
\end{minipage}
\subsection{Les tubes : 1\ier\ essai}
On a une amélioration graphique : la possibilité de tracer les courbes
sous forme de tube avec la macro \verb!Tube! :
\begin{center}
  \macro{\texttt{Tube(expr Fn,dp,ds,rayon,tmin,nbp,pas)}}
\end{center}
où \param{\verb!Fn!}, \param{\verb!dp!} et \param{\verb!ds!} sont des
types \texttt{string} représentant respectivement la fonction de
référence sur laquelle le tube est construit; la dérivée première et
la dérivée seconde. Pourquoi ? Pour calculer les vecteurs $(\vecteur
T, \vecteur N, \vecteur B)$ constituant le repère de Frenet local
attaché à la courbe. Il est d'ailleurs vivement recommandé de les
calculer à la main ou à l'aide d'un logiciel de calcul formel.
\\Une fois ceci fait, \param{\texttt{tmin}} la valeur du paramètre de départ,
\param{\texttt{nbp}} le nombre de pas voulus, \param{\texttt{pas}} le
pas pour passer d'un point à un autre.
\par
Voici plusieurs exemples pour que ce soit plus clair:
\par
\begin{minipage}{7.5cm}
  \includegraphics[width=7.5cm]{figures/npresentation1.pdf}
\end{minipage}
\hfill
\begin{minipage}{10cm}
  \begin{lstlisting}[frame=tb]
 figureespace(-10u,-20u,10u,10u);
 Initialisation(1000,15,70,50);
 outcolor:=0.5[green,white];
 draw Tube("(2*cosd(t)+cosd(3*t),2*sind(t)-sind(3*t),2*sqrt(2)*sind(2*t))","(-2*sind(t)-3*sind(3*t),2*cosd(t)-3*cosd(3*t),4*sqrt(2)*cosd(2*t))","(-2*cosd(t)-9*cosd(3*t),-2*sind(t)+9*sind(3*t),-8*sqrt(2)*sind(2*t))",0.1,90,180,1.5);
 finespace;
 end
\end{lstlisting}
\end{minipage}
\par
\begin{minipage}{7.5cm}
  \includegraphics[width=7.5cm]{figures/courbe12.pdf}
\end{minipage}
\hfill
\begin{minipage}{10cm}
  \begin{lstlisting}[frame=tb]
 figureespace(-10u,-10u,10u,10u);
 Initialisation(5,30,50,20);
outcolor:=0.5[red,white];
 draw Tube("(sin(t),cos(t),t/3)","(cos(t),-sin(t),1/3)","(-sin(t),-cos(t),0)",0.1,-2,270,0.1);
 finespace;
\end{lstlisting}
\end{minipage}
\par
\begin{minipage}{7.5cm}
  \includegraphics[width=7.5cm]{figures/courbe22.pdf}
\end{minipage}
\hfill
\begin{minipage}{10cm}
  \begin{lstlisting}[frame=tb]
 figureespace(-10u,-20u,10u,10u);
 Initialisation(5,30,20,20);
 outcolor:=0.5[blue,white];
 draw Tube("(cos(t)*(1+abs(t)/5),1.5*sin(t),0.2*t)","if t>=0:(-sin(t)*(1+t/5)+cos(t)/5,1.5*cos(t),0.2) else: (-sin(t)*(1-t/5)-cos(t)/5,1.5*cos(t),0.2) fi", "if t>=0:(-cos(t)*(1+t/5)-2*sin(t)/5,-1.5*sin(t),0) else: (-cos(t)*(1-t/5)+2*sin(t)/5,-1.5*sin(t),0) fi",0.075,-15,300,0.1);
 finespace;
\end{lstlisting}
\end{minipage}
\par
\begin{minipage}{7.5cm}
  \includegraphics[width=7.5cm]{figures/npresentation2.pdf}
\end{minipage}
\hfill
\begin{minipage}{10cm}
\begin{lstlisting}[frame=tb]
 figureespace(-10u,-20u,10u,10u);
 Initialisation(1000,15,20,50);
 outcolor:=0.5[jaune,white];
 draw Tube("(cos(t),1.5*sin(t),0.2*t)","(-sin(t),1.5*cos(t),0.2)","(-cos(t),-1.5*sin(t),0)",0.1,0,180,0.1);
 finespace;
\end{lstlisting}
\end{minipage}
\subsection{Les tubes : 2\ieme\ essai}
Cependant, pour obtenir l'image ci-dessous tirée de la documentation de
\texttt{pst-solides3d}\footnote{Mais celle présente dans cette
  documentation a été compilée par \MP.}, cela ne marche pas !
\begin{figure}[h]
  \centering
  \includegraphics[scale=0.5]{figures/hypotube1.pdf}
  \caption{Hypocycloïde en tube}
  \label{fig-hypotube}
\end{figure}
J'ai donc crée une deuxième macro permettant de construire de telles
figures. En fait, le problème venait de l'inversion des normales au
passage des points d'inflexion. De plus, grâce à un document trouvé
sur la toile\footnote{Malheureusement, je ne dispose plus de
  l'adresse. Par contre, l'auteur est Loïc {\sc Barthe} de l'équipe
  Vortex de l'IRIT-UPS Toulouse.}, il n'est plus nécessaire d'utiliser
la dérivée seconde. La macro utilisable est 
\begin{center}
  \macro{\verb!Tuben(expr Fn,dp,rayon,tmin,nbp,pas,couleur)!}
\end{center}
avec les mêmes conventions que lors du premier essai. Pour obtenir la
figure \ref{fig-hypotube}, on utilisera alors le code
\begin{lstlisting}[frame=tb]
 figureespace(-10u,-10u,10u,10u);

 nb:=16;  unit:=0.8;

 Initialisation(1000,20,45,37.5);
 for k=-5 upto 5:
  draw Projette((k,-5,0))--Projette((k,5,0));
  draw Projette((-5,k,0))--Projette((5,k,0));
 endfor;
 eclairage:=false;
 outcolor:=blanc;
 draw Tuben("(4*cos(t)+cos(4*t)/2,4*sin(t)-sin(4*t)/2,1)","(-4*sin(t)-2*sin(4*t),4*cos(t)-2*cos(4*t),0)",1,0,102,0.06283);

 finespace;
\end{lstlisting}
\`A noter que le paramètre \param{\verb!unit!} permet de faire un
agrandissement (ou une réduction) de la figure. Par défaut,
\texttt{unit=1}. De plus, il existe le paramètre \param{\verb!nb!} qui permet
de moduler le nombre de points sur le cercle permettant de tracer le tube.
\par Et pour finir, étant fan de Gaston Lagaffe, je me permets de reprendre
le ressort-siège de la documentation de \texttt{pst-solides3d}.
\par\begin{minipage}{8cm}
  \begin{figurefixe}
    \centering
    \includegraphics[width=6cm]{figures/ressortgaston1.pdf}
    \caption{Siège-ressort de Gaston Lagaffe}
    \label{fig:exsyr1}
  \end{figurefixe}
\end{minipage}
\hfill
\begin{minipage}{9cm}
  \begin{lstlisting}[frame=tb]
 figureespace(-10u,-10u,10u,10u);

 nb:=6;
 Initialisation(1000,20,20,25);
 arcenciel:=true;
 draw Tuben("((t**2+3)*sin(15*t),(t**2+3)*cos(15*t),2*t)","(2*t*sin(15*t)+15*((t**2)+3)*cos(15*t),2*t*cos(15*t)-15*((t**2)+3)*sin(15*t),2)",0.2,-2,360,1/90);

 finespace;
 
  \end{lstlisting}
\end{minipage}
\section{Les surfaces}
\subsection{Les surfaces en $z$}
De la forme $z=f(x,y)$, on utilisera alors
\begin{center}
  \macro{\verb!Surfz(fn,xmin,xmax,ymin,ymax,nbl,nbp)!}
\end{center}
avec \param{\verb!fn!} la fonction écrite sous un type \verb!string!,
\param{\verb!xmin!}, \param{\verb!xmax!}, \param{\verb!ymin!} et \param{\verb!ymax!} les bornes des
intervalles de tracés, \param{\verb!nbl!} le nombre de lignes suivant les
$y$\footnote{Il en est ainsi car j'ai suivi la méthode décrite
  dans le livre de Raymond Dony. Il est à noter également que pour des
  impératifs de temps de compilation et de poids des images, les deux
  paramètres \param{\verb!nbp!} et \param{\verb!nbl!} sont des multiples de 3.} et
\param{\verb!nbp!} le nombre de points utilisés sur chaque ligne pour tracer
la surface.
\par Les trois exemples ci-dessous ont donné des temps de compilation
de l'ordre de 40 secondes.
\par
\begin{lstlisting}[frame=tb]
 verbatimtex
 %&latex
 \documentclass[12pt]{article}
 \usepackage{fourier}
 \begin{document}
 etex

 invnormalelum:=-1;

 figureespace(-10u,-10u,10u,10u);
 Initialisation(300,15,35.264,10);
 incolor:=0.5[green,white];
 outcolor:=0.25[orange,white];
 draw SurfZ("4*cos(X++Y)*mexp(-(X++Y)*50)",-15,15,-10,10,60,150);
 label(btex $f(z)=4*\cos\left(\sqrt{x^2+y^2}\right)*\textrm{e}^{-50*\sqrt{x^2+y^2}}\mbox{ avec }\left\{\begin{array}{l}
     x\in[-15,15]\\
     y\in[-10,10]\\
   \end{array}
 \right.$ etex,u*(0,-5));
 finespace;
  \end{lstlisting}
\[\includegraphics{figures/Surfz11.pdf}\]
\begin{lstlisting}[frame=tb]
 verbatimtex
 %&latex
 \documentclass[12pt]{article}
 \usepackage{fourier}
 \usepackage{amsmath}
 \begin{document}
 etex
 
 invnormalelum:=-1;

 figureespace(-10u,-10u,10u,10u);
 Initialisation(300,70,30,10);
 incolor:=0.5[jaune,white];
 outcolor:=0.8[violet,white];
 arcenciel:=true;
 draw SurfZ("if (X=0) and (Y=0):10 else:10*sin((X++Y))/(X++Y) fi",-8,8,-8,8,60,150);
 label(btex $f(z)=10\times\dfrac{\sin\left(\sqrt{x^2+y^2}\right)}{\sqrt{x^2+y^2}}\mbox{ avec }\left\{\begin{array}{l}
     x\in[-8,8]\\
     y\in[-8,8]\\
   \end{array}
 \right.$ etex,u*(0,-4));
 finespace;
\end{lstlisting}
\par
\[\includegraphics{figures/Surfz21.pdf}\]
\L'exemple précédent montre l'utilisation du paramètre
\param{\texttt{invnormalelum}} permettant d'opposer la normale permettant la
détermination de la quantité lumineuse. De plus, la gestion de la
lumière est un peu différente lors du tracé des surfaces en $z$. En
effet, on a parfois besoin de voir ce qui se passe dans la partie cachée\ldots
\begin{lstlisting}[frame=tb]
 verbatimtex
 % &latex
 \documentclass[12pt]{article}
 \usepackage{fourier}
 \usepackage{amsmath}
 \begin{document}
 etex
 
  invnormalelum:=-1;

 figureespace(-10u,-10u,10u,10u);
 Initialisation(300,45,35,10);
 incolor:=0.5[jaune,white];
 outcolor:=0.8[violet,white];
 draw SurfZ("if X=0:if Y=0:10 else:10*sin(Y)/Y fi else:if Y=0:10*sin(X)/X else: 10*sin(X)/X*sin(Y)/Y fi fi",-10,10,-12,12,60,150);
 label(btex $f(z)=10\times\dfrac{\sin x}x\dfrac{\sin y}y\mbox{ avec }\left\{\begin{array}{l}
     x\in[-10,10]\\
     y\in[-12,12]\\
   \end{array}
 \right.$ etex,u*(0,-4));
 finespace;
 end
\end{lstlisting}
\[\includegraphics{figures/Surfz31.pdf}\]
\subsection{\ldots paramétrées $M(u,v)=(f(u,v),g(u,v),h(u,v))$}
\begin{Danger}
  Attention, il faut une orientation correcte des faces créees. Il sera
  donc nécessaire d'utiliser, {\em parfois}, \param{\texttt{invnormale}}.
\end{Danger}
Utilisons la macro
\begin{center}
  \macro{\verb!Sparam(expr fn,umin,umax,upas,vmin,vmax,vpas)!}
\end{center}
où \param{\texttt{fn}} est un type \texttt{string} représentant la fonction
$M(u,v)$ donnée sous forme d'un triplet; les autres paramètres parlant
d'eux mêmes.
\\Voici plusieurs exemples :
\par%\vfill\par
\begin{minipage}{6cm}
\includegraphics[width=5cm]{figures/Sparam11.pdf}  
\end{minipage}
\hfill
\begin{minipage}{10cm}
  \begin{lstlisting}[frame=tb]
 figureespace(-10u,-10u,10u,10u);
 Initialisation(500,-30,15,75);
 outcolor:=0.5[red,white];
 incolor:=0.5[jaune,white];
 draw Sparam("((1+0.5*cos(u))*cos(v),(1+0.5*cos(u))*sin(v),0.5*sin(u))",-pi,pi/12,pi/15,2*pi/3,2*pi,pi/20);
 finespace;
  \end{lstlisting}
\end{minipage}
\par\vfill\par
\begin{minipage}{6cm}
\includegraphics[width=5cm]{figures/Sparam31.pdf}  
\end{minipage}
\hfill
\begin{minipage}{10cm}
  \begin{lstlisting}[frame=tb]
 figureespace(-10u,-10u,10u,10u);
 Initialisation(50,-110,10,100);
 outcolor:=0.5[orange,white];
 incolor:=0.25[gris,white];
 draw Sparam("(u,v,u*u-v*v)",-1,1,0.05,-1,1,0.05);
 finespace;
  \end{lstlisting}
\end{minipage}
\par\vfill\par
\begin{minipage}{6cm}
\includegraphics[width=5cm]{figures/Sparam51.pdf}  
\end{minipage}
\hfill
\begin{minipage}{10cm}
  \begin{lstlisting}[frame=tb]
 figureespace(-10u,-10u,10u,10u);
 Initialisation(500,10,20,100);
 incolor:=0.75[jaune,white];
 outcolor:=0.5[green,white];
 draw Sparam("(u*cos(v)*sin(pi/6),u*sin(v)*sin(pi/6),u*cos(pi/6))",-2,-0.1,0.2,-2.6,2.6,0.2);
 finespace;
  \end{lstlisting}
\end{minipage}
\par\vfill\par
\begin{minipage}{6cm}
\includegraphics[width=5cm]{figures/Sparam81.pdf}  
\end{minipage}
\hfill
\begin{minipage}{10cm}
  \begin{lstlisting}[frame=tb]
 figureespace(-10u,-10u,10u,10u);
 Initialisation(50,0,-20,100);
 incolor:=0.75[orange,white];
 outcolor:=0.5[blue,white];
 draw Sparam("(cos(v)*sqrt(1+u*u),sin(v)*sqrt(1+u*u),0.6*u)",-1,1.5,0.1,-5*pi/6,5*pi/6,pi/36);
 finespace;
  \end{lstlisting}
\end{minipage}
\par\vfill\par
\begin{minipage}{9cm}
\begin{figurefixe}
\centering
\includegraphics[width=7.5cm]{figures/Sparam91.pdf}
\caption{Une nappe cylindrique}
\label{fig:exsyr2}
\end{figurefixe}
\end{minipage}
\hfill
\begin{minipage}{9cm}
  \begin{lstlisting}[frame=tb]
 figureespace(-10u,-10u,10u,10u);
 Initialisation(100,5,10,25);
 incolor:=0.5[jaune,white];
 outcolor:=0.75[violet,blanc];
 drawarrow Projette((0,0,0))--Projette((0,3,3)) withpen pencircle scaled2bp;
 for l=-1 upto 5:
   draw Projette((l,-1,0))--Projette((l,5,0)) withcolor gris;
   draw Projette((-1,l,0))--Projette((5,l,0)) withcolor gris;
 endfor;
 TraceAxes;
 drawarrow Projette((0,0,0))--Projette((0,3,3)) withpen pencircle scaled2bp;
 draw Sparam("(6*(cos(u)**3)*sin(u),4*cos(u)*cos(u)+v,v)",0,2*pi,pi/30,0,2*sqrt(2),0.1);
 finespace;
  \end{lstlisting}
\end{minipage}
\subsection{Les solides de révolution}
C'est un cas particulier des surfaces paramétrées. La syntaxe est donc
très voisine :
\begin{center}
  \macro{\verb!Revolution(fn,umin,umax,upas,vmin,vmax,vpas)!}
\end{center}
avec les mêmes notations que précédemment {\em sauf} que \param{\verb!fn!}
doit représenter un chemin \MP. Voici quelques exemples.
\par\begin{minipage}{6cm}
  \includegraphics[width=6cm]{figures/revolution11.pdf}
\end{minipage}
\hfill
\begin{minipage}{10cm}
  \begin{lstlisting}[frame=tb]
 r=2; R=8; h=3;
 
 path pp;
 pp=(R,-h/2)--((R+r)/2,h/2)--(r,-h/2)--cycle;
 
 incolor:=0.5[jaune,white];
 outcolor:=0.8[bleu,white];
 
 figureespace(-10u,-10u,10u,10u);
 Initialisation(500,30,40,25);
 draw Revolution("pp",0,length pp,0.1,0,2*pi,pi/12);
 finespace;
\end{lstlisting}
\end{minipage}
\par\begin{minipage}{6cm}
  \includegraphics[width=6cm]{figures/revolution21.pdf}
\end{minipage}
\hfill
\begin{minipage}{10cm}
  \begin{lstlisting}[frame=tb]
 r=3; R=8; h=6;
 
 path pp;
 pp=(r,h/2)--(r,-h/2)--(R,-h/2)--(R,-h/2+1)--(R-1.5,-h/2+1)--(R-1.5,h/2-1)--(R,h/2-1)--(R,h/2)--cycle;
 
 incolor:=0.5[jaune,white];
 outcolor:=0.8[bleu,white];
 
 figureespace(-10u,-10u,10u,10u);
 Initialisation(500,30,20,25);
 draw Revolution("pp",0,length pp,0.25,0,2*pi,pi/12);
 finespace;
  \end{lstlisting}
\end{minipage}
\par Et pour tirer profit des courbes de Bezier
\par\begin{minipage}{6cm}
  \includegraphics[width=6cm]{figures/revolution31.pdf}
\end{minipage}
\hfill
\begin{minipage}{10cm}
  \begin{lstlisting}[frame=tb]
 path pp;
 pp=(3,-7)..(1,-6)..(5,0.5)..(5,3)..(1,3)..(1,4)..(2,5);
 
 incolor:=0.5[jaune,white];
 outcolor:=0.8[bleu,white];
 
 figureespace(-10u,-10u,10u,10u);
 Initialisation(500,30,20,25);
 draw Revolution("pp",0,length pp,0.2,0,2*pi,pi/12);
 finespace;
  \end{lstlisting}
\end{minipage}