\section{Tubes}

Il s'agit de remplacer une courbe en deux ou trois dimensions (2D ou
3D) définie paramétriquement, par un tube dont la courbe initiale
constituera l'axe et dont on pourra choisir le rayon et le
quadrillage. On trouve des éléments mathématiques concernant ces
objets sur les deux sites suivants~:

\centerline{\url{http://fr.wikipedia.org/wiki/Tube_(math\%C3\%A9matiques)}}

\centerline{\url{http://www.mathcurve.com/surfaces/tube/tube.shtml}}

Comme à l'habitude, le package \verb+pst-solides3d+ offre deux
possibilités pour dessiner les tubes :
\begin{itemize}
  \item via \texttt{`PSTricks'} et l'argument \verb+object+ de
    \verb+\psSolid+ 
  \item directement avec \verb+\codejps+
\end{itemize}

\encadre{Il est souvent préférable de calculer préalablement, à la main ou
  bien avec un logiciel de calcul formel, la dérivée première
  des fonctions paramétriques définissant les coordonnées.}

En effet, si cette dérivée n'est pas explicitement définie par
l'utilisateur, le package fait des calculs approchés, mais le résultat
n'est pas toujours satisfaisant.

\subsection{Utilisation avec PSTricks}

\subsubsection{Donnez du relief à vos courbes}
<<\textit{Donnez du relief à vos courbes}>>, c'est l'intitulé de l'article de Robert F\textsc{erréol} sur :

\centerline{\small\url{http://mapage.noos.fr/r.ferreol/atelecharger/textes/relief/courbes\%20en\%20relief.html}}

à qui j'emprunte la courbe suivante qui est l'analogue d'une courbe de Lissajous enroulée autour d'un cylindre.
\begin{LTXexample}[width=8cm]
\begin{pspicture}(-3.5,-4)(4,4)
\psset{lightsrc=80 30 30,viewpoint=100 45 30 rtp2xyz,Decran=110,linewidth=0.2pt}
\psframe(-3.5,-4)(4,4)
\defFunction[algebraic]{F}(t)
   {2.5*cos(t)}
   {2.5*sin(t)}
   {2*cos(5*t)}
\defFunction[algebraic]{F'}(t)
   {-2.5*sin(t)}
   {2.5*cos(t)}
   {-10*sin(5*t)}
\psSolid[object=courbe,
   range=0 6.28,
   hue=0 1 0.7 1,
   ngrid=360 8,
   function=F,
   r=0.15]
\end{pspicture}
\end{LTXexample}

On a utilisé l'argument \Cadre{[objet=courbe]} avec les paramètres
\Cadre{[r=]}, \Cadre{[function=]} et \Cadre{[range=]} pour spécifier
respectivement le rayon du tube, le nom de la fonction à utiliser et
l'intervalle de définition de la fonction.

On peut également préciser le maillage avec l'argument optionnel
\Cadre{[ngrid=$n_1$ $n_2$]} où $n_2$ représente le nombre de sommets
sur une section du tube (si $n_2 = 6$, on a un tube à section
hexagonale) et $n_1$ représente le nombre de divisions sur la longueur.


\subsubsection{La courbe filaire s'obtient avec un rayon nul \texttt{[r=0]}}

Et du coup, pas la peine de spécifier la fonction dérivée.

\begin{LTXexample}[width=8cm]
\begin{pspicture}(-3.5,-4)(4,4)
\psset{lightsrc=80 30 30,
   viewpoint=100 45 30 rtp2xyz,Decran=110}
\psframe(-3.5,-4)(4,4)
\defFunction[algebraic]{F}(t)
   {2.5*cos(t)}
   {2.5*sin(t)}
   {2*cos(5*t)}
\psSolid[object=courbe,
   range=0 6.28,
   linewidth=2pt,linecolor=blue,
   function=F,
   r=0]
\end{pspicture}
\end{LTXexample}

\subsection{Utilisation avec le \textbackslash{}codejps}

La syntaxe est \Cadre{\textbackslash{}codejps\{t1 t2 (nom\_fonction)
rayon [n1 n2] newtube\}.}


\begin{LTXexample}[pos=t]
\begin{pspicture}(-3.5,-3.5)(4,3.5)
\psset{lightsrc=80 30 30,viewpoint=100 45 90 rtp2xyz,Decran=100,linewidth=0.2pt}
\psframe(-3.5,-3.5)(4,3.5)
\codejps{
/rpn {tx@AlgToPs begin AlgToPs end cvx exec} def
/xc {((2+1*cos(2.75*t))*cos(t)) rpn } def
/yc {((2+1*cos(2.75*t))*sin(t)) rpn } def
/zc {(1*sin(2.75*t)) rpn } def
/xc' {(-2.75*sin(2.75*t)*cos(t)-(2+cos(2.75*t))*sin(t)) rpn } def
/yc' {(-2.75*sin(2.75*t)*sin(t)+(2+cos(2.75*t))*cos(t)) rpn } def
/zc' {(2.75*cos(2.75*t)) rpn } def
/g {
3 dict begin
   /t exch def
xc yc zc
end } def
/g' { % dérivée première
3 dict begin
   /t exch def
xc' yc' zc'
end } def
/solenoide{
% t_min t_max rayon_tube [resolution]
   0 25.2 (g) 0.1 [360 8] newtube
dup [0 1] solidputhuecolors} def
solenoide
drawsolid**
}%
\end{pspicture}
\end{LTXexample}

\subsection{Améliorer la rapidité d'affichage}

La courbe étudiée appelée << \textit{horoptère} >> est issue de la page :

\centerline{\url{http://www.mathcurve.com/courbes3d/horoptere/horoptere.shtml}}

\subsubsection{L'obtention directe de la courbe}
Les lignes suivantes permettent de faire le calcul des points et le
tracé de la courbe. La résolution de la courbe étant élevée, le calcul
prend un temps que certains jugeront trop long.
\begin{verbatim}
\begin{pspicture}(-7,-2)(7,4)
\psset{lightsrc=80 30 30}
\psset{viewpoint=1000 60 20 rtp2xyz,Decran=1000}
\psframe(-7,-2)(7,4)
\psset{solidmemory}
\codejps{/a 2 def /b 2 def}%
\defFunction[algebraic]{F}(t)
   {a*(1+cos(t))}
   {b*tan(t/2)}
   {a*sin(t)}
\defFunction[algebraic]{F'}(t)
   {-a*sin(t)}
   {b*(1+tan(1/2*t)^2)}
   {a*cos(t)}
\psSolid[object=courbe,
   range=-2.7468 2.7468,
   ngrid=72 12,
   function=F,hue=0 1 0.7 1,
   action=none,name=H1,
   r=1]%
\psSolid[object=cylindrecreux,
         h=20,r=1,RotX=90,
         incolor=green!30,action=none,
         name=C1,
         ngrid=36 36](2,10,0)
\psSolid[object=fusion,
   base=H1 C1]
\composeSolid
\end{pspicture}
\end{verbatim}

\subsubsection{La mise en mémoire des paramètres de la courbe}

Si cete courbe doit être utilisée plusieurs fois il est alors
préférable d'enregistrer toutes les caractéristiques de cette courbe :
coordonnées de sommets, liste et couleurs des facettes en remplaçant
la dernière commande par :
\begin{verbatim}
\psSolid[object=fusion,
         base=H1 C1,
         file=horoptere,
         action=writesolid]
\end{verbatim}
La séquence suivante \Cadre{LaTeX fichier.tex->dvips->GSview
  (Windows)ou gv (Linux)} va créer 4 fichiers  :
\begin{itemize}
  \item \texttt{horoptere-couleurs.dat} -> les couleurs des faces ;
  \item \texttt{horoptere-faces.dat} -> la liste des faces ;
  \item \texttt{horoptere-sommets.dat} -> la liste des sommets ;
  \item \texttt{horoptere-io.dat} -> le nombre de faces et de sommets.
\end{itemize}
\encadre{Par défaut, sous Windows et Linux, la protection des fichiers
  du disque dur est activée et ne permet donc pas l'écriture sur le
  disque. Pour désactiver cette protection, tout au moins
  temporairement, voici les deux procédures correspondantes :
\begin{description}
  \item[Linux : ] le conseil de Jean-Michel Sarlat : le plus
simple est donc d'utiliser ghostscript directement, en console. Comme
il n'y a rien à attendre comme image :

\$> gs  -dNOSAFER  fichier.ps quit.ps
  \item[Windows : ] dans le menu \textsf{Options}, l'option
    \textsf{Protection des fichiers} ne doit pas être cochée.
\end{description}}
puis de les faire lire et exécuter avec la commande :
\Cadre{\textbackslash{}psSolid[object=datfile,file=horoptere]}, le
gain de temps est très appréciable !
\begin{verbatim}
\begin{pspicture}(-7,-2)(7,4)
\psset{lightsrc=80 30 30}
\psset{viewpoint=1000 60 20 rtp2xyz,Decran=1000}
\psframe(-7,-2)(7,4)
\psset{solidmemory}
\codejps{/a 2 def /b 2 def}%
\defFunction[algebraic]{F}(t)
   {a*(1+cos(t))}
   {b*tan(t/2)}
   {a*sin(t)}
\defFunction[algebraic]{F'}(t)
   {-a*sin(t)}
   {b*(1+tan(1/2*t)^2)}
   {a*cos(t)}
\psSolid[object=courbe,
   range=-2.7468 2.7468,
   ngrid=72 16,
   function=F,hue=0 1 0.7 1,
   action=none,name=H1,
   r=1]%
\psSolid[object=cylindrecreux,
         h=18,r=1,RotX=90,
         incolor=yellow!50,action=none,
         name=C1,
         ngrid=18 16](2,9,0)
\psSolid[object=fusion,
         base=H1 C1,
         file=horoptere,
         action=writesolid]
\composeSolid
\end{pspicture}
\end{verbatim}



\subsubsection{Le tracé de la courbe}

\begin{LTXexample}[width=9cm]
\begin{pspicture}(-5,-3.5)(4,3)
\psset{lightsrc=80 30 30}
\psset{viewpoint=100 60 20 rtp2xyz,
       Decran=75}
\psframe*[linecolor=cyan!30](-4.5,-3)(3.5,3)
\psSolid[object=datfile,file=horoptere]
\end{pspicture}
\end{LTXexample}


\newpage
\subsection{Autres exemples}


\subsubsection{Une droite}

\begin{LTXexample}[width=7cm]
\begin{pspicture}(-3.5,-2)(3.5,2)
\psset{viewpoint=100 -20 20 rtp2xyz,
       Decran=75,unit=0.8}
\psframe(-3.5,-2)(3.5,2)
\psSolid[object=grille,base=-4 4 -4 4]%
\defFunction[algebraic]{F}(t){t}{t}{0.5}
\defFunction[algebraic]{F'}(t){1}{1}{0}
\psSolid[object=courbe,
   range=-4 4, ngrid=16 16,
   function=F, r=0.5]
\end{pspicture}
\end{LTXexample}



\subsubsection{Hypocycloïde}

\begin{LTXexample}[width=7cm]
\begin{pspicture}(-3.5,-3)(3.5,3)
\psset{viewpoint=100 20 45 rtp2xyz,
       Decran=75,unit=0.8}
\psSolid[object=grille,base=-5 5 -5 5]%
\defFunction[algebraic]{F}(t)
   {4*cos(t) + cos(4*t)/2}
   {4*sin(t) - sin(4*t)/2}
   {1}
\defFunction[algebraic]{F'}(t)
   {-4*sin(t)-2*sin(4*t)}
   {4*cos(t)-2*cos(4*t)}
   {0}
\psSolid[object=courbe,
   range=0 6.28, ngrid=90 16,
   function=F, r=1]
\end{pspicture}
\end{LTXexample}



\subsubsection{Siège ressort de Gaston}
\begin{LTXexample}[width=7cm]
\begin{pspicture}(-3.5,-4)(3.5,4.5)
\psset{lightsrc=80 30 30}
\psset{viewpoint=100 20 20 rtp2xyz,Decran=50}
\psframe(-3.5,-4)(3.5,4.5)
\uput[u](0,3){\includegraphics[scale=0.25]{gaston.eps}}
\defFunction[algebraic]{F}(t)
         {(t^2+3)*sin(15*t)}
         {(t^2+3)*cos(15*t)}
         {2*t}
\defFunction[algebraic]{F'}(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}
\psSolid[object=courbe,
   range=-2 2,
   ngrid=360 6,
   function=F,
   hue=0.2 0.3,
   linewidth=0.1pt,
   r=0.2]
\end{pspicture}
\end{LTXexample}

%%\end{document}





