\section {Construire à partir du scratch}

L'objet \verb+new+ permet de construire son propre solide. Deux
paramètres sont utilisés~: \verb+sommets+ qui indique la liste des
coordonnées des différents sommets, et \verb+faces+ qui donne la liste
de toutes les faces du solide, une face de solide étant caractérisée
par la liste des indices des sommets la constituant, ceux-ci étant
\textbf {rangés dans le sens trigonométrique lorsque l'on regarde la
face du coté extérieur}.

\subsection {Exemple 1 : une maison}
\vskip -10mm
\begin{multicols}{2}
\bgroup
\psset{unit=0.5}
\psset{lightsrc=10 -20 50,viewpoint=50 -20 30 rtp2xyz,Decran=50}
\begin{pspicture*}(-7,-4)(7,7)
\psframe(-7,-4)(7,7)
\psSolid[object=new,
    sommets=
       2  4  3    -2  4  3
      -2 -4  3     2 -4  3
       2  4  0    -2  4  0
      -2 -4  0     2 -4  0
       0  4  5     0 -4  5,
    faces={
      [0 1 2 3]    [7 6 5 4]
      [0 3 7 4]    [3 9 2]
      [1 8 0]      [8 9 3 0]
      [9 8 1 2]    [6 7 3 2]
      [2 1 5 6]},
    num=all,
    show=all,
    action=draw
]%
\end{pspicture*}
\egroup
\columnbreak
\begin{verbatim}
\psSolid[object=new,
    sommets=
       2  4  3    -2  4  3
      -2 -4  3     2 -4  3
       2  4  0    -2  4  0
      -2 -4  0     2 -4  0
       0  4  5     0 -4  5,
    faces={
      [0 1 2 3]    [7 6 5 4]
      [0 3 7 4]    [3 9 2]
      [1 8 0]      [8 9 3 0]
      [9 8 1 2]    [6 7 3 2]
      [2 1 5 6]},
    num=all,show=all,action=draw]
\end{verbatim}
\end{multicols}

Il est à remarquer que le solide \verb+new+ accepte les mêmes options
que les autres solides. Par exemple, on a représenté ci-dessous le
solide précédent en utilisant les paramètres \verb+hollow+,
\verb+incolor+, \verb+fillcolor+ et \verb+rm+.

%% exemple 2

\begin{multicols}{2}

\bgroup
\psset{unit=0.5}
\psset{lightsrc=10 -20 50,viewpoint=50 -20 30 rtp2xyz,Decran=50}
\begin{pspicture*}(-7,-3.5)(7,7.5)
\psframe(-7,-3.5)(7,7.5)
\psSolid[object=new,fillcolor=red!50,incolor=yellow,
    action=draw**,
    hollow,
    rm=2,
    sommets=
       2  4  3
      -2  4  3
      -2 -4  3
       2 -4  3
       2  4  0
      -2  4  0
      -2 -4  0
       2 -4  0
       0  4  5
       0 -4  5,
    faces={
      [0 1 2 3]
      [7 6 5 4]
      [0 3 7 4]
      [3 9 2]
      [1 8 0]
      [8 9 3 0]
      [9 8 1 2]
      [6 7 3 2]
      [2 1 5 6]},
    num=all,
    show=all
      ]%
\end{pspicture*}
\egroup

\columnbreak

