%% $Id: pst-hyperboloid-doc.tex 1278 2026-06-04 15:27:05Z herbert $
\DocumentMetadata{lang=en}
\documentclass[11pt,english,BCOR10mm,DIV12,bibliography=totoc,parskip=false,
   smallheadings, headexclude,footexclude,twoside]{pst-doc}

\usepackage{pst-hyperboloid}
\let\pstFV\fileversion

\addbibresource{\jobname.bib}

\usepackage{enumitem,xltabular,hvindex,hvlogos,minted-code,hvextern}
\setkeys{hv}{moveToExampleDir,ExampleDir=exa-pdf,showFilename=false,force=false}

\setlist{nosep}

\usepackage{makeidx}
\makeindex

\def\bgImage{\begin{pspicture}(-5,-4)(5,7)
\psset{viewpoint=50 60 30 rtp2xyz,lightsrc=viewpoint,Decran=50}
\pstVerb{/decalage 150 3.14159265359 mul 180 div def /H 4 def /Rayon 2 def}%
\defFunction[algebraic]{hyperboloidonesheet}(u,v)%
  {Rayon*(cos(u)*(1-v)+v*(cos(u+decalage)))}
  {Rayon*(sin(u)*(1-v)+v*(sin(u+decalage)))}
  {v*H}%
\psSolid[object=surfaceparametree,dotsize=3.5pt,
  ngrid=36 18,
  tablez=0 0.1 4 {} for,
 zcolor=0 1 0.5 1,
  base=0 2 Pi mul 1 0 ,
  function=hyperboloidonesheet]
\gridIIID[Zmin=0,Zmax=4](-3,3)(-3,3)
\end{pspicture}
}

\title{Hyperbolids with PSTricks}
\author{Manuel Luque \\Herbert Voß}


\begin{document}
\settitle

\tableofcontents

\section{Introduction}

The command is \Lcs{psHyperboloid}\Largs{options}\Larg{(x,y,z)}. The examples can be run
with the sequence \Lprog{latex}$\rightarrow$""\Lprog{dvips}$\rightarrow$""\Lprog{ps2pdf}
or with \Lprog{lualatex} if you want directly the \Lext{pdf} output. Some of
the examples with a splitted object needs heavy calculations which may take
more than 30 minutes on slow machines!

The mesh is defined by the option \LKeyword{ngrid=n1 n2}, 
where \texttt{n1} is the number of meridians and \texttt{n2} is 
the number of levels.
The \Index{height} of the hyperboloid is defined by the option \LKeyword{h=8}, 
and the radius of the bases by \LKeyword{R=4} (default values).
The number of inner and outer facets is calculated using the formula:

\[
n_1\times n_2\times 4\times 2
\]

If one wishes to mesh only the exterior, the option to be 
used—after calculation—is:

\begin{verbatim}
fcol= n1*n2*4 2  n1*n2*4*2{
  /Rang exch def
  Rang (Blue) Rang 1 add (Yellow)
} for
\end{verbatim}

\begin{center}
\input{\jobname-exa1}
\end{center}

\begin{codeblockA}[title=First example]
\begin{pspicture}(-8,-7.2)(6,6)
\psset{viewpoint=25 25 30 rtp2xyz,lightsrc=viewpoint,Decran=25}
\gridIIID[Zmin=-4,Zmax=4,showAxes=false](-4,4)(-4,4)
\psHyperboloid[
  hollow,linewidth=0.25\pslinewidth,grid,
  % inouthue=1 0 0.5 1,
  fcol= 0 2 5760{
     /Rang exch def
     Rang (Black) Rang 1 add (White)
  } for,
  ngrid=36 20]
\psLineIIID(4,-4,4)(4,4,4)(-4,4,4)
\psLineIIID(4,4,-4)(4,4,4)
\end{pspicture}
\end{codeblockA}


%%

\begin{center}
\input{\jobname-exa2}
\end{center}


\begin{codeblockA}[title=First example]
\begin{pspicture}(-8,-7)(6,5)
\psset{viewpoint=25 25 20 rtp2xyz,lightsrc=,Decran=25}
\gridIIID[Zmin=-4,Zmax=4,showAxes=false](-4,4)(-4,4)
\psHyperboloid[
  hollow,linewidth=0.25\pslinewidth,grid,% inouthue=1 0 0.5 1,
  fcol= 0 2 862{/Rang exch def
    Rang (Blue) Rang 1 add (Yellow)
  } for
  864 2 1726{/Rang exch def
    Rang (Cyan) Rang 1 add (Yellow)
  } for,
  ngrid=18 12
]
\psLineIIID(4,-4,4)(4,4,4)(-4,4,4)
\psLineIIID(4,4,-4)(4,4,4)
\end{pspicture}
\end{codeblockA}



\section{Hyperboloid of one sheet}

The hyperboloid of one sheet is a ruled surface. 
We consider the \Index{generator line} $\overline{A_1A_2}$, 
defined by the cylinder's height $H$, its radius $R$, and the angular 
offset $θ$ between the two endpoints.\index{cylinder}

