\documentclass{article}
\usepackage{pst-solides3d,pst-node,multido}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[a4paper]{geometry}
\usepackage{lmodern,manfnt}
\usepackage{url}
\usepackage{listings}
\usepackage{frenchle}

\makeatletter

\def\psPoint{\def\pst@par{}\pst@object{psPoint}}
\def\psPoint@i(#1)#2{{% coordonnées cartésiennes
  \begin@ClosedObj
\pnode(!
    \tx@optionssolides
    SolidesDict begin
    #1
   3dto2d cm_1 exch cm_1 exch
   end){#2}%
   \end@ClosedObj
  }\ignorespaces%
}

\makeatother
\def\grille{% quadrillage du plan Oxy
    \psPoint(-5 -5 0){S1}
    \psPoint(-5 5 0){S2}
    \psPoint(5 5 0){S3}
    \psPoint(5 -5 0){S4}
\pspolygon*[linecolor=gray!20](S1)(S2)(S3)(S4)
\multido{\ix=-5+1}{11}{%
    \psPoint(\ix\space -5 0){A}
    \psPoint(\ix\space 5 0){B}
    \psline(A)(B)}
\multido{\iy=-5+1}{11}{%
    \psPoint(-5 \iy\space 0){A}
    \psPoint(5 \iy\space 0){B}
    \psline(A)(B)}
    \psPoint(0 0 0){O}
    \psPoint(5 0 0){X}
    \psPoint(0 5 0){Y}
    \psPoint(0 0 8){Z}
    \psline[arrowsize=0.3,arrowinset=0.2,linecolor=blue]{->}(O)(X)
    \psline[arrowsize=0.3,arrowinset=0.2,linecolor=blue]{->}(O)(Y)
    \psline[arrowsize=0.3,arrowinset=0.2,linecolor=blue]{->}(O)(Z)
    \uput[r](X){\textcolor{blue}{$x$}}\uput[u](Y){\textcolor{blue}{$y$}}%
    \uput[r](Z){\textcolor{blue}{$z$}}\uput[u](O){\textcolor{blue}{$O$}}}
