\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}