From this, we derive the \Index{parametric equations} for the hyperboloid:
\[
\left\{
\begin{matrix}[l]
x =&R\big((1-k)\cos(t)+k\cos(t+\theta)\big)\\
y =&R\big((1-k)\sin(t)+k\sin(t+\theta)\big)\\
z =&kH
\end{matrix}
\right.
\]

The parameter ranges are: $k ∈ [0, 1]$ and $t ∈ [0, 2π]$. 
The value of $θ$ controls the constriction at the center of 
the hyperboloid. Depending on the sign of $θ$, the generator lines 
spiral to the right or to the left.

\subsection{Examples and various possible representations}


\begin{center}
\input{\jobname-exa3}
\end{center}

\begin{codeblockA}[title = Example 1]
\begin{pspicture}(-8,-3)(8,9)
\psset{unit=1cm}
\psset{viewpoint=50 60 30 rtp2xyz,lightsrc=viewpoint,Decran=50}
\psframe(-5,-3)(5,9)
\pstVerb{/iface 0 def
         /decalage 150 3.14159265359 mul 180 div def /H 6 def /Rayon 3 def}%
\defFunction[algebraic]{hyperboloidonesheet}(u,v)%
  {Rayon*(cos(u)*(1-v)+v*(cos(u+decalage)))}
  {Rayon*(sin(u)*(1-v)+v*(sin(u+decalage)))}
  {v*H}
\psSolid[object=surfaceparametree,
  ngrid=36 18, hue=0 1 0.5 1, %fillcolor=JaunePale,
  incolor=yellow!20,%show=all,num=all,
  fcol= 0 1 35{  % PS code for the color setting
    /Rang exch def
    Rang 2 div cvi 2 mul cvi 
    Rang eq {/Damier {iface (Red)} def}{/Damier {iface (Cyan)} def} ifelse
    18 { Damier /iface iface 1 add def } repeat
  } for, % end fcol=
  base=0 2 Pi mul 0 1, function=hyperboloidonesheet]
\gridIIID[Zmin=0,Zmax=6](-3,3)(-3,3)
\end{pspicture}
\end{codeblockA}

%%%


\begin{center}
\input{\jobname-exa4}
\end{center}


\begin{codeblockA}[breakable, title=Example 2]
\begin{pspicture}(-8,-3)(8,8)
\psset{unit=1cm}
\psset{viewpoint=50 60 30 rtp2xyz,lightsrc=viewpoint,Decran=50}
\psframe(-5,-3)(5,8)
\pstVerb{/iface 0 def
         /decalage -90 3.14159265359 mul 180 div def /H 4 def /Rayon 3 def}%
\defFunction[algebraic]{hyperboloidonesheet}(u,v)%
  {Rayon*(cos(u)*(1-v)+v*(cos(u+decalage)))}
  {Rayon*(sin(u)*(1-v)+v*(sin(u+decalage)))}
  {v*H}%
\psSolid[object=surfaceparametree, ngrid=36 18,
  fcol= 0 1 71{/Rang exch def
               Rang 2 div cvi 2 mul cvi 
               Rang eq {/Damier {iface (Black) iface 1 add (White)} def}{/Damier {iface (White) iface 1 add (Black)} def}ifelse
     9{
        Damier
        /iface iface 2 add def
     } repeat
  } for,
  base=0 2 Pi mul 0 1, function=hyperboloidonesheet]
\gridIIID[Zmin=0,Zmax=4](-3,3)(-3,3)
\end{pspicture}
\end{codeblockA}

%%---

\begin{center}
\input{\jobname-exa5}
\end{center}



\begin{codeblockA}[breakable, title=Example 3]
\begin{pspicture}(-8,-3)(8,8)
\psset{unit=1cm}
\psset{viewpoint=50 60 30 rtp2xyz,lightsrc=viewpoint,Decran=50}
\psframe(-5,-3)(5,8)
\pstVerb{/iface 0 def
         /decalage -120 3.14159265359 mul 180 div def /H 4 def /Rayon 3 def}%
\defFunction[algebraic]{hyperboloidonesheet}(u,v)%
  {Rayon*(cos(u)*(1-v)+v*(cos(u+decalage)))}
  {Rayon*(sin(u)*(1-v)+v*(sin(u+decalage)))}
  {v*H}%
\psSolid[object=surfaceparametree,
  ngrid=36 18, incolor=yellow!20,
  fcol= 0 1 35{/Rang exch def
     Rang 2 div cvi 2 mul cvi Rang eq {/Damier {iface (Black) iface 1 add (White)} def}{/Damier {iface (White) iface 1 add (Black)} def}ifelse
     9 { Damier /iface iface 2 add def } repeat
  } for, base=0 2 Pi mul 1 0, function=hyperboloidonesheet]
\gridIIID[Zmin=0,Zmax=4](-3,3)(-3,3)
\end{pspicture}
\end{codeblockA}

%%%%%%

\begin{center}
\input{\jobname-exa6}
\end{center}

\begin{codeblockA}[breakable, title=Example 3]
\begin{pspicture}(-5,-4)(5,7)
\psset{viewpoint=50 60 30 rtp2xyz,lightsrc=viewpoint,Decran=50}
\psframe(-5,-4)(5,7)
\pstVerb{/decalage 150 3.14159265359 mul 180 div def /H 4 def /Rayon 2 def}%
\defFunction[algebraic]{hyperboloidonesheet}(u,v)%
  {Rayon*(cos(u)*(1-v)+v*(cos(u+decalage)))}
  {Rayon*(sin(u)*(1-v)+v*(sin(u+decalage)))}
  {v*H}%
\psSolid[object=surfaceparametree,dotsize=3.5pt,
  ngrid=36 18,
  tablez=0 0.1 4 {} for,
 zcolor=0 1 0.5 1,
  base=0 2 Pi mul 1 0 ,
  function=hyperboloidonesheet]
\gridIIID[Zmin=0,Zmax=4](-3,3)(-3,3)
\end{pspicture}
\end{codeblockA}

\clearpage %%%%%%%%%%-----------------

\section{Sections of a Hyperboloid of One Sheet}
The radius of the generating hyperbola varies from bottom to top, 
following the relation:

\[
\frac{r^2}{a^2}=4k^2\left(\frac{R^2}{a^2}-1\right)+1
\]
\[
r=\sqrt{4k^2(R^2-a^2)+a^2}\ \text{with}\ -\frac{1}{2}\leqslant k\leqslant\frac{1}{2}
\]



\begin{center}
\input{\jobname-exa7}
\end{center}


\begin{codeblockA}[breakable, title=Example 4]
\begin{pspicture}(-8,-7)(8,7)
\psset{solidmemory, viewpoint=50 30 20 rtp2xyz,lightsrc=viewpoint,Decran=50}
\pstVerb{/Hauteur 8 def
         /nEtages 20 def
         /Pas 1 nEtages div def
         /nMeridiens 36 def
         /DemiAxeFocal 1 def % rayon de l'étranglement au milieu
         /RayonBases 4 def}%
\psSolid[object=grille,base=-4 4 -4 4,linewidth=0.5\pslinewidth](0,0,Hauteur 2 div neg)
\psSolid[object=new, incolor=yellow!50, fillcolor=ForestGreen!20, hollow,
         sommets=0.5 Pas neg -0.5 Pas neg add {
           /k exch def
           0 1 nMeridiens 1 sub {
             /i exch def
             /r 4 k dup mul mul RayonBases dup mul DemiAxeFocal dup mul sub mul 
                  DemiAxeFocal dup mul add sqrt def
             360 nMeridiens div i mul cos r mul
             360 nMeridiens div i mul sin r mul
             k Hauteur mul
           } for
         } for,
       faces={ 0 1 nEtages 1 sub {
         /k1 exch def
         k1 nMeridiens mul 1 add 1 k1 1 add nMeridiens mul 1 sub {
           /i exch def
           [i i 1 sub nMeridiens i add 1 sub nMeridiens i add]
         } for
         [k1 nMeridiens mul k1 1 add nMeridiens mul 1 sub k1 2 add nMeridiens mul 1 sub k1 1 add nMeridiens mul]
       } for
     }]% end \pssolid
\gridIIID[Zmin=-4,Zmax=4](-4,4)(-4,4)
\end{pspicture}
\end{codeblockA}






\newpage


\begin{center}
\input{\jobname-exa8}
\end{center}



% dessin 2 : coupe par un plan vertical tangent

\begin{codeblockA}[breakable, title=Example 5]
\begin{pspicture}(-8,-7)(8,7)
\psset{solidmemory,viewpoint=50 30 20 rtp2xyz,lightsrc=viewpoint,Decran=50}
\pstVerb{/Hauteur 8 def
         /nEtages 20 def
         /Pas 1 nEtages div def
         /nMeridiens 36 def
         /DemiAxeFocal 2 def % rayon de l'étranglement au milieu
         /RayonBases 4 def}%
\psSolid[object=grille,base=-4 4 -4 4,linewidth=0.5\pslinewidth](0,0,Hauteur 2 div neg)
\psSolid[object=new,fillcolor=red!50,incolor=yellow,hollow,action=draw**,
  sommets=0.5 Pas neg -0.5 Pas neg add{
    /k exch def
    0 1 nMeridiens 1 sub {
      /i exch def
      /r 4 k dup mul mul RayonBases dup mul DemiAxeFocal dup mul sub mul DemiAxeFocal dup mul add sqrt def
      360 nMeridiens div i mul cos r mul
      360 nMeridiens div i mul sin r mul
      k Hauteur mul
    } for
  } for,
  faces={
    0 1 nEtages 1 sub {
      /k1 exch def
      k1 nMeridiens mul 1 add 1 k1 1 add nMeridiens mul 1 sub {
        /i exch def
        [i i 1 sub nMeridiens i add 1 sub nMeridiens i add]
      } for
      [k1 nMeridiens mul k1 1 add nMeridiens mul 1 sub k1 2 add nMeridiens mul 1 sub k1 1 add nMeridiens mul]
    } for
  },
  plansepare={[1 0 0 DemiAxeFocal neg]}, name=coupeHyperboloidTest,action=none]
\psSolid[object=load,incolor=yellow!50,fillcolor=ForestGreen!20,rm=2 609,
   intersectionplan={[1 0 0 DemiAxeFocal neg]},intersectioncolor=(bleu), intersectionlinewidth=2,
   intersectiontype=0, load=coupeHyperboloidTest1]
\psSolid[object=plan, definition=equation,args={[1 0 0 DemiAxeFocal neg] 90},linecolor=red,
%   fillcolor=Aquamarine,
   planmarks,base=-4 4 -4 4,showBase,action=draw]
\gridIIID[Zmin=-4,Zmax=4](-4,4)(-4,4)
\end{pspicture}
\end{codeblockA}





\newpage
% dessin 3 : coupe par un plan vertical x>a

\begin{center}
\input{\jobname-exa9}
\end{center}
% dessin 2 : coupe par un plan vertical tangent

\begin{codeblockA}[breakable, title=Example 6]
\begin{pspicture}(-8,-7)(8,7)
\psset{solidmemory, viewpoint=50 30 20 rtp2xyz,lightsrc=viewpoint,Decran=50}
\pstVerb{/Hauteur 8 def          /nEtages 20 def
         /Pas 1 nEtages div def  /nMeridiens 36 def
         /DemiAxeFocal 1 def % rayon de l'étranglement au milieu
         /RayonBases 4 def
         /DemiAxeNonFocal Hauteur 2 div RayonBases dup mul DemiAxeFocal dup mul sub sqrt div DemiAxeFocal mul def
         /X0 1.5 def    /Z0 DemiAxeNonFocal X0 DemiAxeFocal div dup mul 1 sub sqrt mul def
         /Ymax DemiAxeFocal Hauteur 2 DemiAxeNonFocal mul div dup mul 1 add X0 DemiAxeFocal div dup mul sub sqrt mul def}%
\psSolid[object=grille,base=-4 4 -4 4,linewidth=0.5\pslinewidth](0,0,Hauteur 2 div neg)
\psSolid[object=new,incolor=yellow!50, fillcolor=ForestGreen!20, hollow,
         sommets=
           0.5 Pas neg -0.5 Pas neg add{
             /k exch def
             0 1 nMeridiens 1 sub {
               /i exch def
               /r 4 k dup mul mul RayonBases dup mul DemiAxeFocal dup mul sub mul DemiAxeFocal dup mul add sqrt def
               360 nMeridiens div i mul cos r mul
               360 nMeridiens div i mul sin r mul
               k Hauteur mul
             } for
           } for,
    faces={ 0 1 nEtages 1 sub {
	        /k1 exch def
            k1 nMeridiens mul 1 add 1 k1 1 add nMeridiens mul 1 sub {
              /i exch def
              [i i 1 sub nMeridiens i add 1 sub nMeridiens i add]
            } for
            [k1 nMeridiens mul k1 1 add nMeridiens mul 1 sub k1 2 add nMeridiens mul 1 sub k1 1 add nMeridiens mul]
          } for},
  plansepare={[1 0 0 -1.5]},name=coupeHyperboloidTest,action=none]
\psSolid[object=load,deactivatecolor=true, %fillcolor=red!50,incolor=yellow,rm=0,
         linewidth=0.5\pslinewidth,rm=0,load=coupeHyperboloidTest1]
\psSolid[object=plan,definition=equation,args={[1 0 0 -1.5] 90},linecolor=blue,%   fillcolor=Aquamarine,
   planmarks,base=-4 4 -4 4,name=PlanCoupe,showBase,action=draw]
\defFunction[algebraic]{hyperbol1}(t){X0}{t}{sqrt(((X0^2+t^2)/(DemiAxeFocal^2)-1))*DemiAxeNonFocal}
\defFunction[algebraic]{hyperbol2}(t){X0}{t}{-sqrt(((X0^2+t^2)/(DemiAxeFocal^2)-1))*DemiAxeNonFocal}
\psSolid[object=courbe,linewidth=2\pslinewidth,function=hyperbol1,range=Ymax neg Ymax,r=0,linecolor=red]%
\psSolid[object=courbe,linewidth=2\pslinewidth,function=hyperbol2,range=Ymax neg Ymax,r=0,linecolor=red]%
\gridIIID[Zmin=-4,Zmax=4](-4,4)(-4,4)
\end{pspicture}
\end{codeblockA}



\newpage
% dessin 4 : coupe par un plan vertical x>a
\begin{center}
\input{\jobname-exa10}
\end{center}

\begin{codeblockA}[breakable, title=Example 6]
\begin{pspicture}(-8,-7)(8,7)
\psset{solidmemory,viewpoint=50 30 20 rtp2xyz,lightsrc=viewpoint,Decran=50,resolution=200}
\pstVerb{/Hauteur 8 def         /nEtages 20 def
         /Pas 1 nEtages div def /nMeridiens 36 def
         /DemiAxeFocal 1 def % rayon de l'étranglement au milieu
         /RayonBases 4 def
         /DemiAxeNonFocal Hauteur 2 div RayonBases dup mul DemiAxeFocal dup mul sub sqrt div DemiAxeFocal mul def
         /X0 0.5 def  /Y0 DemiAxeFocal 1 X0 DemiAxeFocal div dup mul sub sqrt mul def
         /Ymax RayonBases def}%
\psSolid[object=grille,base=-4 4 -4 4,linewidth=0.5\pslinewidth](0,0,Hauteur 2 div neg)%
\psSolid[object=new,fillcolor=red!50,incolor=yellow,hollow,action=draw**,
	sommets=
	  0.5 Pas neg -0.5 Pas neg add{
		/k exch def
		0 1 nMeridiens 1 sub {
    	  /i exch def
    	  /r 4 k dup mul mul RayonBases dup mul DemiAxeFocal dup mul sub mul DemiAxeFocal dup mul add sqrt def
    	  360 nMeridiens div i mul cos r mul
    	  360 nMeridiens div i mul sin r mul
    	  k Hauteur mul
	  	} for
	  } for
	  0 1 nMeridiens 1 sub {/J exch def
        RayonBases 360 nMeridiens div J mul cos mul
        RayonBases 360 nMeridiens div J mul sin mul
    	Hauteur 2 div } for,
	faces={
	  0 1 nEtages 1 sub {
		/k1 exch def
		k1 nMeridiens mul 1 add 1 k1 1 add nMeridiens mul 1 sub {
		  /i exch def
		  [i i 1 sub nMeridiens i add 1 sub nMeridiens i add]
		} for
		[k1 nMeridiens mul k1 1 add nMeridiens mul 1 sub k1 2 add nMeridiens mul 1 sub k1 1 add nMeridiens mul]
	  } for},
  plansepare={[1 0 0 -0.5]},name=coupeHyperboloidTest, action=none]
\psSolid[object=load,incolor=yellow!50,fillcolor=ForestGreen!20,linewidth=0.5\pslinewidth,
         rm=0 1,%numfaces=all,%rm=0,
         % intersectionplan={[1 0 0 -0.5]},
         % intersectioncolor=(bleu),
         % intersectionlinewidth=2,
         % intersectiontype=0,
         load=coupeHyperboloidTest1]
\defFunction[algebraic]{hyperbol3}(t){X0}{t}{DemiAxeNonFocal*sqrt((t^2+X0^2)/(DemiAxeFocal^2)-1)}
\defFunction[algebraic]{hyperbol4}(t){X0}{t}{-DemiAxeNonFocal*sqrt((t^2+X0^2)/(DemiAxeFocal^2)-1)}
\psSolid[object=courbe,linewidth=2\pslinewidth,function=hyperbol3,range=Y0 neg -4,
   r=0,linecolor=red]%
\psSolid[object=courbe,linewidth=2\pslinewidth,
   function=hyperbol3,range=Y0 4,r=0,linecolor=red]%
\psSolid[object=courbe,linewidth=2\pslinewidth,
   function=hyperbol4,range=Y0 4,r=0,linecolor=red]%
\psSolid[object=courbe,linewidth=2\pslinewidth,
   function=hyperbol4,range=Y0 neg -4,r=0,linecolor=red]%
\psSolid[object=plan, definition=equation,args={[1 0 0 -0.5] 90},linecolor=red,
   planmarks, base=-4 4 -4 4, showBase,action=draw
]
\gridIIID[Zmin=-4,Zmax=4](-4,4)(-4,4)
%\psPoint(X0,Y0,0){P}\psdot(P)
\end{pspicture}
\end{codeblockA}



\newpage
% dessin 5 : coupe par un plan incliné : x+z=0 ellipse


\begin{center}
\input{\jobname-exa11}
\end{center}

\begin{codeblockA}[breakable, title=Example 7]
\begin{pspicture}(-8,-7)(8,9)
\psset{solidmemory,viewpoint=100 30 20 rtp2xyz,lightsrc=viewpoint,Decran=133}
\pstVerb{/Hauteur 8 def          /nEtages 36 def
         /Pas 1 nEtages div def  /nMeridiens 36 def
         /DemiAxeFocal 1 def % rayon de l'étranglement au milieu
         /RayonBases 3 def
         /DemiAxeNonFocal Hauteur 2 div RayonBases dup mul DemiAxeFocal dup mul sub sqrt div DemiAxeFocal mul def
         /xMax DemiAxeNonFocal DemiAxeFocal mul DemiAxeNonFocal dup mul DemiAxeFocal dup mul sub sqrt div def
         /GrandAxe xMax 2 sqrt mul def}%
\psSolid[object=grille,base=-3 3 -3 3,linewidth=0.5\pslinewidth,linecolor=red](0,0,Hauteur 2 div neg)%
\psSolid[object=new,fillcolor=red!50,incolor=yellow,%hollow,
  action=draw*,
  sommets=
	0.5 Pas neg -0.5 Pas neg add{
	  /k exch def
	  0 1 nMeridiens 1 sub {
    	/i exch def
    	/r 4 k dup mul mul RayonBases dup mul DemiAxeFocal dup mul sub mul DemiAxeFocal dup mul add sqrt def
    	360 nMeridiens idiv i mul cos r mul
    	360 nMeridiens idiv i mul sin r mul
    	k Hauteur mul
	  } for
	} for,
  faces={
	0 1 nEtages 1 sub {
	  /k1 exch def
	  k1 nMeridiens mul 1 add 1 k1 1 add nMeridiens mul 1 sub {
	    /i exch def
	    [i i 1 sub nMeridiens i add 1 sub nMeridiens i add]
	  } for
	  [k1 nMeridiens mul k1 1 add nMeridiens mul 1 sub k1 2 add nMeridiens mul 1 sub k1 1 add nMeridiens mul]
    } for
	% faces du dessus et de dessous
	%[0 1 nMeridiens 1 sub {}for]
	%[nMeridiens nEtages 1 add mul 1 sub -1  nMeridiens nEtages mul {}for ]
  },plansepare={[1 0 1 0]}, name=coupeHyperboloidTest,action=none]
\psSolid[object=load,incolor=yellow!50, fillcolor=ForestGreen!20,linewidth=0.5\pslinewidth,
   rm=0,load=coupeHyperboloidTest1,hollow=true](0,0,0)
\defFunction[algebraic]{ellipse}(t){DemiAxeFocal*cos(t)}{GrandAxe*sin(t)}{}
\psSolid[object=plan,definition=equation,args={[1 0 1 0] 90},linecolor=red,fillcolor=Aquamarine,
   planmarks, base=-3 3 -3 2 sqrt mul 3 2 sqrt mul,showBase,action=draw
]%
\defFunction[algebraic]{ellipse}(t){DemiAxeFocal*cos(t)}{GrandAxe*sin(t)}{}
\psSolid[object=plan,definition=equation,
   args={[1 0 1 0] 90},base=-10 10 -10 10,action=none,name=monplan]%
\psProjection[object=courbeR2,plan=monplan,range=0 2 pi mul,resolution=360,
   linecolor=red,fillstyle=solid,opacity=0.5,linewidth=2\pslinewidth,function=ellipse
]%
\composeSolid
%\psPoint(0,DemiAxeFocal,0){F}\psdot(F)
%\psPoint(xMax neg,0,xMax){F2}\psdot[linecolor=red](F2)
\gridIIID[Zmin=-4,Zmax=4,linewidth=1\pslinewidth](-3,3)(-3,3)
\end{pspicture}
\end{codeblockA}







\newpage
% dessin 6 : coupe par un plan vertical x>a
\begin{center}
\input{\jobname-exa12}
\end{center}

\begin{codeblockA}[breakable, title=Example 8]
\begin{pspicture}(-8,-7)(8,7)
\psset{solidmemory,viewpoint=100 30 30 rtp2xyz,lightsrc=viewpoint,Decran=133}
\pstVerb{/Hauteur 6 def          /nEtages 36 def
         /Pas 1 nEtages div def  /nMeridiens 36 def
         /DemiAxeFocal 1 def % rayon de l'étranglement au milieu
         /RayonBases 3 def       /JaunePale {0.89 0.79 0.435 setrgbcolor} def}%
\psSolid[object=new,fillcolor=red!50,incolor=yellow,%hollow,
  action=draw*,sommets=
	0.5 Pas neg -0.5 Pas neg add{
	  /k exch def
	  0 1 nMeridiens 1 sub {
    	/i exch def
    	/r 4 k dup mul mul RayonBases dup mul DemiAxeFocal dup mul sub mul DemiAxeFocal dup mul add sqrt def
    	360 nMeridiens idiv i mul cos r mul
    	360 nMeridiens idiv i mul sin r mul
    	k Hauteur mul
	  } for
	} for,
  faces={
	%face du dessus
	[0 1 nMeridiens 1 sub {}for]
	% les faces latérales
	0 1 nEtages 1 sub {
	  /k1 exch def
	  k1 nMeridiens mul 1 add 1 k1 1 add nMeridiens mul 1 sub {
		/i exch def
		[i i 1 sub nMeridiens i add 1 sub nMeridiens i add]
	  } for
	  [k1 nMeridiens mul k1 1 add nMeridiens mul 1 sub k1 2 add nMeridiens mul 1 sub k1 1 add nMeridiens mul]
	} for
	% face de dessous
	%[nMeridiens nEtages 1 add mul 1 sub -1  nMeridiens nEtages mul {}for ]
	[nMeridiens nEtages mul 1 nMeridiens nEtages 1 add mul 1 sub {}for ]
  },plansepare={[1 0 0 -1.5]},name=coupeHyperboloidTest,action=none]
  %   file=hyperboloideVersion2,
  %   action=writesolid]
  %\psSolid[object=datfile,
  %         file=hyperboloideVersion2, fillcolor=red!50,incolor=yellow, linewidth=0.5\pslinewidth
  %         ]
