\documentclass{article} \usepackage{pst-solides3d} \usepackage[latin1]{inputenc} \usepackage[T1]{fontenc} \usepackage[garamond]{mathdesign} \renewcommand{\ttdefault}{lmtt} \usepackage[colorlinks=true]{hyperref} \usepackage[a4paper]{geometry} \usepackage{showexpl} \usepackage[french]{babel} \newcommand\Cadre[1]{\psframebox[fillstyle=solid,fillcolor=yellow,linecolor={[cmyk]{0,0,1,0.1}}]{\texttt{#1}}} \newcommand\encadre[1]{\begin{center} \psframebox[fillstyle=solid,fillcolor=green!33,linecolor=green,linewidth=0.5mm]{ \begin{minipage}{0.95\textwidth} {#1} \end{minipage}} \end{center}} \title{\texttt{pst-solides3d} :\\ les tubes} \date{\today } \begin{document} \maketitle \tableofcontents \newpage \section{Présentation} 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}} \Cadre{pst-solides3d} offre deux possibilités pour dessiner les tubes : \begin{itemize} \item par une commande \texttt{`PSTricks'} et l'option : \begin{itemize} \item \Cadre{object=courbe}, associée au paramètre \item \Cadre{function=nom\_fonction} \end{itemize} \item directement en code \texttt{postscript} dans la commande : \begin{itemize} \item \Cadre{\textbackslash{}codejps\{t1 t2 (nom\_fonction) rayon [n1 n2] newtube\}.} \end{itemize} \end{itemize} Jean-Paul V\textsc{ignault}, pour un meilleur rendu esthétique, a rajouté un effet de torsion le long du tube. \encadre{Il y a l'obligation de calculer préalablement, à la main ou bien avec un logiciel de calcul formel, les dérivées première et seconde des fonctions paramétriques définissant les coordonnées.} \section{Utilisation avec PSTricks} \subsection{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,SphericalCoor=true,viewpoint=100 45 30,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)} \defFunction[algebraic]{F''}(t) {-2.5*cos(t)} {-2.5*sin(t)} {-50*cos(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} \subsection{La courbe filaire s'obtient avec un rayon nul \texttt{[r=0]}} \begin{LTXexample}[width=8cm] \begin{pspicture}(-3.5,-4)(4,4) \psset{lightsrc=80 30 30,SphericalCoor=true,viewpoint=100 45 30,Decran=110} \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)} \defFunction[algebraic]{F''}(t) {-2.5*cos(t)} {-2.5*sin(t)} {-50*cos(5*t)} \psSolid[object=courbe, range=0 6.28, linewidth=2pt,linecolor=blue, function=F, r=0] \end{pspicture} \end{LTXexample} \section{Utilisation avec le \textbackslash{}codejps} \begin{LTXexample}[pos=t] \begin{pspicture}(-3.5,-3.5)(4,3.5) \psset{lightsrc=80 30 30,SphericalCoor=true,viewpoint=100 45 90,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 /xc'' {(-7.5625*cos(2.75*t)*cos(t)+5.50*sin(2.75*t)*sin(t)-(2+cos(2.75*t))*cos(t)) rpn } def /yc'' {(-7.5625*cos(2.75*t)*sin(t)-5.50*sin(2.75*t)*cos(t)-(2+cos(2.75*t))*sin(t)) rpn } def /zc'' {(-7.5625*sin(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 /g'' { % dérivée seconde 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} \section{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}} \subsection{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{SphericalCoor=true,viewpoint=1000 60 20,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)} \defFunction[algebraic]{F''}(t) {-a*cos(t)} {b*(tan(1/2*t)*(1+tan(1/2*t)^2))} {-a*sin(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} \subsection{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{SphericalCoor=true,viewpoint=1000 60 20,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)} \defFunction[algebraic]{F''}(t) {-a*cos(t)} {b*(tan(1/2*t)*(1+tan(1/2*t)^2))} {-a*sin(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} \subsection{Le tracé de la courbe} \begin{LTXexample}[width=9cm] \begin{pspicture}(-5,-3.5)(4,3) \psset{lightsrc=80 30 30} \psset{SphericalCoor=true,viewpoint=100 60 20,Decran=75} \psframe*[linecolor=cyan!30](-4.5,-3)(3.5,3) \psSolid[object=datfile,file=horoptere] \end{pspicture} \end{LTXexample} \section{Autres exemples} \subsection{Une droite} \begin{LTXexample}[width=7cm] \begin{pspicture}(-3.5,-3)(3.5,3) \psset{SphericalCoor=true,viewpoint=100 -20 20,Decran=75} \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} \defFunction[algebraic]{F''}(t){0}{0}{0} \psSolid[object=courbe, range=-4 4, ngrid=16 16, function=F, r=0.5] \end{pspicture} \end{LTXexample} \subsection{Hypocycloïde} \begin{LTXexample}[width=7cm] \begin{pspicture}(-3.5,-4)(3.5,4) \psset{SphericalCoor=true,viewpoint=100 20 45,Decran=75} \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} \defFunction[algebraic]{F''}(t){-4*cos(t)-8*cos(4*t)}{-4*sin(t)+8*sin(4*t)}{0} \psSolid[object=courbe, range=0 6.28, ngrid=90 16, function=F, r=1] \end{pspicture} \end{LTXexample} \subsection{Siège ressort de Gaston} \begin{LTXexample}[width=7cm] \begin{pspicture}(-3.5,-4)(3.5,4) \psset{lightsrc=80 30 30} \psset{SphericalCoor=true,viewpoint=100 20 20,Decran=50} \psframe(-3.5,-4)(3.5,3.5) \uput[u](0,3.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} \defFunction[algebraic]{F''}(t) {2*sin(15*t)+60*t*cos(15*t)-225*(t^2+3)*sin(15*t)} {2*cos(15*t)-60*t*sin(15*t)-225*(t^2+3)*cos(15*t)} {0} \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}