\documentclass[10pt,a4paper]{article}
\usepackage[T1]{fontenc}
\usepackage[latin1]{inputenc}%
\usepackage{pst-3d,pst-node}%
\usepackage{pst-xkey}%
\makeatletter \pst@addfams{pst-coniques}
\define@key[psset]{pst-coniques}{AngleCone}{\edef\PstConiques@AngleCone{#1}}
\define@key[psset]{pst-coniques}{HauteurLimite}{\edef\PstConiques@HauteurLimite{#1}}
\define@key[psset]{pst-coniques}{AnglePlan}{\edef\PstConiques@AnglePlan{#1}}
\define@key[psset]{pst-coniques}{increment}{\edef\PstConiques@increment{#1}}
\define@key[psset]{pst-coniques}{Cyan}{\edef\PstConiques@Cyan{#1}}
\define@key[psset]{pst-coniques}{Magenta}{\edef\PstConiques@Magenta{#1}}
\define@key[psset]{pst-coniques}{Yellow}{\edef\PstConiques@Yellow{#1}}
\define@key[psset]{pst-coniques}{K}{\edef\PstConiques@K{#1}}
\define@key[psset]{pst-coniques}{xLight}{\edef\PstConiques@xLight{#1}}
\define@key[psset]{pst-coniques}{yLight}{\edef\PstConiques@yLight{#1}}
\define@key[psset]{pst-coniques}{zLight}{\edef\PstConiques@zLight{#1}}
\define@key[psset]{pst-coniques}{Hstart}{\edef\PstConiques@Hstart{#1}}
\define@key[psset]{pst-coniques}{Hstop}{\edef\PstConiques@Hstop{#1}}
\define@key[psset]{pst-coniques}{Hstep}{\edef\PstConiques@Hstep{#1}}
\define@key[psset]{pst-coniques}{BandWidth}{\edef\PstConiques@BandWidth{#1}}
%
\newif\ifPstConiques@Draft
\define@key[psset]{pst-coniques}{Draft}[false]{\@nameuse{PstConiques@Draft#1}}
\makeatother
\psset{AngleCone=30,HauteurLimite=8,AnglePlan=55,increment=2,%
       Cyan=0,Magenta=0.5,Yellow=1,K=0.5,%
       xLight=1,yLight=0,zLight=1,%
       Hstart=-8,Hstep=0.51,Hstop=6,BandWidth=0.25,Draft=false}
%
\SpecialCoor
\makeatletter
\def\SectionConique{\pst@object{SectionConique}}
\def\SectionConique@i{\@ifnextchar[{\SectionConique@do}{\SectionConique@do[]}}
\def\SectionConique@do[#1]{{%
\pst@killglue
\setkeys{psset}{#1}%
\pst@Verb{%
          \psk@embedangle
          \psk@viewpoint
          \psk@viewangle
          \tx@SetMatrixThreeD}%
\ifPstConiques@Draft
    \psset{increment=20}
    \pstVerb{/Pas 5 def}
\else
    \pstVerb{/Pas 1 def}
\fi
\begin@OpenObj
\addto@pscode{%
1 setlinejoin
% Vecteur ViewPoint
\psk@viewpoint
    /vZ ED
    /vY ED
    /vX ED
% Les couleurs
/Cyan \PstConiques@Cyan\space def /Magenta
\PstConiques@Magenta\space def /Yellow \PstConiques@Yellow\space def
/K \PstConiques@K\space def
% direction des rayons de lumière
/xLight \PstConiques@xLight\space def /yLight
\PstConiques@yLight\space def /zLight \PstConiques@zLight\space def
/NormeLight {xLight dup mul yLight dup mul zLight dup mul add add
            sqrt} bind def
% Les datas
    /increment \PstConiques@increment\space def
    /THETA \PstConiques@AngleCone\space def
    /tanTHETA {THETA dup sin exch cos div} bind def
    /HauteurLimite \PstConiques@HauteurLimite\space \pst@number\psunit mul def
    /Rcone {HauteurLimite THETA cos div THETA sin mul} bind def
    /OMEGA \PstConiques@AnglePlan\space def
    /tanOMEGA {OMEGA dup sin exch cos div} bind def
    /m1 {90 THETA sub dup sin exch cos div} bind def
    /Hstart \PstConiques@Hstart\space \pst@number\psunit mul def
    /Hstep \PstConiques@Hstep\space \pst@number\psunit mul def
    /Hstop \PstConiques@Hstop
    \space \pst@number\psunit mul def
% l'ellipse du plan de coupe : le contour
/ellipse { /TableauxPoints [
0 Pas 359 {% on décrit le cercle
    /theta exch def [
    /Denominateur {OMEGA sin theta sin tanTHETA mul OMEGA cos mul add} def
    Denominateur 0 eq {/Denominateur 1e-4 def} if
    /zI {OMEGA 90 eq{H1}{H1 Denominateur div}ifelse} bind def
    zI 0 ge {zI HauteurLimite ge {/zI HauteurLimite def} if}
            {zI HauteurLimite neg le {/zI HauteurLimite neg def} if}
    ifelse
    zI m1 div theta cos mul
    zI m1 div theta sin mul
    zI
    \tx@ProjThreeD ]
    } for
    ] def
newpath
 TableauxPoints 0 get aload pop moveto
0  Pas 359 {
    /compteur exch def
    TableauxPoints compteur get aload pop
    lineto } for
closepath
 } def
% couleur de la facette
/cosV {1 xLight nXfacette mul
       yLight nYfacette mul
       zLight nZfacette mul
       add add
      NormeLight
       nXfacette dup mul
       nYfacette dup mul
       nZfacette dup mul
       add add sqrt mul div sub} bind def
% les facettes sur le cone
/facette { newpath
    /Denominateur {OMEGA sin iTA sin tanTHETA mul OMEGA cos mul add} def
     Denominateur 0 eq {/Denominateur 1e-4 def} if
    /zI {OMEGA 90 eq{H1}{H1 Denominateur div}ifelse} bind def
    zI 0 ge {zI HauteurLimite ge {/zI HauteurLimite def} if}
            {zI HauteurLimite neg le {/zI HauteurLimite neg def} if}
    ifelse
    zI m1 div iTA cos mul
    zI m1 div iTA sin mul
    zI
    \tx@ProjThreeD
     moveto
iTA Pas iTA increment add {%
    /iTA1 exch def
    /Denominateur {OMEGA sin iTA1 sin tanTHETA mul OMEGA cos mul add} def
     Denominateur 0 eq {/Denominateur 1e-4 def} if
    /zI {OMEGA 90 eq{H1}{H1 Denominateur div}ifelse} bind def
    zI 0 ge {zI HauteurLimite ge {/zI HauteurLimite def} if}
            {zI HauteurLimite neg le {/zI HauteurLimite neg def} if}
    ifelse
    zI m1 div iTA1 cos mul
    zI m1 div iTA1 sin mul
    zI
    \tx@ProjThreeD
    lineto
    } for
    /Denominateur {OMEGA sin iTA1 sin tanTHETA mul OMEGA cos mul add} def
     Denominateur 0 eq {/Denominateur 1e-4 def} if
    /zI {OMEGA 90 eq{H2}{H2 Denominateur div}ifelse} bind def
    zI 0 ge {zI HauteurLimite ge {/zI HauteurLimite def} if}
            {zI HauteurLimite neg le {/zI HauteurLimite neg def} if}
    ifelse
    zI m1 div iTA1 cos mul
    zI m1 div iTA1 sin mul
    zI
    \tx@ProjThreeD
    lineto
iTA increment add Pas neg iTA {%
    /iTA1 exch def
    /Denominateur {OMEGA sin iTA1 sin tanTHETA mul OMEGA cos mul add} def
     Denominateur 0 eq {/Denominateur 1e-4 def} if
    /zI {OMEGA 90 eq{H2}{H2 Denominateur div}ifelse} bind def
    zI 0 ge {zI HauteurLimite ge {/zI HauteurLimite def} if}
            {zI HauteurLimite neg le {/zI HauteurLimite neg def} if}
    ifelse
    zI m1 div iTA1 cos mul
    zI m1 div iTA1 sin mul
    zI
    \tx@ProjThreeD
    lineto
    } for
closepath } def
% le tracé de toutes les ellipses
Hstart Hstep Hstop {
    /H1 exch def
    /H2 {H1 \PstConiques@BandWidth\space \pst@number\psunit mul sub} bind def
H1 0 ge {
    /nZfacette THETA sin neg def}
        {
    /nZfacette THETA sin def}
ifelse
% la partie intérieure
0 increment 360 {%
    /iTA exch def
% normale à la facette
H1 0 ge {
    /nXfacette THETA cos iTA increment 2 div add cos mul def
    /nYfacette THETA cos iTA increment 2 div add sin mul def
    }
    {
    /nXfacette THETA cos iTA increment 2 div add cos mul neg def
    /nYfacette THETA cos iTA increment 2 div add sin mul neg def
    }
ifelse
% test de visibilité
    /PSfacette vX nXfacette mul
           vY nYfacette mul add
           vZ nZfacette mul add
    def
PSfacette 0 le { facette cosV
% remplissage des facettes
 Cyan cosV mul Magenta cosV mul Yellow cosV mul K cosV mul setcmykcolor
fill } if } for
% la partie extérieure
0 increment 360 {%
    /iTA exch def
% normale à la facette
H1 0 ge {
    /nXfacette THETA cos iTA increment 2 div add cos mul def
    /nYfacette THETA cos iTA increment 2 div add sin mul def
    }
    {
    /nXfacette THETA cos iTA increment 2 div add cos mul neg def
    /nYfacette THETA cos iTA increment 2 div add sin mul neg def
    }
ifelse
% test de visibilité
    /PSfacette vX nXfacette mul
           vY nYfacette mul add
           vZ nZfacette mul add
    def
PSfacette 0 ge { facette cosV
% remplissage des facettes
 Cyan cosV mul dup mul Magenta cosV mul dup mul Yellow cosV mul K cosV
 mul dup mul
 setcmykcolor
fill } if } for
 ellipse
  stroke
} for
 }% fin du code ps
\showpointsfalse
\end@OpenObj}}
\makeatother
%
\makeatletter
\let\ProjThreeD\tx@ProjThreeD
\def\pnodeThreeD(#1,#2,#3)#4{%
      \pst@Verb{%
          \psk@embedangle
          \psk@viewpoint
          \psk@viewangle
          \tx@SetMatrixThreeD}
  \pnode(!#1 #2 #3 \ProjThreeD){#4}}
\makeatother
%
\pagestyle{empty}
\begin{document}
\section{L'état du projet}
L'utilisation de \verb+\pst-xkey+ permet de rendre les paramètres
plus facilement accessibles.

Toutefois les dysfonctionnements essentiels n'ont pas trouvé de
solution :
\begin{itemize}
  \item affichage incorrect pour \texttt{vz<0} ou \texttt{vy<0} ;
  \item l'algorithme de rendu de couleurs est à définir. J'ai choisi le
  système de couleurs \texttt{CMYK} et calculé le cosinus
  $\cos(\overrightarrow{n},\overrightarrow{L})$, dans lequel $\overrightarrow{n}$ est la
  normale à la facette et $\overrightarrow{L}$ la direction des rayons
  lumineux. J'ai pris plutôt
  $1-\cos(\overrightarrow{n},\overrightarrow{L})$ et appliqué ce coefficient
  aux couleurs.
  \item Les paramètres de \verb+viewpoint=+ ne sont pas pris en
  compte si on les passe directement dans la commande
  \verb+\SectionConique[viewpoint=...]+
\end{itemize}
Les explications théoriques sont dans le fichier :
\verb+coniques_presentation.tex+.
\section{Sections elliptiques}
\begin{pspicture}(-5,-7)(5,10)
\psset{viewpoint=0.5 0.5 0.3}%
\pnodeThreeD(0,0,0){O} \pnodeThreeD(0,0,11){Z}
\pnodeThreeD(5,0,0){X} \pnodeThreeD(0,5,0){Y} \psline{->}(O)(X)
\psline{->}(O)(Z) \psline{->}(O)(Y) \uput[180](Z){$z$}
\uput[0](X){$x$} \uput[0](Y){$y$}
% pour un mode brouillon, rapide Draft=true ou augmenter increment=10 par ex.
\SectionConique[Draft=true,Cyan=1,xLight=1,yLight=1,zLight=0,BandWidth=0.35,Hstop=8]%
\end{pspicture}

\section{Sections paraboliques}
\begin{pspicture}(-5,-7)(5,10)
\psset{viewpoint=0.5 1 -0.2}%
\SectionConique[AnglePlan=30]%
\end{pspicture}

\section{Sections hyperboliques}
\begin{pspicture}(-5,-7)(5,10)
\psset{viewpoint=0.5 0.7 0.2}%
\SectionConique[AnglePlan=0]%
\end{pspicture}

\end{document}