\psSolid[object=load,incolor=yellow!50,fillcolor=ForestGreen!20, fcol=0 (JaunePale) 1 (JaunePale),% 1078 (JaunePale),
  linewidth=0.5\pslinewidth, % numfaces=all,
  intersectionplan={[1 0 0 -1.5]},intersectioncolor=(bleu),intersectionlinewidth=2,
  intersectiontype=0,load=coupeHyperboloidTest1,hollow=false]
\psSolid[object=plan,definition=equation,args={[1 0 0 -1.5] 90},linecolor=red,
   fillcolor=Aquamarine,planmarks,base=-3 3 -3 3,showBase,action=draw]
\gridIIID[Zmin=-3,Zmax=3](-3,3)(-3,3)
\end{pspicture}
\end{codeblockA}




\newpage
% dessin 7 : coupe par un plan incliné : bande

\begin{center}
\input{\jobname-exa13}
\end{center}

\begin{codeblockA}[breakable, title=Example 8]
\begin{pspicture}(-8,-7)(8,7)
\psset{solidmemory,viewpoint=100 60 20 rtp2xyz,lightsrc=viewpoint,Decran=100}
\pstVerb{/Hauteur 8 def           /nEtages 36 def
         /Pas 1 nEtages div def   /nMeridiens 36 def
         /DemiAxeFocal 1 def % rayon de l'étranglement au milieu
         /RayonBases 3 def
         /DemiAxeNonFocal Hauteur 2 div RayonBases dup mul DemiAxeFocal dup mul sub sqrt div DemiAxeFocal mul def
         /xMax DemiAxeNonFocal DemiAxeFocal mul DemiAxeNonFocal dup mul DemiAxeFocal dup mul sub sqrt div def
         /GrandAxe xMax 2 sqrt mul def   /ConeAsymptote DemiAxeFocal DemiAxeNonFocal div def
}%
\psSolid[object=grille,base=-3 3 -3 3,linewidth=0.5\pslinewidth,linecolor=red](0,0,Hauteur 2 div neg)%
\psSolid[object=new,fillcolor=red!50,incolor=yellow,%hollow,
  action=draw*,sommets=
    0.5 Pas neg -0.5 Pas neg add{
  	  /k exch def
	  0 1 nMeridiens 1 sub {
    	/i exch def
    	/r 4 k dup mul mul RayonBases dup mul DemiAxeFocal dup mul sub mul DemiAxeFocal dup mul add sqrt def
    	360 nMeridiens idiv i mul cos r mul
    	360 nMeridiens idiv i mul sin r mul
    	k Hauteur mul
	  } for
  } for, faces={
	0 1 nEtages 1 sub {
	  /k1 exch def
	  k1 nMeridiens mul 1 add 1 k1 1 add nMeridiens mul 1 sub {
		/i exch def
		[i i 1 sub nMeridiens i add 1 sub nMeridiens i add]
	  } for
	  [k1 nMeridiens mul k1 1 add nMeridiens mul 1 sub k1 2 add nMeridiens mul 1 sub k1 1 add nMeridiens mul]
	} for
	% faces du dessus et de dessous
	%[0 1 nMeridiens 1 sub {}for]
	%[nMeridiens nEtages 1 add mul 1 sub -1  nMeridiens nEtages mul {}for ]
  }, plansepare={[0 1 ConeAsymptote 0]},name=coupeHyperboloidTest,action=none]