\pagestyle{empty}
\date{29 septembre 2\,007\\ version 0.1}
\author{JPV \& ML}
\title{Documentation sur la fusion\\
d'objets \texttt{jps}}
\newcommand\SectionPneu{
   /m {90 4 div} bind def
   /Scos {m cos 2 m mul cos add 3 m mul cos add} bind def
   /Z0 {h 4 div} bind def
   /c {Z0 Scos div} bind def
   /Z1 {Z0 c m cos mul add} bind def
   /Z2 {Z1 c m 2 mul cos mul add} bind def
   /R1 {R c m sin mul sub} bind def
   /R2 {R1 c m 2 mul sin mul sub} bind def
   /R3 {R2 c m 3 mul sin mul sub} bind def
   0 R h 4 div neg % 1
   0 R h 4 div % 2
   0 R1 Z1 % 3
   0 R2 Z2 % 4
   0 R3 h 2 div % 5
   0 r h 2 div  % 6
   0 r h 2 div neg  % 7
   0 R3 h 2 div neg % 8
   0 R2 Z2 neg % 9
   0 R1 Z1 neg % 10
   }
\begin{document}
\maketitle
\begin{abstract}
Voici l'étape la plus intéressante car elle permet de composer une vue d'un ensemble d'objets de façon automatique,
le calcul des parties cachées est effectué par les routines du code \texttt{PostScript} du fichier \texttt{solides.pro}.
Ces routines proviennent directement du code \texttt{postscript} mis-au point par Jean-Paul
Vignault sur le site de :

\centerline{\url{http://melusine.eu.org/syracuse/bbgraf/}}

Il faut donc, avant de se lancer dans cette étape, assimiler la syntaxe de ces routines.

Pour une scène composée de plusieurs objets complexes la durée d'affichage est relativement longue et c'est assurément un point
qu'il convient d'améliorer. C'est pourquoi nous conseillons de créer un fichier \texttt{pdf} à partir de fichier \texttt{ps} pour une utilisation ultérieure.
\end{abstract}
\section{Le code \texttt{jps}}
\subsection{Le choix de l'objet}
\begin{itemize}
  \item \textsf{4\textvisiblespace 3\textvisiblespace 2\textvisiblespace newcylindricalring} : choix de l'anneau cylindrique défini par sa section dans une commande
  \verb+\psset{section=\SectionPneu}+ avec comme caractéristiques : \texttt{r1=4,r0=3,h=2}.
  \item \textsf{2\textvisiblespace 1.5\textvisiblespace 6\textvisiblespace newcylindre} : choix du cylindre vertical avec comme caractéristiques :
  \begin{itemize}
    \item \texttt{rayon=1.5} ;
    \item \texttt{z0=2} est la position du centre de la base inférieure sur l'axe $\mathsf{Oz}$ ;
    \item \texttt{z1=6} est la position du centre de la base supérieure sur l'axe $\mathsf{Oz}$.
  \end{itemize}
  \end{itemize}
\subsection{Les transformations}
\begin{itemize}
  \item \texttt{\{-1\textvisiblespace 2\textvisiblespace 5\textvisiblespace translatepoint3d\} solidtransform} : l'objet préalablement sélectionné subit une translation au point de coordonnées $\mathsf{(x=-1,y=2,z=5)}$.
  \item \texttt{\{90\textvisiblespace 0\textvisiblespace 45\textvisiblespace rotateOpoint3d\} solidtransform} : l'objet préalablement sélectionné subit une rotation autour des axes $\mathsf{(Ox,Oy,Oz)}$, dans cet ordre,
  de 90$^\mathsf{o}$ autour de $\mathsf{(Ox)}$ suivie d'une rotation de 45$^\mathsf{o}$ autour de $\mathsf{(Oz)}$.
\end{itemize}
\subsection{Le choix de la couleur de l'objet}
\begin{itemize}
  \item dup (jaune) outputcolors : l'objet de couleur jaune éclairé en lumière blanche.
\end{itemize}
\subsection{La fusion des objets}
\begin{itemize}
  \item Elle se fait avec l'instruction \texttt{solidfuz}.
\end{itemize}
\subsection{Le dessin des objets}
\begin{itemize}
  \item Le tracé a trois options :
  \begin{itemize}
    \item \texttt{drawsolid} : tracé des arêtes uniquement, les arêtes cachées sont en pointillés ;
    \item \texttt{drawsolid*} : tracé et remplissage des solides dans l'ordre de leur programmation (option peu intéressante à priori), avec le dessin des arêtes cachées
    en pointillés~;
    \item \texttt{drawsolid**} : tracé et remplissage des solides avec l'algorithme du peintre : seules les parties vues par l'observateur
    sont dessinées.
  \end{itemize}
\end{itemize}
\begin{center}
\psset{lightsrc=50 -50 50,SphericalCoor=true,viewpoint=40 16 32,Decran=40}
\psset{unit=0.4}
\begin{minipage}{0.3\linewidth}
\begin{pspicture}(-6,-5)(6,7)
\psframe*[linecolor=gray!40](-6,-5)(6,7)
\codejps{
% solide 1
    -6 1.5 6 newcylindre
    dup (jaune) outputcolors
% solide 2
    4 3 2 newcylindricalring
   {0 0 -1 translatepoint3d} solidtransform
    dup (orange) outputcolors
% fusion
    solidfuz
    drawsolid}
\end{pspicture}
\end{minipage}
\hfill
\begin{minipage}{0.3\linewidth}
\begin{pspicture}(-6,-5)(6,7)
\psframe*[linecolor=gray!40](-6,-5)(6,7)
\codejps{
% solide 1
    -6 1.5 6 newcylindre
    dup (jaune) outputcolors
% solide 2
    4 3 2 newcylindricalring
   {0 0 -1 translatepoint3d} solidtransform
    dup (orange) outputcolors
% fusion
    solidfuz
    drawsolid*}
\end{pspicture}
\end{minipage}
\hfill
\begin{minipage}{0.3\linewidth}
\begin{pspicture}(-6,-5)(6,7)
\psframe*[linecolor=gray!40](-6,-5)(6,7)
\codejps{
% solide 1
    -6 1.5 6 newcylindre
    dup (jaune) outputcolors
% solide 2
    4 3 2 newcylindricalring
   {0 0 -1 translatepoint3d} solidtransform
    dup (orange) outputcolors
% fusion
    solidfuz
    drawsolid**}
\psPoint(0 0 8){Z}
\psPoint(0 0 6){Z'}
\psline[arrowsize=0.3,arrowinset=0.2]{->}(Z')(Z)
\uput[u](Z){$z$}
\end{pspicture}
\end{minipage}
\end{center}
\begin{lstlisting}
\psset{lightsrc=50 -50 50,SphericalCoor=true,viewpoint=50 20 50,Decran=50}
\begin{pspicture}(-6,-2)(6,8)
\psframe(-6,-2)(6,8)
\codejps{
% solide 1
    -6 1.5 6 newcylindre
    dup (jaune) outputcolors
% solide 2
    4 3 2 newcylindricalring
   {0 0 -1 translatepoint3d} solidtransform
    dup (orange) outputcolors
% fusion
    solidfuz
    drawsolid**}
\end{pspicture}
\end{lstlisting}

\newpage
\section{Scènes complexes}
\subsection{Un prototype de véhicule}
\begin{center}
\psset{lightsrc=100 0 100,SphericalCoor=true,viewpoint=25 20 30,Decran=25,unit=0.75,section=\SectionPneu}
\begin{pspicture}(-6,-4)(6,8)
\grille
\codejps{
/roue12 {
% solide 1
    2 1 1 newcylindricalring
     {90 0 90 rotateOpoint3d} solidtransform
     {3 4 2 translatepoint3d} solidtransform
     dup (White) outputcolors
% solide 2
    2 1 1 newcylindricalring
    {90 0 90 rotateOpoint3d} solidtransform
   {-3 4 2 translatepoint3d} solidtransform
    dup (White) outputcolors
% fusion
    solidfuz } def
/axe12{
0 0.1 6  newcylindre
{90 0 90 rotateOpoint3d} solidtransform
{-3 4 2  translatepoint3d} solidtransform
dup (White) outputcolors
} def
/roue12axes {
roue12 axe12 solidfuz } def
/roue34 {
% solide 3
    1.5 1 1 newcylindricalring
    {90 0 110 rotateOpoint3d} solidtransform
   {3 -4 1.5 translatepoint3d} solidtransform
    dup (White) outputcolors
% solide 4
    1.5 1 1 newcylindricalring
   {90 0 110 rotateOpoint3d} solidtransform
   {-3 -4 1.5 translatepoint3d} solidtransform
    dup (White) outputcolors
% fusion
    solidfuz } def
/axe34{
0 0.1 6  newcylindre
{90 0 90 rotateOpoint3d} solidtransform
{-3 -4 1.5  translatepoint3d} solidtransform
dup (White) outputcolors
} def
/roue34axes34 {
roue34 axe34 solidfuz } def
/roues {roue34axes34 roue12axes solidfuz} def
/chassis {
0 1 8  newcylindre
{100 0 0 rotateOpoint3d} solidtransform
{0 4 2.5  translatepoint3d} solidtransform
dup (White) outputcolors
} def
roues chassis solidfuz
    drawsolid**}
\psPoint(0 0 2.7){Z'}
\psline[arrowsize=0.3,arrowinset=0.2,linecolor=blue]{->}(Z')(Z)
\end{pspicture}
\end{center}
Il faut opérer en plusieurs étapes en fusionnant les solides deux par deux.
\begin{itemize}
  \item On fusionne d'abord les deux roues avant \texttt{roue12}:
  \begin{verbatim}
  /roue12 {
% solide 1
    2 1 1 newcylindricalring
     {90 0 90 rotateOpoint3d} solidtransform
     {3 4 2 translatepoint3d} solidtransform
     dup (White) outputcolors
% solide 2
    2 1 1 newcylindricalring
    {90 0 90 rotateOpoint3d} solidtransform
   {-3 4 2 translatepoint3d} solidtransform
    dup (White) outputcolors
% fusion
    solidfuz } def
  \end{verbatim}
  \item Puis ces deux roues et leur axe :
  \begin{verbatim}
/axe12{
0 0.1 6  newcylindre
{90 0 90 rotateOpoint3d} solidtransform
{-3 4 2  translatepoint3d} solidtransform
dup (White) outputcolors
} def
/roue12axes {
roue12 axe12 solidfuz } def
\end{verbatim}
  \item On opère de même pour les roues arrière et leur axe :
  \begin{verbatim}
/roue34 {
% solide 3
    1.5 1 1 newcylindricalring
    {90 0 110 rotateOpoint3d} solidtransform
   {3 -4 1.5 translatepoint3d} solidtransform
    dup (White) outputcolors
% solide 4
    1.5 1 1 newcylindricalring
   {90 0 110 rotateOpoint3d} solidtransform
   {-3 -4 1.5 translatepoint3d} solidtransform
    dup (White) outputcolors
% fusion
    solidfuz } def
/axe34{
0 0.1 6  newcylindre
{90 0 90 rotateOpoint3d} solidtransform
{-3 -4 1.5  translatepoint3d} solidtransform
dup (White) outputcolors
} def
/roue34axes34 {
roue34 axe34 solidfuz } def
/roues {roue34axes34 roue12axes solidfuz} def
\end{verbatim}
\item La dernière étape consiste à fusionner les deux solides ainsi obtenus avec le semblant de chassis~:
  \begin{verbatim}
/chassis {
0 1 8  newcylindre
{100 0 0 rotateOpoint3d} solidtransform
{0 4 2.5  translatepoint3d} solidtransform
dup (White) outputcolors
} def
roues chassis solidfuz
    drawsolid**}
\end{verbatim}
\end{itemize}
\end{document}
