3 Il s'agit de remplacer une courbe en deux ou trois dimensions (
2D ou
4 3D) définie paramétriquement, par un tube dont la courbe initiale
5 constituera l'axe et dont on pourra choisir le rayon et le
6 quadrillage. On trouve des éléments mathématiques concernant ces
7 objets sur les deux sites suivants~:
9 \centerline{\url{http://fr.wikipedia.org/wiki/Tube_(math\%C3\%A9matiques)
}}
11 \centerline{\url{http://www.mathcurve.com/surfaces/tube/tube.shtml
}}
13 Comme à l'habitude, le package
\verb+pst-solides3d+ offre deux
14 possibilités pour dessiner les tubes :
16 \item via
\texttt{`PSTricks'
} et l'argument
\verb+object+ de
18 \item directement avec
\verb+
\codejps+
21 \encadre{Il est souvent préférable de calculer préalablement, à la main ou
22 bien avec un logiciel de calcul formel, la dérivée première
23 des fonctions paramétriques définissant les coordonnées.
}
25 En effet, si cette dérivée n'est pas explicitement définie par
26 l'utilisateur, le package fait des calculs approchés, mais le résultat
27 n'est pas toujours satisfaisant.
29 \subsection{Utilisation avec PSTricks
}
31 \subsubsection{Donnez du relief à vos courbes
}
32 <<
\textit{Donnez du relief à vos courbes
}>>, c'est l'intitulé de l'article de Robert F
\textsc{erréol
} sur :
34 \centerline{\small\url{http://mapage.noos.fr/r.ferreol/atelecharger/textes/relief/courbes\%
20en\%
20relief.html
}}
36 à qui j'emprunte la courbe suivante qui est l'analogue d'une courbe de Lissajous enroulée autour d'un cylindre.
37 \begin{LTXexample
}[width=
8cm
]
38 \begin{pspicture
}(-
3.5,-
4)(
4,
4)
39 \psset{lightsrc=
80 30 30,viewpoint=
100 45 30 rtp2xyz,Decran=
110,linewidth=
0.2pt
}
40 \psframe(-
3.5,-
4)(
4,
4)
41 \defFunction[algebraic
]{F
}(t)
45 \defFunction[algebraic
]{F'
}(t)
49 \psSolid[object=courbe,
58 On a utilisé l'argument
\Cadre{[objet=courbe
]} avec les paramètres
59 \Cadre{[r=
]},
\Cadre{[function=
]} et
\Cadre{[range=
]} pour spécifier
60 respectivement le rayon du tube, le nom de la fonction à utiliser et
61 l'intervalle de définition de la fonction.
63 On peut également préciser le maillage avec l'argument optionnel
64 \Cadre{[ngrid=$n_1$ $n_2$
]} où $n_2$ représente le nombre de sommets
65 sur une section du tube (si $n_2 =
6$, on a un tube à section
66 hexagonale) et $n_1$ représente le nombre de divisions sur la longueur.
69 \subsubsection{La courbe filaire s'obtient avec un rayon nul
\texttt{[r=
0]}}
71 Et du coup, pas la peine de spécifier la fonction dérivée.
73 \begin{LTXexample
}[width=
8cm
]
74 \begin{pspicture
}(-
3.5,-
4)(
4,
4)
75 \psset{lightsrc=
80 30 30,
76 viewpoint=
100 45 30 rtp2xyz,Decran=
110}
77 \psframe(-
3.5,-
4)(
4,
4)
78 \defFunction[algebraic
]{F
}(t)
82 \psSolid[object=courbe,
84 linewidth=
2pt,linecolor=blue,
90 \subsection{Utilisation avec le
\textbackslash{}codejps
}
92 La syntaxe est
\Cadre{\textbackslash{}codejps\
{t1 t2 (nom
\_fonction)
93 rayon
[n1 n2
] newtube\
}.
}
96 \begin{LTXexample
}[pos=t
]
97 \begin{pspicture
}(-
3.5,-
3.5)(
4,
3.5)
98 \psset{lightsrc=
80 30 30,viewpoint=
100 45 90 rtp2xyz,Decran=
100,linewidth=
0.2pt
}
99 \psframe(-
3.5,-
3.5)(
4,
3.5)
101 /rpn
{tx@AlgToPs begin AlgToPs end cvx exec
} def
102 /xc
{((
2+
1*cos(
2.75*t))*cos(t)) rpn
} def
103 /yc
{((
2+
1*cos(
2.75*t))*sin(t)) rpn
} def
104 /zc
{(
1*sin(
2.75*t)) rpn
} def
105 /xc'
{(-
2.75*sin(
2.75*t)*cos(t)-(
2+cos(
2.75*t))*sin(t)) rpn
} def
106 /yc'
{(-
2.75*sin(
2.75*t)*sin(t)+(
2+cos(
2.75*t))*cos(t)) rpn
} def
107 /zc'
{(
2.75*cos(
2.75*t)) rpn
} def
113 /g'
{ % dérivée première
119 % t_min t_max rayon_tube [resolution]
120 0 25.2 (g)
0.1 [360 8] newtube
121 dup
[0 1] solidputhuecolors
} def
128 \subsection{Améliorer la rapidité d'affichage
}
130 La courbe étudiée appelée <<
\textit{horoptère
} >> est issue de la page :
132 \centerline{\url{http://www.mathcurve.com/courbes3d/horoptere/horoptere.shtml
}}
134 \subsubsection{L'obtention directe de la courbe
}
135 Les lignes suivantes permettent de faire le calcul des points et le
136 tracé de la courbe. La résolution de la courbe étant élevée, le calcul
137 prend un temps que certains jugeront trop long.
139 \begin{pspicture
}(-
7,-
2)(
7,
4)
140 \psset{lightsrc=
80 30 30}
141 \psset{viewpoint=
1000 60 20 rtp2xyz,Decran=
1000}
144 \codejps{/a
2 def /b
2 def
}%
145 \defFunction[algebraic
]{F
}(t)
149 \defFunction[algebraic
]{F'
}(t)
153 \psSolid[object=courbe,
154 range=-
2.7468 2.7468,
156 function=F,hue=
0 1 0.7 1,
159 \psSolid[object=cylindrecreux,
161 incolor=green!
30,action=none,
164 \psSolid[object=fusion,
170 \subsubsection{La mise en mémoire des paramètres de la courbe
}
172 Si cete courbe doit être utilisée plusieurs fois il est alors
173 préférable d'enregistrer toutes les caractéristiques de cette courbe :
174 coordonnées de sommets, liste et couleurs des facettes en remplaçant
175 la dernière commande par :
177 \psSolid[object=fusion,
182 La séquence suivante
\Cadre{LaTeX fichier.tex->
dvips->GSview
183 (Windows)ou gv (Linux)
} va créer
4 fichiers :
185 \item \texttt{horoptere-couleurs.dat
} -> les couleurs des faces ;
186 \item \texttt{horoptere-faces.dat
} -> la liste des faces ;
187 \item \texttt{horoptere-sommets.dat
} -> la liste des sommets ;
188 \item \texttt{horoptere-io.dat
} -> le nombre de faces et de sommets.
190 \encadre{Par défaut, sous Windows et Linux, la protection des fichiers
191 du disque dur est activée et ne permet donc pas l'écriture sur le
192 disque. Pour désactiver cette protection, tout au moins
193 temporairement, voici les deux procédures correspondantes :
195 \item[Linux :
] le conseil de Jean-Michel Sarlat : le plus
196 simple est donc d'utiliser ghostscript directement, en console. Comme
197 il n'y a rien à attendre comme image :
199 \$> gs -dNOSAFER fichier.ps quit.ps
200 \item[Windows :
] dans le menu
\textsf{Options
}, l'option
201 \textsf{Protection des fichiers
} ne doit pas être cochée.
203 puis de les faire lire et exécuter avec la commande :
204 \Cadre{\textbackslash{}psSolid
[object=datfile,file=horoptere
]}, le
205 gain de temps est très appréciable !
207 \begin{pspicture
}(-
7,-
2)(
7,
4)
208 \psset{lightsrc=
80 30 30}
209 \psset{viewpoint=
1000 60 20 rtp2xyz,Decran=
1000}
212 \codejps{/a
2 def /b
2 def
}%
213 \defFunction[algebraic
]{F
}(t)
217 \defFunction[algebraic
]{F'
}(t)
221 \psSolid[object=courbe,
222 range=-
2.7468 2.7468,
224 function=F,hue=
0 1 0.7 1,
227 \psSolid[object=cylindrecreux,
229 incolor=yellow!
50,action=none,
232 \psSolid[object=fusion,
242 \subsubsection{Le tracé de la courbe
}
244 \begin{LTXexample
}[width=
9cm
]
245 \begin{pspicture
}(-
5,-
3.5)(
4,
3)
246 \psset{lightsrc=
80 30 30}
247 \psset{viewpoint=
100 60 20 rtp2xyz,
249 \psframe*
[linecolor=cyan!
30](-
4.5,-
3)(
3.5,
3)
250 \psSolid[object=datfile,file=horoptere
]
256 \subsection{Autres exemples
}
259 \subsubsection{Une droite
}
261 \begin{LTXexample
}[width=
7cm
]
262 \begin{pspicture
}(-
3.5,-
2)(
3.5,
2)
263 \psset{viewpoint=
100 -
20 20 rtp2xyz,
265 \psframe(-
3.5,-
2)(
3.5,
2)
266 \psSolid[object=grille,base=-
4 4 -
4 4]%
267 \defFunction[algebraic
]{F
}(t)
{t
}{t
}{0.5}
268 \defFunction[algebraic
]{F'
}(t)
{1}{1}{0}
269 \psSolid[object=courbe,
270 range=-
4 4, ngrid=
16 16,
277 \subsubsection{Hypocycloïde
}
279 \begin{LTXexample
}[width=
7cm
]
280 \begin{pspicture
}(-
3.5,-
3)(
3.5,
3)
281 \psset{viewpoint=
100 20 45 rtp2xyz,
283 \psSolid[object=grille,base=-
5 5 -
5 5]%
284 \defFunction[algebraic
]{F
}(t)
285 {4*cos(t) + cos(
4*t)/
2}
286 {4*sin(t) - sin(
4*t)/
2}
288 \defFunction[algebraic
]{F'
}(t)
289 {-
4*sin(t)-
2*sin(
4*t)
}
290 {4*cos(t)-
2*cos(
4*t)
}
292 \psSolid[object=courbe,
293 range=
0 6.28, ngrid=
90 16,
300 \subsubsection{Siège ressort de Gaston
}
301 \begin{LTXexample
}[width=
7cm
]
302 \begin{pspicture
}(-
3.5,-
4)(
3.5,
4.5)
303 \psset{lightsrc=
80 30 30}
304 \psset{viewpoint=
100 20 20 rtp2xyz,Decran=
50}
305 \psframe(-
3.5,-
4)(
3.5,
4.5)
306 \uput[u
](
0,
3)
{\includegraphics[scale=
0.25]{gaston.eps
}}
307 \defFunction[algebraic
]{F
}(t)
311 \defFunction[algebraic
]{F'
}(t)
312 {2*t*sin(
15*t)+
15*(t^
2+
3)*cos(
15*t)
}
313 {2*t*cos(
15*t)-
15*(t^
2+
3)*sin(
15*t)
}
315 \psSolid[object=courbe,