\psSolid[object=load,incolor=yellow!50,fillcolor=ForestGreen!20, linewidth=0.5\pslinewidth,
  rm=0,% intersectionplan={[0 1 ConeAsymptote 0]}, intersectioncolor=(bleu),
  %         intersectionlinewidth=2,intersectiontype=0,
           load=coupeHyperboloidTest1,hollow=true](0,0,0)
\defFunction[algebraic]{ellipse}(t){DemiAxeFocal*cos(t)}{GrandAxe*sin(t)}{}
\psSolid[object=plan,definition=equation,args={[0 1 ConeAsymptote 0] 180},linecolor=red,
   fillcolor=Aquamarine,planmarks,base=-3 3 -4.9 4.9,showBase,action=draw]%
\psSolid[object=plan, definition=equation,args={[0 1 ConeAsymptote 0] 180},base=-5 5 -4.9 4.9,
   action=none,name=monplan]%
\psProjection[object=droite,plan=monplan,linewidth=3\pslinewidth,linecolor=red,args=1 5 1 -5]
\psProjection[object=droite,linewidth=3\pslinewidth,plan=monplan,linecolor=red,args=-1 5 -1 -5]
\composeSolid
%\psPoint(0,DemiAxeFocal,0){F}\psdot(F)
%\psPoint(xMax neg,0,xMax){F2}\psdot[linecolor=red](F2)
\gridIIID[Zmin=-4,Zmax=4,linewidth=1\pslinewidth](-3,3)(-3,3)
\end{pspicture}
\end{codeblockA}



