Initialisation du projet pst-solides3d.git (SVN revision 142)
[pst-solides3d.git] / doc / par-tube.tex
1 \section{Tubes}
2
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~:
8
9 \centerline{\url{http://fr.wikipedia.org/wiki/Tube_(math\%C3\%A9matiques)}}
10
11 \centerline{\url{http://www.mathcurve.com/surfaces/tube/tube.shtml}}
12
13 Comme à l'habitude, le package \verb+pst-solides3d+ offre deux
14 possibilités pour dessiner les tubes :
15 \begin{itemize}
16 \item via \texttt{`PSTricks'} et l'argument \verb+object+ de
17 \verb+\psSolid+
18 \item directement avec \verb+\codejps+
19 \end{itemize}
20
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.}
24
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.
28
29 \subsection{Utilisation avec PSTricks}
30
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 :
33
34 \centerline{\small\url{http://mapage.noos.fr/r.ferreol/atelecharger/textes/relief/courbes\%20en\%20relief.html}}
35
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)
42 {2.5*cos(t)}
43 {2.5*sin(t)}
44 {2*cos(5*t)}
45 \defFunction[algebraic]{F'}(t)
46 {-2.5*sin(t)}
47 {2.5*cos(t)}
48 {-10*sin(5*t)}
49 \psSolid[object=courbe,
50 range=0 6.28,
51 hue=0 1 0.7 1,
52 ngrid=360 8,
53 function=F,
54 r=0.15]
55 \end{pspicture}
56 \end{LTXexample}
57
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.
62
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.
67
68
69 \subsubsection{La courbe filaire s'obtient avec un rayon nul \texttt{[r=0]}}
70
71 Et du coup, pas la peine de spécifier la fonction dérivée.
72
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)
79 {2.5*cos(t)}
80 {2.5*sin(t)}
81 {2*cos(5*t)}
82 \psSolid[object=courbe,
83 range=0 6.28,
84 linewidth=2pt,linecolor=blue,
85 function=F,
86 r=0]
87 \end{pspicture}
88 \end{LTXexample}
89
90 \subsection{Utilisation avec le \textbackslash{}codejps}
91
92 La syntaxe est \Cadre{\textbackslash{}codejps\{t1 t2 (nom\_fonction)
93 rayon [n1 n2] newtube\}.}
94
95
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)
100 \codejps{
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
108 /g {
109 3 dict begin
110 /t exch def
111 xc yc zc
112 end } def
113 /g' { % dérivée première
114 3 dict begin
115 /t exch def
116 xc' yc' zc'
117 end } def
118 /solenoide{
119 % t_min t_max rayon_tube [resolution]
120 0 25.2 (g) 0.1 [360 8] newtube
121 dup [0 1] solidputhuecolors} def
122 solenoide
123 drawsolid**
124 }%
125 \end{pspicture}
126 \end{LTXexample}
127
128 \subsection{Améliorer la rapidité d'affichage}
129
130 La courbe étudiée appelée << \textit{horoptère} >> est issue de la page :
131
132 \centerline{\url{http://www.mathcurve.com/courbes3d/horoptere/horoptere.shtml}}
133
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.
138 \begin{verbatim}
139 \begin{pspicture}(-7,-2)(7,4)
140 \psset{lightsrc=80 30 30}
141 \psset{viewpoint=1000 60 20 rtp2xyz,Decran=1000}
142 \psframe(-7,-2)(7,4)
143 \psset{solidmemory}
144 \codejps{/a 2 def /b 2 def}%
145 \defFunction[algebraic]{F}(t)
146 {a*(1+cos(t))}
147 {b*tan(t/2)}
148 {a*sin(t)}
149 \defFunction[algebraic]{F'}(t)
150 {-a*sin(t)}
151 {b*(1+tan(1/2*t)^2)}
152 {a*cos(t)}
153 \psSolid[object=courbe,
154 range=-2.7468 2.7468,
155 ngrid=72 12,
156 function=F,hue=0 1 0.7 1,
157 action=none,name=H1,
158 r=1]%
159 \psSolid[object=cylindrecreux,
160 h=20,r=1,RotX=90,
161 incolor=green!30,action=none,
162 name=C1,
163 ngrid=36 36](2,10,0)
164 \psSolid[object=fusion,
165 base=H1 C1]
166 \composeSolid
167 \end{pspicture}
168 \end{verbatim}
169
170 \subsubsection{La mise en mémoire des paramètres de la courbe}
171
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 :
176 \begin{verbatim}
177 \psSolid[object=fusion,
178 base=H1 C1,
179 file=horoptere,
180 action=writesolid]
181 \end{verbatim}
182 La séquence suivante \Cadre{LaTeX fichier.tex->dvips->GSview
183 (Windows)ou gv (Linux)} va créer 4 fichiers :
184 \begin{itemize}
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.
189 \end{itemize}
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 :
194 \begin{description}
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 :
198
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.
202 \end{description}}
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 !
206 \begin{verbatim}
207 \begin{pspicture}(-7,-2)(7,4)
208 \psset{lightsrc=80 30 30}
209 \psset{viewpoint=1000 60 20 rtp2xyz,Decran=1000}
210 \psframe(-7,-2)(7,4)
211 \psset{solidmemory}
212 \codejps{/a 2 def /b 2 def}%
213 \defFunction[algebraic]{F}(t)
214 {a*(1+cos(t))}
215 {b*tan(t/2)}
216 {a*sin(t)}
217 \defFunction[algebraic]{F'}(t)
218 {-a*sin(t)}
219 {b*(1+tan(1/2*t)^2)}
220 {a*cos(t)}
221 \psSolid[object=courbe,
222 range=-2.7468 2.7468,
223 ngrid=72 16,
224 function=F,hue=0 1 0.7 1,
225 action=none,name=H1,
226 r=1]%
227 \psSolid[object=cylindrecreux,
228 h=18,r=1,RotX=90,
229 incolor=yellow!50,action=none,
230 name=C1,
231 ngrid=18 16](2,9,0)
232 \psSolid[object=fusion,
233 base=H1 C1,
234 file=horoptere,
235 action=writesolid]
236 \composeSolid
237 \end{pspicture}
238 \end{verbatim}
239
240
241
242 \subsubsection{Le tracé de la courbe}
243
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,
248 Decran=75}
249 \psframe*[linecolor=cyan!30](-4.5,-3)(3.5,3)
250 \psSolid[object=datfile,file=horoptere]
251 \end{pspicture}
252 \end{LTXexample}
253
254
255 \newpage
256 \subsection{Autres exemples}
257
258
259 \subsubsection{Une droite}
260
261 \begin{LTXexample}[width=7cm]
262 \begin{pspicture}(-3.5,-2)(3.5,2)
263 \psset{viewpoint=100 -20 20 rtp2xyz,
264 Decran=75,unit=0.8}
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,
271 function=F, r=0.5]
272 \end{pspicture}
273 \end{LTXexample}
274
275
276
277 \subsubsection{Hypocycloïde}
278
279 \begin{LTXexample}[width=7cm]
280 \begin{pspicture}(-3.5,-3)(3.5,3)
281 \psset{viewpoint=100 20 45 rtp2xyz,
282 Decran=75,unit=0.8}
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}
287 {1}
288 \defFunction[algebraic]{F'}(t)
289 {-4*sin(t)-2*sin(4*t)}
290 {4*cos(t)-2*cos(4*t)}
291 {0}
292 \psSolid[object=courbe,
293 range=0 6.28, ngrid=90 16,
294 function=F, r=1]
295 \end{pspicture}
296 \end{LTXexample}
297
298
299
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)
308 {(t^2+3)*sin(15*t)}
309 {(t^2+3)*cos(15*t)}
310 {2*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)}
314 {2}
315 \psSolid[object=courbe,
316 range=-2 2,
317 ngrid=360 6,
318 function=F,
319 hue=0.2 0.3,
320 linewidth=0.1pt,
321 r=0.2]
322 \end{pspicture}
323 \end{LTXexample}
324
325 %%\end{document}
326
327
328
329
330

Licence Creative Commons Les fichiers de Syracuse sont mis à disposition (sauf mention contraire) selon les termes de la
Licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International.