\begin{verbatim}
\psSolid[object=new,fillcolor=red!50,
    incolor=yellow,
    action=draw**,
    hollow,
    rm=2,
    ...
\end{verbatim}
\end{multicols}

\subsection {Exemple 2 : Hyperboloïde de rayon fixe}

%\psset{lightsrc=10 20 30,viewpoint=50 20 30 rtp2xyz}
%\psset{viewpoint=50 20 30 rtp2xyz}

\begin{multicols}{2}

Comme à chaque fois, les options de la macro \verb+\psSolid+ peuvent
embarquer du code postscript, voire du code jps.

Ci-contre un exemple en pur postscript, où on utilise les variables
$a$, $b$ et $h$ qui sont transmises par les options de PSTricks. On
obtient ainsi un solide variable construit à partir du scratch.

Remarque~: le code utilisé provient d'un source jps pratiquement
utilisé tel que~: 

\noindent\url{http://melusine.eu.org/lab/bjps/solide/tour.jps}

\columnbreak

\bgroup
\psset{unit=0.75}
\psset{lightsrc=10 -20 20,viewpoint=50 -20 30 rtp2xyz,Decran=50}
\begin{pspicture*}(-5,-5)(3,5)
\psframe(-3,-5)(3,5)
\psSolid[object=new,fillcolor=red!50,incolor=yellow,
    hollow,
    a=10, %% nb d'etages
    b=20, %% diviseur de 360, nb de meridiens
    h=8,  %% hauteur
    action=draw**,
    sommets=
      /z0 h neg 2 div def
      a -1 0 {
         /k exch def
         0 1 b 1 sub {
             /i exch def
             /r z0 h a div k mul add dup mul 4 div 1 add sqrt def
             360 b idiv i mul cos r mul
             360 b idiv i mul sin r mul
             z0 h a div k mul add
         } for
      } for,
    faces={
      0 1 a 1 sub {
      /k exch def
         k b mul 1 add 1 k 1 add b mul 1 sub {
             /i exch def
             [i i 1 sub b i add 1 sub b i add]
         } for
         [k b mul k 1 add b mul 1 sub k 2 add b mul 1 sub k 1 add b mul]
      } for
    },
]
\end{pspicture*}
\egroup

\end{multicols}

Le code utilisé est le suivant~:
\begin{verbatim}
\psSolid[object=new,fillcolor=red!50,incolor=yellow,
    hollow,
    a=10, %% nb d'etages
    b=20, %% diviseur de 360, nb de meridiens
    h=8,  %% hauteur
    action=draw**,
    sommets=
      /z0 h neg 2 div def
      a -1 0 {
         /k exch def
         0 1 b 1 sub {
             /i exch def
             /r z0 h a div k mul add dup mul 4 div 1 add sqrt def
             360 b idiv i mul cos r mul
             360 b idiv i mul sin r mul
             z0 h a div k mul add
         } for
      } for,
    faces={
      0 1 a 1 sub {
      /k exch def
         k b mul 1 add 1 k 1 add b mul 1 sub {
             /i exch def
             [i i 1 sub b i add 1 sub b i add]
         } for
         [k b mul k 1 add b mul 1 sub k 2 add b mul 1 sub k 1 add b mul]
      } for
    }]
\end{verbatim}

\subsection {Exemple 3~: Import de fichiers externes}

\`A partir d'un fichier de description de solide dans un format
particulier (notamment autre que obj ou off), on peut fabriquer
soit-même  un fichier .dat contenant les coordonnées des sommets, et
un autre fichier .dat contenant les tableaux des indices des sommets
de chaque facette. Ces fichiers peuvent alors être utilisés en entrée
pour les paramètres \verb+sommets+ et \verb+faces+ en utilisant
l'instruction postscript \verb+run+.

Dans l'exemple ci-dessous, les fichiers \verb+sommets_nefer.dat+
et \verb+faces_nefer.dat+ ont été placés dans le répertoire de
compilation. 

\medbreak
\bgroup
\psset{unit=0.4}
\definecolor{AntiqueWhite}{rgb}{0.98,0.92,0.84}
\begin{pspicture}(-7,-7)(7,8)
\psset{lightsrc=30 -40 10}
\psset{viewpoint=50 -50 20 rtp2xyz,Decran=50}
\psframe(-7,-7)(7,8)
\psset{RotX=90,sommets= (sommets_nefer.dat) run}
\psSolid[object=new,fillcolor=AntiqueWhite,linewidth=0.5\pslinewidth,
    faces={(faces_nefer.dat) run}]%
\psSolid[object=new,fillcolor=red,linewidth=0.5\pslinewidth,
    faces={(faces_nefer_levres.dat) run}]%
\psSolid[object=new,fillcolor=black,
    faces={(faces_nefer_sourcils.dat) run}]%
\end{pspicture}
\hfill
\begin{pspicture}(-7,-7)(7,8)
\psset{lightsrc=-10 -40 -5,lightintensity=.5}
\psset{viewpoint=50 -80 10 rtp2xyz,Decran=50}
\psframe(-7,-7)(7,8)
\psset{RotX=90,RotZ=30,sommets= (sommets_nefer.dat) run}
\psSolid[object=new,fillcolor=AntiqueWhite,linewidth=0.5\pslinewidth,
    grid,
    faces={(faces_nefer.dat) run}]%
\psSolid[object=new,fillcolor=red,linewidth=0.5\pslinewidth,grid,
    faces={(faces_nefer_levres.dat) run}]%
\psSolid[object=new,fillcolor=black,
    faces={(faces_nefer_sourcils.dat) run}]%
\end{pspicture}
\egroup

\newpage
\begin{verbatim}
\definecolor{AntiqueWhite}{rgb}{0.98,0.92,0.84}
\psset{lightsrc=30 -40 10}
\psset{viewpoint=50 -50 20 rtp2xyz,Decran=50}
\psframe(-7,-7)(7,9)
\psSolid[object=new,RotX=90,fillcolor=AntiqueWhite,linewidth=0.5\pslinewidth,
    sommets= (sommets_nefer.dat) run,
    faces={(faces_nefer.dat) run}]%
\end{verbatim}