\newpage
% dessin 8 : coupe par un plan incliné : parabole

\begin{center}
\input{\jobname-exa14}
\end{center}




\begin{codeblockA}[breakable, title=Example 9]
\begin{pspicture}(-8,-7)(8,7)
\psset{solidmemory}
\psset{viewpoint=100 60 20 rtp2xyz,lightsrc=viewpoint,Decran=100}
\pstVerb{
  /Hauteur 8 def  /nEtages 36 def  /Pas 1 nEtages div def  /nMeridiens 36 def
  /DemiAxeFocal 1 def % rayon de l'étranglement au milieu
  /RayonBases 3 def
  /DemiAxeNonFocal Hauteur 2 div RayonBases dup mul DemiAxeFocal dup mul sub sqrt div DemiAxeFocal mul def
  /xMax DemiAxeNonFocal DemiAxeFocal mul DemiAxeNonFocal dup mul DemiAxeFocal dup mul sub sqrt div def
  /GrandAxe xMax 2 sqrt mul def  /ConeAsymptote DemiAxeFocal DemiAxeNonFocal div def
}%
\psSolid[object=grille,base=-3 3 -3 3,linewidth=0.5\pslinewidth,linecolor=red](0,0,Hauteur 2 div neg)%
\psSolid[object=new,fillcolor=red!50,incolor=yellow,%hollow,
         action=draw*, sommets=
   0.5 Pas neg -0.5 Pas neg add{
   /k exch def
   0 1 nMeridiens 1 sub {
     /i exch def
     /r 4 k dup mul mul RayonBases dup mul DemiAxeFocal dup mul sub mul DemiAxeFocal dup mul add sqrt def
     360 nMeridiens idiv i mul cos r mul
     360 nMeridiens idiv i mul sin r mul
     k Hauteur mul
   } for
   } for,
  faces={
    0 1 nEtages 1 sub {
      /k1 exch def
      k1 nMeridiens mul 1 add 1 k1 1 add nMeridiens mul 1 sub {
        /i exch def
        [i i 1 sub nMeridiens i add 1 sub nMeridiens i add]
      } for
      [k1 nMeridiens mul k1 1 add nMeridiens mul 1 sub k1 2 add nMeridiens mul 1 sub k1 1 add nMeridiens mul]
    } for
   % faces du dessus et de dessous
   %[0 1 nMeridiens 1 sub {}for]
   %[nMeridiens nEtages 1 add mul 1 sub -1  nMeridiens nEtages mul {}for ]
  },
  plansepare={[0 1 ConeAsymptote -1]}, name=coupeHyperboloidTest, action=none]
