\documentclass{article}
\usepackage{pst-solides3d,pst-node,multido,url}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[a4paper]{geometry}
%%\usepackage[frenchle]{babel}
\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
\multido{\ix=-6+1}{13}{%
    \psPoint(\ix\space -6 0){A}
    \psPoint(\ix\space 6 0){B}
    \psline(A)(B)}
\multido{\iy=-6+1}{13}{%
    \psPoint(-6 \iy\space 0){A}
    \psPoint(6 \iy\space 0){B}
    \psline(A)(B)}
    \psPoint(0 0 0){O}
    \psPoint(6 0 0){X}
    \psPoint(0 6 0){Y}
    \psPoint(0 0 6){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$}}}

\def\axes(#1,#2,#3){% axes 3d
  \psPoint(0 0 0){O}
    \psPoint(#1 0 0){X}
    \psPoint(0 #2 0){Y}
    \psPoint(0 0 #3){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[dr](X){\textcolor{blue}{$x$}}\uput[u](Y){\textcolor{blue}{$y$}}%
    \uput[r](Z){\textcolor{blue}{$z$}}\uput[l](O){\textcolor{blue}{$O$}}}
\pagestyle{empty}
\date{25 septembre 2\,007}
\author{JPV \& ML}
\title{Documentation pst-solides3d\\ version-alpha 0.1}

\begin{document}
\maketitle
\begin{abstract}
\verb+pst-solides3d+ est une extension de PSTricks permettant de dessiner des solides
en 3D. Un certain nombre de solides sont déjà pré-définis. Une
commande \verb+codejps+ permet d'inclure 
directement du code \texttt{postscript} mis-au point par Jean-Paul
Vignault sur le site de : 

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

\section {Constitution du package}

Fichiers \verb+pst-solides3d.sty+, \verb+pst-solides3d.tex+ et
\verb+solides.pro+.

Pour compiler, on a également besoin des fichiers~:
\verb+arrayjob.sty+,
\verb+keyval.tex+,
\verb+pstricks.con+,
\verb+pstricks.pro+,
\verb+pstricks.sty+,
\verb+pstricks.tex+,
\verb+pst-xkey.sty+,
\verb+pst-xkey.tex+,
\verb+xcolor.sty+,
\verb+xkeyval.sty+,
\verb+xkeyval.tex+,
\verb+xkvltxp.sty+,
\verb+xkvtxhdr.tex+,
\verb+xkvview.sty+.

\section {Choix du point de vue}

Decran, viewpoint

\section {Solides prédéfinis}

\subsection{Le cube}

\begin{center}
%%
\psset{unit=0.5}
%%
\begin{pspicture}(-5,-4)(5,4)
\psframe(-5,-4)(5,4)
\psset{Decran=20}
\psSolid[object=cube,action=draw](0,0,0)
\end{pspicture}
%%
\end{center}


\subsection{Le cône et le cône creux}

%% avec mode = 0
\begin{center}
\psset{SphericalCoor=true,viewpoint=50 20 50,Decran=60}
%%
\psset{unit=0.5}
%%
\begin{pspicture}(-5,-5)(5,5)
\psframe(-5,-5)(5,5)
\psSolid[object=cone,RotY=-90,h=6,r=2,color=cyan](0,0,0)
\end{pspicture}
%
\begin{pspicture}(-5,-5)(5,5)
\psframe(-5,-5)(5,5)
\psSolid[object=conecreux,RotY=-90,h=6,r=2,
color=cyan,incolor=red,action=draw**](0,0,0)
\end{pspicture}
%%
\end{center}

\subsection {Le tronc de cône et le tronc de cône creux}

\begin{center}
%%
\psset{unit=0.5}
\psset{lightsrc=10 5 20,SphericalCoor=true,viewpoint=50 20 50,Decran=60}
%
\begin{pspicture}(-5,-5)(5,5)
\psframe(-5,-5)(5,5)
\psSolid[object=tronccone,r0=2,r1=1,h=6,color=cyan,action=draw*](0,0,-2)
\end{pspicture}
%%
\begin{pspicture}(-5,-5)(5,5)
\psframe(-5,-5)(5,5)
\psSolid[object=troncconecreux,
r0=2,r1=1,h=6,color=cyan,incolor=red,action=draw**](0,0,-2)
\end{pspicture}
\end{center}

\subsection{Le cylindre et le cylindre creux}
%\input{exemplescylindre.tex}

\begin{center}
%%
\psset{unit=0.5}
%
\begin{pspicture}(-5,-5)(5,5)
\psframe(-5,-5)(5,5)
\psset{Decran=15,viewpoint=10 10 5}
\psSolid[object=cylindre,action=draw*,
RotX=-30,h=5,r=2,color=cyan](0,0,-2)
\end{pspicture}
%%
\begin{pspicture}(-5,-5)(5,5)
\psframe(-5,-5)(5,5)
\psset{Decran=15,viewpoint=10 10 5}
\psSolid[object=cylindrecreux,action=draw**,
RotX=-30,h=5,r=2,color=cyan,incolor=red,lightsrc=10 10 10](0,0,-2)
\end{pspicture}
\end{center}

\subsection{La sphère}
%\input{exemplessphere.tex}
\begin{center}
%%
\psset{unit=0.5}
%%
\begin{pspicture}(-5,-4)(5,4)
\psframe(-5,-4)(5,4)
\psset{Decran=20}
\psSolid[object=sphere, r=3,action=draw, mode=0](0,0,0)
\end{pspicture}
%%
%%
\begin{pspicture}(-5,-4)(5,4)
\psframe(-5,-4)(5,4)
\psset{Decran=20}
\psSolid[object=sphere, r=3,action=draw, mode=4](0,0,0)
\end{pspicture}
%%
\end{center}

\subsection{La \textsf{grille} et son paramètre : \textsf{base}}
%\input{exemplesgrille.tex}

\begin{center}
%%
\begin{pspicture}(-5,-2)(5,5)
\psframe(-5,-2)(5,5)
\psset[pst-solides3d]{viewpoint=50 10 20,Decran=30,lightsrc=10 20 20}
\psSolid[object=grille,base=-5 5 -2 2](0,0,0)
\end{pspicture}
\end{center}

\subsection {Polygones réguliers}

tetrahedron, icosahedron, octahedron, dodecahedron

\begin{center}
%%
\psset{unit=0.5}
%%
\begin{pspicture}(-5,-4)(5,4)
\psframe(-5,-4)(5,4)
\psset[pst-solides3d]{viewpoint=20 20 50,Decran=30}
\psSolid[object=tetrahedron,r=6,RotY=90,linecolor=blue,action=draw](0,2,0)
\end{pspicture}
%%
\begin{pspicture}(-5,-4)(5,4)
\psframe(-5,-4)(5,4)
\psset{Decran=20}
\psSolid[object=icosahedron,a=3,RotZ=90,action=draw*,color=green!50](0,0,0)
\end{pspicture}
%%
\end{center}

\begin{center}
%%
\psset{unit=0.5}
%%
\psset{lightsrc=10 5 50,SphericalCoor=true,viewpoint=50 20 50,Decran=50}
\begin{pspicture}(-5,-5)(5,5)
\psframe(-5,-5)(5,5)
\psSolid[object=octahedron,linewidth=2pt,linecolor=blue,color=Turquoise](0,0,0)
\end{pspicture}
%%
\begin{pspicture}(-5,-5)(5,5))
\psframe(-5,-5)(5,5)
\psSolid[object=dodecahedron,a=4,RotZ=90,action=draw*,color=OliveGreen](0,0,0)
\end{pspicture}
%%
\end{center}

\subsection {Prismes droit et oblique}

\begin{center}
%%
\psset{unit=0.5}
\psset{lightsrc=10 5 50,SphericalCoor=true,viewpoint=50 20 50,Decran=50}
%%
\begin{minipage}{5cm}
\begin{pspicture*}(-5,-4)(5,6)
\psframe(-5,-4)(5,6)
\grille
\psSolid[object=prism,action=draw,linecolor=red,linewidth=0.1](0,0,0)
\end{pspicture*}
$\backslash$\texttt{psSolid[object=\psframebox[fillstyle=solid,fillcolor=black]{\textcolor{white}{prism}}]}
\end{minipage}
\hfill
\begin{minipage}{5cm}
\begin{pspicture*}(-5,-4)(5,6)
\psframe(-5,-4)(5,6)
\grille
\psSolid[object=prism,action=draw,linecolor=green,linewidth=0.1,axe=0 0.5 1](0,0,0)
\end{pspicture*}
$\backslash$\texttt{psSolid[object=\psframebox[fillstyle=solid,fillcolor=black]{\textcolor{white}{prism}},%
axe=\psframebox[fillstyle=solid,fillcolor=black]{\textcolor{white}{0 0.5 1}}]}
\end{minipage}
\end{center}

\begin{center}
\psset{unit=0.5}
\psset{lightsrc=10 5 50,SphericalCoor=true,viewpoint=50 20 50,Decran=50}
\begin{minipage}{5cm}
\begin{pspicture*}(-5,-4)(5,6)
\psframe(-5,-4)(5,6)
\grille
\psSolid[object=prism,h=5,base=0 -2 1 -1 0 0 0 1 -1 0](0,0,0)
\psline[arrowsize=0.3,arrowinset=0.2,linecolor=blue]{->}(O)(Z)
\end{pspicture*}
\texttt{[base=\psframebox[fillstyle=solid,fillcolor=black]{\textcolor{white}{0 -2 1 -1 0 0 0 1 -1 0}},h=5]}
\end{minipage}
\hfill
\begin{minipage}{5cm}
\begin{pspicture*}(-5,-4)(5,6)
\psframe(-5,-4)(5,6)
\grille
\psSolid[object=prism,axe=0 0.5 1,h=8,base=0 -2 1 -1 0 0 0 1 -1 0](0,0,0)
\end{pspicture*}
\texttt{[base=\psframebox[fillstyle=solid,fillcolor=black]{\textcolor{white}{0 -2 1 -1 0 0 0 1 -1 0}},%
axe=\psframebox[fillstyle=solid,fillcolor=black]{\textcolor{white}{0 0.5 1}},h=8]}
\end{minipage}
\end{center}

\subsection {Tore}

\begin{center}
%%
\psset{unit=0.5}
\begin{pspicture}(-5,-5)(5,5)
\psframe(-5,-5)(5,5)
%\psset{THETA=20,PHI=50,Dobs=50,Decran=30} anciennement
\psset[pst-solides3d]{SphericalCoor=true,viewpoint=50 20 50,Decran=30}
\psSolid[r1=5,r0=3,object=tore,linewidth=2pt,linecolor=red](0,0,0)
\end{pspicture}
%%
\end{center}

\subsection {Anneau cylindrique}

\begin{center}
%%
\begin{pspicture}(-5,-2)(5,5)
\psframe(-5,-2)(5,5)
\psset[pst-solides3d]{viewpoint=50 10 20,Decran=30,lightsrc=10 20 20}
\psSolid[object=cylindricalring,ngrid=2 32,
h=3,r1=8,r0=6,RotX=10,color=cyan,
action=draw**](0,0,0)
\end{pspicture}
\end{center}

\section {Options communes à l'ensemble des solides}

\subsection {Le tracé}

action = none, draw, draw*, draw**

Le paramètre \verb+action+ permet de choisir l'algorithme utilisé por
le tracé du solide~: 

\verb+none+~: ne trace rien

\verb+draw+~: trace le solide en structure fil de fer avec tracé en
pointillé des arêtes cachées

\verb+draw*+~: trace le solide avec tracé en pointillé des arêtes
cachées et coloration des faces visibles

\verb+draw**+~: utilise l'algorithme du peintre pour tracer le solide
sans les arêtes cachées et avec coloration des faces.

Les commandes \verb+draw+ et \verb+draw*+ ne sont pertinentes que pour
les solides convexes.

\begin{center}
%%
\psset{unit=0.5}
%%
\begin{pspicture}(-5,-4)(5,4)
\psframe(-5,-4)(5,4)
\psset{Decran=20}
\psSolid[object=cube,action=draw](0,0,0)
\end{pspicture}
%%
\begin{pspicture}(-5,-4)(5,4)
\psframe(-5,-4)(5,4)
\psset{Decran=20}
\psSolid[object=cube,action=draw*,color=magenta!20](0,0,0)
\end{pspicture}
%%
\begin{pspicture}(-5,-4)(5,4)
\psframe(-5,-4)(5,4)
\psset{Decran=20}
\psSolid[object=cube,action=draw**,color=magenta!20](0,0,0)
\end{pspicture}
%%
\end{center}

\subsection {Définition du maillage}

L'argument \verb+ngrid+ permet à l'utilisateur de spécifier la finesse
du maillage pour le solide considéré.

\begin{center}
%%
\psset{unit=0.5}
%%
\begin{pspicture}(-5,-5)(5,5)
\psframe(-5,-5)(5,5)
\psset{Decran=20}
\psset{color1=cyan,color2=red}
\psSolid[
   action=draw*,
   fcol=0 (OliveGreen) 2 (color1) 3 (color2),
   object=sphere,
   ngrid=10 10,
   RotZ=30
](0,0,0)
\end{pspicture}
%%
%%
\begin{pspicture}(-5,-5)(5,5)
\psframe(-5,-5)(5,5)
\psset{Decran=20}
\psset{color1=cyan,color2=red}
\psSolid[
   action=draw*,
   fcol=0 (OliveGreen) 2 (color1) 3 (color2),
   object=sphere,
   ngrid=4 4,
   RotZ=30
](0,0,0)
\end{pspicture}
%%
\end{center}

\subsection {Les modes}

Pour un certain nombre de solides, on a prédéfini certains
maillages. Le positionnement du paramètre \verb+mode+ permet de passer
du maillage prédéfini le plus grossier ($mode=0$) au maillage
prédéfini le plus fin ($mode=4$). 

Ceci permet notamment de mettre au point une image avec tous les
solides en mode $0$ afin d'accélérer les calculs, avant de passer au
mode $4$ pour une image définitive.

%% avec mode = 0
\begin{center}
\psset{lightsrc=10 5 20,SphericalCoor=true,viewpoint=50 20 50,Decran=50,unit=0.5}
\begin{pspicture}(-5,-5)(5,5)
\psframe(-5,-5)(5,5)
\psSolid[mode=0,object=troncconecreux,color=cyan,incolor=red,r0=5,r1=2,h=5](0,0,0)
\rput(0,-4.5){\psframebox[fillstyle=solid,fillcolor=black]{\textcolor{white}{mode=0}}}
\end{pspicture}
%
\begin{pspicture}(-5,-5)(5,5)
\psframe(-5,-5)(5,5)
\psSolid[mode=1,object=troncconecreux,color=cyan,incolor=red,r0=5,r1=2,h=5](0,0,0)
\rput(0,-4.5){\psframebox[fillstyle=solid,fillcolor=black]{\textcolor{white}{mode=1}}}
\end{pspicture}
%
\begin{pspicture}(-5,-5)(5,5)
\psframe(-5,-5)(5,5)
\psSolid[mode=2,object=troncconecreux,color=cyan,incolor=red,r0=5,r1=2,h=5](0,0,0)
\rput(0,-4.5){\psframebox[fillstyle=solid,fillcolor=black]{\textcolor{white}{mode=2}}}
\end{pspicture}
%
\begin{pspicture}(-5,-5)(5,5)
\psframe(-5,-5)(5,5)
\psSolid[mode=3,object=troncconecreux,color=cyan,incolor=red,r0=5,r1=2,h=5](0,0,0)
\rput(0,-4.5){\psframebox[fillstyle=solid,fillcolor=black]{\textcolor{white}{mode=3}}}
\end{pspicture}
%
\begin{pspicture}(-5,-5)(5,5)
\psframe(-5,-5)(5,5)
\psSolid[mode=4,object=troncconecreux,color=cyan,incolor=red,r0=5,r1=2,h=5](0,0,0)
\rput(0,-4.5){\psframebox[fillstyle=solid,fillcolor=black]{\textcolor{white}{mode=4}}}
\end{pspicture}
%
\begin{pspicture}(-5,-5)(5,5)
\psframe(-5,-5)(5,5)
\psSolid[mode=5,object=troncconecreux,color=cyan,incolor=red,r0=5,r1=2,h=5](0,0,0)
\rput(0,-4.5){\psframebox[fillstyle=solid,fillcolor=black]{\textcolor{white}{mode=5 => mode 4 forcé}}}
\end{pspicture}
\end{center}


\subsection {Couleurs}

L'argument \verb+fillcolor+ permet de spécifier la couleur souhaitée
pour les faces externes d'un solide. 
L'argument \verb+fillincolor+ permet de spécifier la couleur souhaitée
pour les faces internes d'un solide. 


\subsection {Colorier les facettes une à une}

\begin{center}
%%
\psset{unit=0.5}
%
\begin{pspicture}(-5,-5)(5,5)
\psframe(-5,-5)(5,5)
\psset{Decran=20}
\psset{color1=cyan,color2=red}
\psSolid[
   action=draw*,
   fcol=1 (OliveGreen) 0 (color1) 4 (color2),
   object=cube,
   RotZ=30
](0,0,0)
\end{pspicture}
%%
\begin{pspicture}(-5,-5)(5,5)
\psframe(-5,-5)(5,5)
\psset{Decran=20}
\psset{color1=yellow,color2=red}
\psSolid[
   action=draw*,
   fcol=12 (OliveGreen) 2 (color1) 3 (color2),
   object=cylindre,
   h=2,
   ngrid=4 10,
   RotZ=30
](0,0,0)
\end{pspicture}
%%
\end{center}

\subsection {Enlever des facettes}

\begin{center}
%%
\psset{unit=0.5}
%
\begin{pspicture}(-5,-5)(5,5)
\psframe(-5,-5)(5,5)
\psset{Decran=15,grid=true,viewpoint=10 10 5}
\psSolid[rm=1 2 8,object=cylindrecreux,action=draw**,
RotX=-60,h=5,r=2,color=cyan,incolor=red](2,-2,-2)
\end{pspicture}
\end{center}



\subsection {Pointage et numérotation des sommets}

show, num

%% avec mode = 0
\begin{center}
%%
\psset{unit=0.5}
%
\begin{pspicture}(-5,-5)(5,5)
\psframe(-5,-5)(5,5)
\psset{Decran=20}
\psSolid[
   action=draw,
   object=cube,
   RotZ=30,
   show=all
](0,0,0)
\end{pspicture}
%%
\begin{pspicture}(-5,-5)(5,5)
\psframe(-5,-5)(5,5)
\psset{Decran=15}
\psSolid[
   object=cube,
   RotX=90,h=9,
   a=6,
   color=cyan,
   incolor=red,
   show=0 1 3,
   num=0 1 3,
   lightsrc=10 10 10
](0,-1,0)
\end{pspicture}
%
\end{center}

\begin{center}
%%
\psset{unit=0.5}
%
\begin{pspicture}(-5,-5)(5,5)
\psframe(-5,-5)(5,5)
\psset{Decran=15}
\psSolid[
   object=cube,
   RotX=90,h=9,
   a=6,
   color=cyan,
   incolor=red,
   num=all,
   lightsrc=10 10 10
](0,-1,0)
\end{pspicture}
%
\end{center}


\section {Positionner un solide}

RotX, RotY, RotZ

\section {\' Eclairage par une source lumineuse ponctuelle}

lightsrc + fillincolor + cylindrecreux + lightintensity

\begin{center}
%%
\psset{unit=0.5}
\begin{pspicture}(-5,-5)(5,5)
\psframe(-5,-5)(5,5)
\psset{Decran=1e3,viewpoint=1e3 0 1e3,lightsrc=1e3 0 1e3,mode=5}
\psSolid[object=cube,RotZ=30](0,2,0)
\psSolid[object=cylindrecreux,RotX=30,RotZ=-30,color=cyan,incolor=red](4,-3,0)
\end{pspicture}
%%
\begin{pspicture}(-5,-5)(5,5)
\psframe(-5,-5)(5,5)
\psset{Decran=30,viewpoint=30 30 30,lightsrc=0 1e3 1e3}
\psSolid[object=cube,lightintensity=3,RotX=90](0,3,0)
\psSolid[object=cube,lightintensity=1,RotX=90](3,-3,0)
\end{pspicture}
%%
\end{center}


\section {Utilisation directe en postscript}

Reprise de tous les paragraphes précédents, mais cette fois sans
l'interface PSTricks

\end{document}
