Initialisation du projet pst-solides3d.git (SVN revision 142)
[pst-solides3d.git] / doc / .svn / text-base / par-tube.tex.svn-base
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.