\documentclass[12pt,a4paper]{article}
\usepackage{pst-plot,pst-3d,pst-node}%
\pagestyle{empty}
\input{pommereau.tex}
\SpecialCoor
\makeatletter
\def\SectionConiqueE{\pst@object{SectionConiqueE}}
\def\SectionConiqueE@i{\@ifnextchar[{\SectionConiqueE@do}{\SectionConiqueE@do[]}}
\def\SectionConiqueE@do[#1]#2#3{{%
% #2 hauteur
% #3 demi-angle au sommet
\pst@Verb{%
          \psk@embedangle
          \psk@viewpoint
          \psk@viewangle
          \tx@SetMatrixThreeD}
\pst@killglue
\psset{#1}%
\begin@OpenObj
\addto@pscode{%
% Les couleurs
/Cyan 1 def
/Magenta 1 def
/Yellow 0.2 def
/K 1 def
% les rayons de lumière
/xLight 1 def
/yLight 1 def
/zLight 0 def
/NormeLight {xLight dup mul yLight dup mul zLight dup mul add add
            sqrt} bind def
% Les datas
    /increment 10 def
    /THETA #3 def
    /Hauteur #2 \pst@number\psunit mul def
    /Rcone {Hauteur THETA cos div THETA sin mul} bind def
    /OMEGA \OMEGA\space def
    /tanOMEGA {OMEGA dup sin exch cos div} bind def
    /m1 {90 THETA sub dup sin exch cos div} bind def
    /H \nhauteur\space\pst@number\psunit mul def
% Vecteur ViewPoint
    /vX \vx\space def
    /vY \vy\space def
    /vZ \vz\space def
% la partie restante après coupe
0 increment 360 increment sub {%
    /iTA exch def
% normale à la facette
    /nXfacette THETA cos iTA increment 2 div add cos mul def
    /nYfacette THETA cos iTA increment 2 div add sin mul def
    /nZfacette THETA sin neg def
% test de visibilité
    /PSfacette vX nXfacette mul
           vY nYfacette mul add
           vZ nZfacette mul add
    def
/facetteReste {
newpath
    /zI {OMEGA 90 eq{H}{H 1 iTA sin m1 tanOMEGA mul div add div OMEGA sin div}ifelse} bind def
    zI m1 div iTA cos mul
    zI m1 div iTA sin mul
    zI
    \tx@ProjThreeD
     moveto
iTA 1 iTA increment add {%
    /iTA1 exch def
    /zI {OMEGA 90 eq{H}{H 1 iTA1 sin m1 tanOMEGA mul div add div OMEGA sin div}ifelse} bind def
    zI m1 div iTA1 cos mul
    zI m1 div iTA1 sin mul
    zI
    \tx@ProjThreeD
    lineto
    } for
    0 0 lineto
closepath
} def
PSfacette 0 ge {
facetteReste
/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
% remplissage des facettes
Cyan cosV mul Magenta cosV mul Yellow cosV mul 0 setcmykcolor
fill
facetteReste
0 setgray
stroke } if
} for
% l'ellipse du plan de coupe
/ellipse {
/TableauxPoints [
0 1 359 {% on décrit le cercle
    /theta exch def [
    /zI {OMEGA 90 eq{H}{H 1 theta  sin m1 tanOMEGA mul div add div OMEGA sin div}ifelse} bind def
    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 1 359 {
    /compteur exch def
    TableauxPoints compteur get aload pop
    lineto } for
closepath
 } def
%le produit scalaire du vecteur viewpoint et du vecteur normal au plan >0 ?
  /Test  vY OMEGA cos mul %
         vZ OMEGA sin mul
         add def
Test 0 ge {
gsave
 ellipse
1 1 0 setrgbcolor
fill
grestore
ellipse
% 0 setgray
 stroke
} if
%MaillageConePositif
%MaillageConeNegatif
 }% fin du code ps
\showpointsfalse
\end@OpenObj}}
%

\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}}
%
\def\ConeIIID{\pst@object{ConeIIID}}
\def\ConeIIID@i{\@ifnextchar[{\ConeIIID@do}{\ConeIIID@do[]}}
\def\ConeIIID@do[#1]#2#3{{%
% #2 hauteur
% #3 demi-angle au sommet
\pst@Verb{%
          \psk@embedangle
          \psk@viewpoint
          \psk@viewangle
          \tx@SetMatrixThreeD}
\pst@killglue
\psset{#1}%
\begin@OpenObj
\addto@pscode{%
/MaillageConePositif {
1 setlinejoin
0 increment 360 increment sub {%
    /theta exch def
% normale à la facette
    /nXfacette THETA cos theta increment 2 div add cos mul def
    /nYfacette THETA cos theta increment 2 div add sin mul def
    /nZfacette THETA sin neg def
% test de visibilité
    /PSfacette vX nXfacette mul
           vY nYfacette mul add
           vZ nZfacette mul add
    def
% dessin de la facette si la condition de visibilité est satisfaite
PSfacette 0 ge {
facetteSup
stroke
} if
} for
} def
%
/MaillageConeNegatif {
1 setlinejoin
0 increment 360 increment sub {%
    /theta exch def
% normale à la facette
    /nXfacette THETA cos theta increment 2 div add cos mul def
    /nYfacette THETA cos theta increment 2 div add sin mul def
    /nZfacette THETA sin def
% test de visibilité
    /PSfacette vX nXfacette mul
           vY nYfacette mul add
           vZ nZfacette mul add
    def
% dessin de la facette si la condition de visibilité est satisfaite
PSfacette 0 ge {
facetteInf
stroke
} if
} for
} def
/facetteSup {
newpath
    /Xpoint Rcone theta cos mul def
    /Ypoint Rcone theta sin mul def
     Xpoint Ypoint Hauteur \tx@ProjThreeD
     moveto
theta 1 theta increment add {%
    /theta1 exch def
    /Xpoint Rcone theta1 cos mul def
    /Ypoint Rcone theta1 sin mul def
     Xpoint Ypoint Hauteur \tx@ProjThreeD
    lineto
    } for
    0 0 lineto
closepath} def
%
/facetteInf {
newpath
    /Xpoint Rcone theta cos mul def
    /Ypoint Rcone theta sin mul def
     Xpoint Ypoint Hauteur neg \tx@ProjThreeD
     moveto
theta 1 theta increment add {%
    /theta1 exch def
    /Xpoint Rcone theta1 cos mul def
    /Ypoint Rcone theta1 sin mul def
     Xpoint Ypoint Hauteur neg \tx@ProjThreeD
    lineto
    } for
    0 0 lineto
closepath} def
% Les datas
    /increment 10 def
    /THETA #3 def
    /Hauteur #2 \pst@number\psunit mul def
    /Rcone {Hauteur THETA cos div THETA sin mul} bind def
    /OMEGA \OMEGA\space def
    /tanOMEGA {OMEGA dup sin exch cos div} bind def
    /m1 {90 THETA sub dup sin exch cos div} bind def
    /H \nhauteur\space\pst@number\psunit mul def
% Vecteur ViewPoint
    /vX \vx\space def
    /vY \vy\space def
    /vZ \vz\space def
% le dessin de la face supérieure
/face_sup {
/TableauxPoints [
0 1 359 {% on décrit le cercle
    /theta exch def [
    /Xpoint Rcone theta cos mul def
    /Ypoint Rcone theta sin mul def
     Xpoint Ypoint Hauteur \tx@ProjThreeD ]
    } for
    ] def
newpath
 TableauxPoints 0 get aload pop moveto
0 1 359 {
    /compteur exch def
    TableauxPoints compteur get aload pop
    lineto } for
%0.7 setgray
closepath
%fill
%stroke
 } def
 %
/face_inf {
/TableauxPoints [
0 1 359 {% on décrit le cercle
    /theta exch def [
    /Xpoint Rcone theta cos mul def
    /Ypoint Rcone theta sin mul def
     Xpoint Ypoint Hauteur neg \tx@ProjThreeD ]
    } for
    ] def
newpath
 TableauxPoints 0 get aload pop moveto
0 1 359 {
    /compteur exch def
    TableauxPoints compteur get aload pop
    lineto } for
%0.7 setgray
closepath
%fill
% stroke
 } def
MaillageConePositif
%MaillageConeNegatif
 vZ 0 ge {face_sup}{face_inf} ifelse
 }% fin du code ps
\showpointsfalse
\end@OpenObj}}

\makeatother
\definecolor{grisbleu}{rgb}{0.85, 0.85, .95}
\begin{document}
%\pstpyth{6pt}{8pt}{\test}
%\expandafter\clear\the\test
\def\nhauteur{4.5}%
\def\OMEGA{55}%
\cossin\cosO\sinO{\OMEGA}%
\realmul\YH=\cosO*\nhauteur%
\realmul\ZH=\sinO*\nhauteur%
\begin{pspicture}(-5,-8)(5,10)
\pstVerb{%
    /OMEGA \OMEGA\space def
    /H \nhauteur\space def
    }%
\def\vx{0.5}\def\vy{0.3}\def\vz{0.2}%
\psset{viewpoint={\vx} {\vy} {\vz}}%
\pnodeThreeD(0,0,0){O}
\pnodeThreeD(0,0,11){Z}
\pnodeThreeD(5,0,0){X}
\pnodeThreeD(0,5,0){Y}
\ThreeDput[normal=0 0 1](0,0,0){\psframe[fillstyle=solid,fillcolor=grisbleu](-5,-5)(5,5)
    \psgrid[gridlabels=0,subgriddiv=0](-5,-5)(5,5)}
\psline{->}(O)(X)
\psline{->}(O)(Z)
\psline{->}(O)(Y)
\uput[180](Z){$z$}
\uput[180](X){$x$}
\uput[0](Y){$y$}
\SectionConiqueE{9}{30}% hauteur, demi-angle au sommet
\ThreeDput[normal=0 {\cosO} {\sinO}](0,\YH,\ZH){%
%        \parametricplot[fillstyle=vlines,hatchcolor=red]{0}{360}{%
%    B t cos mul A t sin mul HO' add OMEGA 0 lt {neg} if}
    \psgrid[gridlabels=0,subgriddiv=0,gridcolor=red](-4,-3)(4,10)%
    \psframe[linewidth=1mm](-4,-3)(4,10)}
\pnodeThreeD(0,0,H 90 OMEGA sub cos div){Z'}
\psdot(Z')
\psline{->}(Z')(Z)
\ConeIIID{10}{30}% hauteur, demi-angle au sommet
\pnodeThreeD(0,H OMEGA cos mul,H OMEGA sin mul){H}
\psdot(H)
\uput[0](H){$H$}
\psline[linecolor=red,linestyle=dashed](O)(H)
\end{pspicture}
\end{document}