\psSolid[object=load, incolor=yellow!50, fillcolor=ForestGreen!20, linewidth=0.5\pslinewidth,
         rm=0, load=coupeHyperboloidTest1,hollow=true](0,0,0)
\defFunction[algebraic]{parabole1}(t)
  {DemiAxeFocal*sqrt(1+(t/DemiAxeNonFocal)^2-((1-ConeAsymptote*t)/DemiAxeFocal)^2)}{1-ConeAsymptote*t}{t}
\defFunction[algebraic]{parabole2}(t)
  {-DemiAxeFocal*sqrt(1+(t/DemiAxeNonFocal)^2-((1-ConeAsymptote*t)/DemiAxeFocal)^2)}{1-ConeAsymptote*t}{t}
\psSolid[object=plan, definition=equation, args={[0 1 ConeAsymptote -1] 180},
   linecolor=red, fillcolor=Aquamarine, planmarks, base=-3 3 -4.9 4.9, showBase,action=draw
]%
\psSolid[object=courbe, r=0, range=0 4, linecolor=blue,linewidth=0.05, resolution=360, function=parabole1]%
\psSolid[object=courbe, r=0, range=0 4, linecolor=blue,linewidth=0.05, resolution=360, function=parabole2]%
%\psPoint(0,DemiAxeFocal,0){F}\psdot(F)
%\psPoint(xMax neg,0,xMax){F2}\psdot[linecolor=red](F2)
\gridIIID[Zmin=-4,Zmax=4,linewidth=1\pslinewidth](-3,3)(-3,3)
\end{pspicture}
\end{codeblockA}


\section{Sections of a Hyperboloid of One Sheet}
In this part the mesh of the hyperboloid is defined as a ruled surface. 
A dedicated macro is used to
draw the hyperboloid: \Lcs{psHyperboloid}\OptArg*{Options}\Largr{x,y,z}
The available options, along with their default values, are listed below:
\begin{description}
\item [\LKeyword{R=4}]: base radius;
\item [\LKeyword{h=8}]: height;
\item [\LKeyword{ngrid=36 20}]: defines the mesh—specifically, the number of lines and the number of circles;
\item [\LKeyword{base=0 360 0 1}]: specifies the range of rotation around the axis (from 0° to 360°) and the height variation (from k × 0.5H, where 0 < k < 1);
\item [\LKeyword{AngleTorsion=150}]: the angular offset between the endpoints of the generating line.
\end{description}

We consider the generating line $\overline{A_1A_2}$, defined by the 
cylinder's height $H$, its radius $R$, and the \Index{angular offset} $θ$ between its two
endpoints.

\begin{center}
\input{\jobname-exa15}
\end{center}

