summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/doc/generic/pst-solides3d/doc/par-tube.tex
blob: e7a9560aa8f484cb3fa50b64790c50585d6dc5b9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
\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}