summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/doc/generic/pst-solides3d/doc/par-transform.tex
blob: 6275861870c9d5f61961c96df87463211bdd5b63 (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
\section{L'option \texttt{transform}}

Avec l'option \Cadre{transform=\ldots}, c'est une formule de
transformation de \textbf{R}$^\textbf 3$ vers \textbf{R}$^\textbf 3$ 
qui va être appliquée à chaque point du solide. 
Dans ce premier exemple, l'objet qui subira la transformation est un
cube. Le cube de référence est en jaune, 
le cube transformé en vert et le cube en fil de fer représente le cube
avant transformation. 

\subsection{Facteur d'échelle identique appliqué aux trois
  coordonnées}

Le facteur d'échelle est pris égal à $0.5$. On l'introduit soit en
définissant la variable `\texttt{/Facteur}' : 
\begin{verbatim}
\pstVerb{/Facteur {.5 mulv3d} def}%
\end{verbatim}
puis en l'introduisant dans l'option `\texttt{transform}' :
\begin{gbar}
\begin{verbatim}
\psSolid[object=cube,a=2,ngrid=3,
         transform=Facteur](2,0,1)%
\end{verbatim}
\end{gbar}
soit directement dans le code :
\begin{gbar}
\begin{verbatim}
\psSolid[object=cube,a=2,ngrid=3,
         transform={.5 mulv3d}](2,0,1)%
\end{verbatim}
\end{gbar}

\textbf{Remarque~:} On vient d'utiliser ici un raccourci jps pour
définir une fonction de de \textbf{R}$^\textbf 3$ vers
\textbf{R}$^\textbf 3$. Une autre méthode aurait été d'utiliser le
code
\begin{verbatim}
\defFunction[algebraic]{matransformation}(x,y,z)
   {.5*x}
   {.5*y}
   {.5*z}
\end{verbatim}
puis de transmettre dans les options
\Cadre{[transform=matransformation]}.
\begin{LTXexample}[pos=t]
\psset{viewpoint=20 60 20 rtp2xyz,lightsrc=10 15 7,Decran=20}
\begin{pspicture}(-5,-5)(6,5)
\psframe(-5,-4)(6,5)
\psSolid[object=grille,base=-4 4 -4 4,fillcolor=red!50]%
\axesIIID(0,0,0)(4,4,4)%
\psSolid[object=cube,fillcolor=yellow!50,
      a=2,ngrid=3](-2,0,1)
\psSolid[object=cube,fillcolor=green!50,
      a=2,transform={.5 mulv3d},
      ngrid=3](2,0,1)
\psSolid[object=cube,
      action=draw,
      a=2,ngrid=3](2,0,1)
\end{pspicture}
\end{LTXexample}

\Cadre{Le facteur d'échelle s'applique aussi aux coordonnées de la
  position du centre du cube.} 

\subsection{Facteur d'échelle différent pour les trois coordonnées}

Prenons, par exemple, que l'on applique un facteur de 0.75 pour $x$, 4
pour $y$ et 0.5 pour $z$, on transforme ainsi un cube en un
parallélépipède en utilisant la fonction \textbf{scaleOpoint3d} de la
librairie jps.
\begin{LTXexample}[pos=t]
\psset{viewpoint=20 60 20 rtp2xyz,lightsrc=10 15 7,Decran=20}
\begin{pspicture}(-5,-5)(6,5)
\psframe(-5,-4)(6,5)
\psSolid[object=grille,base=-4 4 -4 4,fillcolor=red!50]%
\axesIIID(0,0,0)(4,4,4)%
\psSolid[object=cube,
      a=2,ngrid=3](-2,0,1)
\psSolid[object=cube,
      a=2,transform={.75 4 .5 scaleOpoint3d},
      ngrid=3](2,0,1)
\psSolid[object=cube,
      action=draw,
      a=2,ngrid=3](2,0,1)
\end{pspicture}
\end{LTXexample}

\subsection{Transformation liée à la distance du point à l'origine}

Un exemple que l'on va appliquer à un cube :

\begin{equation*}
\left\lbrace\begin{aligned}
x'&=\big(0.5\sqrt{x^2+y^2+z^2}+1-0.5\sqrt{3}\big)x \\
y'&=\big(0.5\sqrt{x^2+y^2+z^2}+1-0.5\sqrt{3}\big)y \\
z'&=\big(0.5\sqrt{x^2+y^2+z^2}+1-0.5\sqrt{3}\big)z
\end{aligned}\right.
\end{equation*}

\begin{LTXexample}[pos=t]
\begin{pspicture}(-3,-4)(3,3)
\psset{viewpoint=20 60 20 rtp2xyz,lightsrc=10 15 7,Decran=20}
\pstVerb{
/gro {
4 dict begin
   /M defpoint3d
   /a .5 def
   /b 1 a 3 sqrt mul sub def
   /k M norme3d a mul b add def
   M k mulv3d
end
} def}%
\psframe*(-3,-4)(3,3)
\psset{linewidth=.02,linecolor=gray}
\psSolid[object=cube,a=3,ngrid=9,
      transform=gro]%
\end{pspicture}
\end{LTXexample}
%\newpage

\subsection{Torsion d'une poutre}

Le solide de départ est un prisme de hauteur 10 cm de 20 étages
(\texttt{ngrid=20 2}). À chaque étage, on applique une rotation
supplémentaire 
d'axe $Oz$ et de valeur 10$^{\mathrm{o}}$ par exemple. Comme les
niveaux sont espacés de $0,5$~cm, on multiplie $z\times20$. 

\begin{LTXexample}[pos=t]
\psset{viewpoint=50 50 20 rtp2xyz,lightsrc=25 37 17,Decran=50,unit=0.75}
\begin{pspicture}(-3,-1)(3.5,10)
\psframe(-3,-1)(3,10)
\psSolid[object=grille,base=-2 2 -2 2,ngrid=8]%
\psSolid[object=prisme,h=10,ngrid=20 2,
        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]%
\end{pspicture}
\begin{pspicture}(-3.5,-1)(3,10)
\psframe(-3,-1)(3,10)
\psSolid[object=grille,base=-2 2 -2 2,ngrid=8]%
\pstVerb{
/torsion {
2 dict begin
   /M defpoint3d % on récupère les coordonnées
   M /z exch def pop pop 
   % on tourne de 10 degrés à chaque niveau
    M 0 0 z 20 mul rotateOpoint3d
end} def}%
\psSolid[object=prisme,h=10,ngrid=20 2,
        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,
        transform=torsion]%
\end{pspicture}
\end{LTXexample}