Initialisation du projet pst-solides3d.git (SVN revision 142)
[pst-solides3d.git] / doc / .svn / text-base / par-transform.tex.svn-base
1 \section{L'option \texttt{transform}}
2
3 Avec l'option \Cadre{transform=\ldots}, c'est une formule de
4 transformation de \textbf{R}$^\textbf 3$ vers \textbf{R}$^\textbf 3$ 
5 qui va être appliquée à chaque point du solide. 
6 Dans ce premier exemple, l'objet qui subira la transformation est un
7 cube. Le cube de référence est en jaune, 
8 le cube transformé en vert et le cube en fil de fer représente le cube
9 avant transformation. 
10
11 \subsection{Facteur d'échelle identique appliqué aux trois
12   coordonnées}
13
14 Le facteur d'échelle est pris égal à $0.5$. On l'introduit soit en
15 définissant la variable `\texttt{/Facteur}' : 
16 \begin{verbatim}
17 \pstVerb{/Facteur {.5 mulv3d} def}%
18 \end{verbatim}
19 puis en l'introduisant dans l'option `\texttt{transform}' :
20 \begin{gbar}
21 \begin{verbatim}
22 \psSolid[object=cube,a=2,ngrid=3,
23          transform=Facteur](2,0,1)%
24 \end{verbatim}
25 \end{gbar}
26 soit directement dans le code :
27 \begin{gbar}
28 \begin{verbatim}
29 \psSolid[object=cube,a=2,ngrid=3,
30          transform={.5 mulv3d}](2,0,1)%
31 \end{verbatim}
32 \end{gbar}
33
34 \textbf{Remarque~:} On vient d'utiliser ici un raccourci jps pour
35 définir une fonction de de \textbf{R}$^\textbf 3$ vers
36 \textbf{R}$^\textbf 3$. Une autre méthode aurait été d'utiliser le
37 code
38 \begin{verbatim}
39 \defFunction[algebraic]{matransformation}(x,y,z)
40    {.5*x}
41    {.5*y}
42    {.5*z}
43 \end{verbatim}
44 puis de transmettre dans les options
45 \Cadre{[transform=matransformation]}.
46 \begin{LTXexample}[pos=t]
47 \psset{viewpoint=20 60 20 rtp2xyz,lightsrc=10 15 7,Decran=20}
48 \begin{pspicture}(-5,-5)(6,5)
49 \psframe(-5,-4)(6,5)
50 \psSolid[object=grille,base=-4 4 -4 4,fillcolor=red!50]%
51 \axesIIID(0,0,0)(4,4,4)%
52 \psSolid[object=cube,fillcolor=yellow!50,
53       a=2,ngrid=3](-2,0,1)
54 \psSolid[object=cube,fillcolor=green!50,
55       a=2,transform={.5 mulv3d},
56       ngrid=3](2,0,1)
57 \psSolid[object=cube,
58       action=draw,
59       a=2,ngrid=3](2,0,1)
60 \end{pspicture}
61 \end{LTXexample}
62
63 \Cadre{Le facteur d'échelle s'applique aussi aux coordonnées de la
64   position du centre du cube.} 
65
66 \subsection{Facteur d'échelle différent pour les trois coordonnées}
67
68 Prenons, par exemple, que l'on applique un facteur de 0.75 pour $x$, 4
69 pour $y$ et 0.5 pour $z$, on transforme ainsi un cube en un
70 parallélépipède en utilisant la fonction \textbf{scaleOpoint3d} de la
71 librairie jps.
72 \begin{LTXexample}[pos=t]
73 \psset{viewpoint=20 60 20 rtp2xyz,lightsrc=10 15 7,Decran=20}
74 \begin{pspicture}(-5,-5)(6,5)
75 \psframe(-5,-4)(6,5)
76 \psSolid[object=grille,base=-4 4 -4 4,fillcolor=red!50]%
77 \axesIIID(0,0,0)(4,4,4)%
78 \psSolid[object=cube,
79       a=2,ngrid=3](-2,0,1)
80 \psSolid[object=cube,
81       a=2,transform={.75 4 .5 scaleOpoint3d},
82       ngrid=3](2,0,1)
83 \psSolid[object=cube,
84       action=draw,
85       a=2,ngrid=3](2,0,1)
86 \end{pspicture}
87 \end{LTXexample}
88
89 \subsection{Transformation liée à la distance du point à l'origine}
90
91 Un exemple que l'on va appliquer à un cube :
92
93 \begin{equation*}
94 \left\lbrace\begin{aligned}
95 x'&=\big(0.5\sqrt{x^2+y^2+z^2}+1-0.5\sqrt{3}\big)x \\
96 y'&=\big(0.5\sqrt{x^2+y^2+z^2}+1-0.5\sqrt{3}\big)y \\
97 z'&=\big(0.5\sqrt{x^2+y^2+z^2}+1-0.5\sqrt{3}\big)z
98 \end{aligned}\right.
99 \end{equation*}
100
101 \begin{LTXexample}[pos=t]
102 \begin{pspicture}(-3,-4)(3,3)
103 \psset{viewpoint=20 60 20 rtp2xyz,lightsrc=10 15 7,Decran=20}
104 \pstVerb{
105 /gro {
106 4 dict begin
107    /M defpoint3d
108    /a .5 def
109    /b 1 a 3 sqrt mul sub def
110    /k M norme3d a mul b add def
111    M k mulv3d
112 end
113 } def}%
114 \psframe*(-3,-4)(3,3)
115 \psset{linewidth=.02,linecolor=gray}
116 \psSolid[object=cube,a=3,ngrid=9,
117       transform=gro]%
118 \end{pspicture}
119 \end{LTXexample}
120 %\newpage
121
122 \subsection{Torsion d'une poutre}
123
124 Le solide de départ est un prisme de hauteur 10 cm de 20 étages
125 (\texttt{ngrid=20 2}). À chaque étage, on applique une rotation
126 supplémentaire 
127 d'axe $Oz$ et de valeur 10$^{\mathrm{o}}$ par exemple. Comme les
128 niveaux sont espacés de $0,5$~cm, on multiplie $z\times20$. 
129
130 \begin{LTXexample}[pos=t]
131 \psset{viewpoint=50 50 20 rtp2xyz,lightsrc=25 37 17,Decran=50,unit=0.75}
132 \begin{pspicture}(-3,-1)(3.5,10)
133 \psframe(-3,-1)(3,10)
134 \psSolid[object=grille,base=-2 2 -2 2,ngrid=8]%
135 \psSolid[object=prisme,h=10,ngrid=20 2,
136         base=0.5 0 0.5 0.5 0 0.5 -0.5 0.5 -0.5 0 -0.5 -0.5 0 -0.5 0.5 -0.5]%
137 \end{pspicture}
138 \begin{pspicture}(-3.5,-1)(3,10)
139 \psframe(-3,-1)(3,10)
140 \psSolid[object=grille,base=-2 2 -2 2,ngrid=8]%
141 \pstVerb{
142 /torsion {
143 2 dict begin
144    /M defpoint3d % on récupère les coordonnées
145    M /z exch def pop pop 
146    % on tourne de 10 degrés à chaque niveau
147     M 0 0 z 20 mul rotateOpoint3d
148 end} def}%
149 \psSolid[object=prisme,h=10,ngrid=20 2,
150         base=0.5 0 0.5 0.5 0 0.5 -0.5 0.5 -0.5 0 -0.5 -0.5 0 -0.5 0.5 -0.5,
151         transform=torsion]%
152 \end{pspicture}
153 \end{LTXexample} 

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.