\begin{codeblockA}[breakable, title=The geometry of a hyperboloid]
\begin{pspicture}(-8,-6)(8,6)
\psset{solidmemory,viewpoint=50 40 30 rtp2xyz,lightsrc=viewpoint,Decran=50}
\psframe(-5,-6)(5,6)
\pstVerb{/decalage 60 def /H 6 def /Rayon 3 def}%
\psSolid[object=plan,definition=equation,args={[0 0 1 H neg 2 div]},action=none,name=planH]
\psset{plan=planH}
\psProjection[object=cercle,resolution=360,args=0 0 Rayon,linecolor=blue,range=0 360]
\psProjection[object=cercle,resolution=360,args=0 0 Rayon 2 div,linecolor=red,range=0 decalage]
\psSolid[object=plan,definition=equation,args={[0 0 1 H 2 div]},action=none,name=plan0]
\psset{plan=plan0}
\psProjection[object=cercle,resolution=360,args=0 0 Rayon,linecolor=blue,range=0 360]
\psProjection[object=texte,fontsize=20,linecolor=red,PSfont=Symbol,pos=cc,plan=planH,text=q,phi=120](2,1)%
\psPoint(Rayon,0,H 2 div neg){A1}\psdot(A1) \psPoint(Rayon,0,H 2 div){A'1}\psdot(A'1)
\psPoint(0,0,0){O}\psdot(O)
\psLineIIID[linestyle=dashed](Rayon,0,H 2 div)(Rayon neg,0,H 2 div)
\psPoint(0,0,H 2 div neg){O1}\psPoint(0,0,H 2 div){O2}
\psPoint(Rayon decalage cos mul,Rayon decalage sin mul,H 2 div){A2}
\psline[linecolor=red](A1)(A2)\psdots(O1)(O2)(A2)\psline(O2)(A2)
\psline[linestyle=dashed](A1)(A'1) \psline[linestyle=dashed](O1)(O2) \psline(O1)(A1)
\uput[d](A1){$A_1$} \uput[u](A2){$A_2$} \uput[ur](O2){$O_2$} \uput[ur](O1){$O_1$} \uput[ur](O){$O$}
\gridIIID[Zmin=-3,Zmax=3](-3,3)(-3,3)
\end{pspicture}
\end{codeblockA}

\clearpage

From this, we derive the parametric equations of the hyperboloid:

\[
\left\{
\begin{array}[m]{l}
x=R\big((1-k)\cos(t)+k\cos(t+\theta)\big)\\[1em]
y=R\big((1-k)\sin(t)+k\sin(t+\theta)\big)\\[1em]
z=(k-\frac{1}{2})H
\end{array}
\right.
\]

\begin{center}
\input{\jobname-exa16}
\end{center}

\begin{codeblockA}[breakable, title=Simple Hyperboloid]
\begin{pspicture}(-8,-7)(8,7)
\psset{solidmemory,viewpoint=500 20 30 rtp2xyz,lightsrc=viewpoint,Decran=500}
\psHyperboloid[hollow,incolor=yellow!50,fillcolor=ForestGreen!20]
\gridIIID[Zmin=-4,Zmax=4](-4,4)(-4,4)
\end{pspicture}
\end{codeblockA}

\newpage
\begin{center}
\input{\jobname-exa17}
\end{center}
\index{Triangle}
\begin{codeblockA}[breakable, title=Triangles]
\begin{pspicture}(-8,-7)(5,6)
\psframe(-8,-7)(5,6)
\psset{solidmemory,viewpoint=50 60 20 rtp2xyz,lightsrc=viewpoint,Decran=40}
\pstVerb{/X0 0.5 def}%
\psSolid[object=grille,base=-4 6 -4 4,ngrid=10 8,linewidth=0.5\pslinewidth,linecolor=red](0,0,-4)%
\psHyperboloid[hollow,R=4,incolor=yellow!50,fillcolor=ForestGreen!20,
  plansepare={[1 0 0 DemiAxeFocal neg]},name=coupeHyperboloidTest,action=none]
\psSolid[object=load,incolor=yellow!50,fillcolor=ForestGreen!20,linewidth=0.5\pslinewidth,
  rm=0,intersectionplan={[1 0 0 DemiAxeFocal neg]},intersectioncolor=(rouge),
  intersectionlinewidth=1,intersectiontype=0,load=coupeHyperboloidTest1]
\psSolid[object=load,incolor=yellow!50,fillcolor=ForestGreen!20,linewidth=0.5\pslinewidth,% rm=0 1 253,
   RotZ=-20,load=coupeHyperboloidTest0](2,0,0)
\psSolid[object=plan,definition=equation,
   args={[1 0 0 DemiAxeFocal neg] 90},linecolor=blue,%   fillcolor=Aquamarine,
   planmarks,base=-4 4 -4 4,showBase,action=draw]
\gridIIID[Zmin=-4,Zmax=4](-4,6)(-4,4)
\end{pspicture}
\end{codeblockA}



\newpage
\begin{center}
\input{\jobname-exa18}
\end{center}

\begin{codeblockA}[breakable, title=Parabolas]
\begin{pspicture}(-8,-7)(8,7)
\psset{solidmemory,viewpoint=50 20 20 rtp2xyz,lightsrc=viewpoint,Decran=40}
\pstVerb{/X0 1.5 def}%
\psSolid[object=grille,base=-4 4 -4 4,ngrid=8 8,linewidth=0.5\pslinewidth,linecolor=red](0,0,-4)%
\psHyperboloid[hollow,incolor=yellow!50,fillcolor=ForestGreen!20,plansepare={[1 0 0 X0 neg]},
  name=coupeHyperboloidTest,action=none]
\psSolid[object=load,incolor=yellow!50,fillcolor=ForestGreen!20,linewidth=0.5\pslinewidth,
  rm=0 1,load=coupeHyperboloidTest1]
\defFunction[algebraic]{hyperbol1}(t){X0}{t}{sqrt(((X0^2+t^2)/(DemiAxeFocal^2)-1))*DemiAxeNonFocal}
\defFunction[algebraic]{hyperbol2}(t){X0}{t}{-sqrt(((X0^2+t^2)/(DemiAxeFocal^2)-1))*DemiAxeNonFocal}
\psSolid[object=courbe,linewidth=2\pslinewidth,function=hyperbol1,range=Ymax neg Ymax,r=0,linecolor=red]%
\psSolid[object=courbe,linewidth=2\pslinewidth,function=hyperbol2,range=Ymax neg Ymax,r=0,linecolor=red]%
\psSolid[object=load,incolor=yellow!50,linewidth=0.5\pslinewidth,fillcolor=ForestGreen!20,
  rm=0 1 178 179,load=coupeHyperboloidTest0,RotZ=-100](5,-4,0)
\psSolid[object=plan,definition=equation,args={[1 0 0 -1.5] 90},linecolor=blue,planmarks,
  base=-4 4 -4 4,ngrid={},showBase,action=draw]
\gridIIID[Zmin=-4,Zmax=4](-4,4)(-4,4)
\end{pspicture}
\end{codeblockA}

\newpage
\begin{center}
\input{\jobname-exa19}
\end{center}

\begin{codeblockA}[breakable, title=Parallel Lines]
\begin{pspicture}(-5,-9)(11,6)
\psframe(-5,-9)(11,6)
\psset{solidmemory,viewpoint=50 50 20 rtp2xyz,lightsrc=viewpoint,Decran=40}
\pstVerb{/X0 1.5 def}%
\psSolid[object=grille,base=-4 4 -4 12,ngrid=8 20,linewidth=0.5\pslinewidth,linecolor=red](0,0,-4)%
\psHyperboloid[hollow,incolor=yellow!50,fillcolor=ForestGreen!20,plansepare={[0 1 ConeAsymptote 0]},
  name=coupeHyperboloidTest,action=none]
\psSolid[object=load,incolor=yellow!50,fillcolor=ForestGreen!20,linewidth=0.5\pslinewidth,
  rm=0 1,load=coupeHyperboloidTest1]
\psSolid[object=load,incolor=yellow!50,linewidth=0.5\pslinewidth,fillcolor=ForestGreen!20,% rm=0 1 178 179,
  load=coupeHyperboloidTest0](0,7,0)
\psSolid[object=plan,definition=equation,args={[0 1 ConeAsymptote 0] 180},linecolor=blue,
  planmarks,ngrid=,base=-4 4 -5.55 5.55,showBase,action=draw]
\psSolid[object=plan,definition=equation,args={[0 1 ConeAsymptote 0] 180},base=-5.5 5.5 -5.55 5.55,
   action=none,name=monplan]%
\psProjection[object=droite,plan=monplan,linewidth=1.5\pslinewidth,linecolor=red,args=1 5 1 -5]
\psProjection[object=droite,linewidth=1.5\pslinewidth,plan=monplan,linecolor=red,args=-1 5 -1 -5]
\composeSolid
\gridIIID[Zmin=-4,Zmax=4](-4,4)(-4,12)
\end{pspicture}
\end{codeblockA}


\newpage

\begin{center}
\input{\jobname-exa20}
\end{center}
\index{Hyperbole}
\begin{codeblockA}[breakable, title=The Hyperbole]
\begin{pspicture}(-8,-7)(5,6)
\psframe(-8,-7)(5,6)
\psset{solidmemory,viewpoint=50 60 20 rtp2xyz,lightsrc=viewpoint,Decran=40}
\pstVerb{/X0 0.5 def}%
\psSolid[object=grille,base=-4 8 -4 4,ngrid=12 8,linewidth=0.5\pslinewidth,linecolor=red](0,0,-4)%
\psHyperboloid[hollow,incolor=yellow!50,fillcolor=ForestGreen!20,plansepare={[1 0 0 X0 neg]},
   name=coupeHyperboloidTest,action=none]
\psSolid[object=load,incolor=yellow!50,fillcolor=ForestGreen!20,linewidth=0.5\pslinewidth,
   rm=0 1,load=coupeHyperboloidTest1]
\psSolid[object=load,incolor=yellow!50,fillcolor=ForestGreen!20, linewidth=0.5\pslinewidth,
   rm=0 1 333,load=coupeHyperboloidTest0](4,0,0)
\defFunction[algebraic]{hyperbol3}(t){X0}{t}{DemiAxeNonFocal*sqrt((t^2+X0^2)/(DemiAxeFocal^2)-1)}
\defFunction[algebraic]{hyperbol4}(t){X0}{t}{-DemiAxeNonFocal*sqrt((t^2+X0^2)/(DemiAxeFocal^2)-1)}
\psSolid[object=courbe,linewidth=2\pslinewidth,function=hyperbol3,range=Y0 neg -4,r=0,linecolor=red]%
\psSolid[object=courbe,linewidth=2\pslinewidth,function=hyperbol3,range=Y0 4,r=0,linecolor=red]%
\psSolid[object=courbe,linewidth=2\pslinewidth,function=hyperbol4,range=Y0 4,r=0,linecolor=red]%
\psSolid[object=courbe,linewidth=2\pslinewidth,function=hyperbol4,range=Y0 neg -4, r=0,linecolor=red]%
\psSolid[object=plan,definition=equation,args={[1 0 0 -0.5] 90},linecolor=blue,planmarks,
  ngrid=,base=-4 4 -4 4,showBase,action=draw]
\gridIIID[Zmin=-4,Zmax=4](-4,8)(-4,4)
\end{pspicture}
\end{codeblockA}

\newpage
\begin{center}
\input{\jobname-exa21}
\end{center}
\index{Ellipse}
\begin{codeblockA}[breakable, title=The Ellipse]
\begin{pspicture}(-8,-7)(5,6)
\psframe(-8,-7)(5,6)
\psset{solidmemory,viewpoint=50 60 20 rtp2xyz,lightsrc=viewpoint,Decran=40}
\pstVerb{/X0 0.5 def}%
\psSolid[object=grille,base=-3 8 -4 4,ngrid=11 8,linewidth=0.5\pslinewidth,linecolor=red](0,0,-4)%
\psHyperboloid[hollow,R=3,incolor=yellow!50,fillcolor=ForestGreen!20,
  plansepare={[1 0 1 0]},name=coupeHyperboloidTest,action=none]
\psSolid[object=load,incolor=yellow!50,fillcolor=ForestGreen!20,linewidth=0.5\pslinewidth,rm=0,
  % 1,
  load=coupeHyperboloidTest1]
\psSolid[object=load,incolor=yellow!50,fillcolor=ForestGreen!20,linewidth=0.5\pslinewidth,%rm=0 1,
  load=coupeHyperboloidTest0](5,0,0)
\defFunction[algebraic]{ellipse}(t){DemiAxeFocal*cos(t)}{GrandAxe*sin(t)}{}
\psSolid[object=plan,definition=equation,args={[1 0 1 0] 90},linecolor=red,planmarks,
   base=-4 4 -4 2 sqrt mul 3 2 sqrt mul,showBase,action=draw]%
\defFunction[algebraic]{ellipse}(t){DemiAxeFocal*cos(t)}{GrandAxe*sin(t)}{}
\psSolid[object=plan,definition=equation,args={[1 0 1 0] 90},base=-10 10 -10 10,action=none,
  name=monplan]%
\psProjection[object=courbeR2,plan=monplan,range=0 2 pi mul,resolution=360,linecolor=red,
  fillstyle=solid,opacity=0.5,linewidth=1.5\pslinewidth,function=ellipse]%
\composeSolid
\gridIIID[Zmin=-4,Zmax=4](-3,8)(-4,4)
\end{pspicture}
\end{codeblockA}



\newpage


\begin{center}
\input{\jobname-exa22}
\end{center}
\index{Parabel}
\begin{codeblockA}[breakable, title=The Parabola]
\begin{pspicture}(-5,-7)(10,6)
\psframe(-5,-7)(10,6)
\psset{solidmemory}
\psset{viewpoint=50 20 20 rtp2xyz,lightsrc=viewpoint,Decran=40}
\pstVerb{/X0 0.5 def}%
\psSolid[object=grille,base=-4 4 -4 8,ngrid=8 12,linewidth=0.5\pslinewidth,linecolor=red](0,0,-4)%
\psHyperboloid[hollow,R=4,incolor=yellow!50,fillcolor=ForestGreen!20,plansepare={[0 1 ConeAsymptote -1]},
   name=coupeHyperboloidTest,action=none]
\psSolid[object=load,incolor=yellow!50,fillcolor=ForestGreen!20,linewidth=0.5\pslinewidth,
   rm=0,load=coupeHyperboloidTest1]
\psSolid[object=load,incolor=yellow!50,fillcolor=ForestGreen!20,linewidth=0.5\pslinewidth,
   rm=236,load=coupeHyperboloidTest0](0,5,0)
\psSolid[object=plan,definition=equation,args={[0 1 ConeAsymptote -1] 180},linecolor=red,
   planmarks,base=-4 4 -5 5,showBase,action=draw]%
\defFunction[algebraic]{parabole1}(t){DemiAxeFocal*sqrt(1+(t/DemiAxeNonFocal)^2-((1-ConeAsymptote*t)/DemiAxeFocal)^2)}{1-ConeAsymptote*t}{t}
\defFunction[algebraic]{parabole2}(t){-DemiAxeFocal*sqrt(1+(t/DemiAxeNonFocal)^2-((1-ConeAsymptote*t)/DemiAxeFocal)^2)}{1-ConeAsymptote*t}{t}
\psSolid[object=courbe,r=0,range=0 4,linecolor=blue,linewidth=0.05,resolution=360,function=parabole1]%
\psSolid[object=courbe,r=0,range=0 4,linecolor=blue,linewidth=0.05,resolution=360,function=parabole2]%
\composeSolid
\gridIIID[Zmin=-4,Zmax=4](-4,4)(-4,8)
\end{pspicture}
\end{codeblockA}








\nocite{*}
\printbibliography

\printindex

\end{document}
