\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} 
