jeudi 26 février 2015

Dessiner le contour d’un objet avec pst-solides3d

Le dessin du contour d’un objet : cylindre, cône et sphère lorsque le maillage n’est pas représenté (option [grid] désactivée) nécessite quelques petits calculs supplémentaires, car le contour vu dépend de la position de l’observateur, c’est-à-dire des coordonnées de l’option [viewpoint]. Dans les 3 exemples, c’est l’angle qui est pris comme paramètre dans la variable postscript angleT, le point de vue est défini par la variable /pointVue, on pourra modifier la distance à l’origine et l’angle (premier et troisième paramètre de viewpoint).

\documentclass{article}
\usepackage[a4paper,margin=2cm]{geometry}
\usepackage[latin1]{inputenc}%
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{pst-solides3d}
\title{Dessiner le contour d'un objet avec pst-solides3d}
\date{26 février 2015}
\begin{document}
\maketitle
Le dessin du contour d'un objet : cylindre, cône et sphère lorsque le maillage n'est pas représenté (option \texttt{[grid]} désactivée) nécessite quelques petits calculs supplémentaires, car le contour vu dépend de la position de l'observateur, c'est-à-dire des coordonnées de l'option \texttt{[viewpoint]}. Dans les 3 exemples, c'est l'angle $\theta$ qui est pris comme paramètre dans la variable postscript \texttt{angleT}, le point de vue est défini par la variable \texttt{/pointVue}, on pourra modifier la distance à l'origine et l'angle $\phi$ (premier et troisième paramètre de \texttt{viewpoint}).
\begin{center}
\begin{pspicture}(-5,-3)(5,5)
\psframe(-5,-3)(5,5)
\pstVerb{/hauteur 5 def /rayon 2 def /angleT 50 def /pointVue {20 angleT 30 rtp2xyz} def
/jaunepale {0 0 0.25 0 setcmykcolor} def}%
\psset{viewpoint=pointVue,Decran=15,lightsrc=50 30 27 rtp2xyz,solidmemory}
\psSolid[object=grille,base=-4 4 -4 4]%
\psSolid[object=cylindre,
        h=hauteur,r=rayon,grid,
        hue=0 1,fcol=0 (jaunepale),
        ngrid=1 60](0,0,0)
\psSolid[object=plan,definition=normalpoint,args={0 0 hauteur [0 0 1]},
         action=none,
         base=-4 4 -4 4,
         name=monplanH]
\psset{plan=monplanH}
\psProjection[object=cercle,linewidth=0.05,
              args=0 0 rayon]
\psSolid[object=plan,definition=normalpoint,args={0 0 0 [0 0 1]},
         action=none,
         base=-4 4 -4 4,
         name=monplanB]
\psset{plan=monplanB}
\psProjection[object=cercle,linewidth=0.05,
              args=0 0 rayon,range=-90 angleT add 90 angleT add]
\psPoint(angleT sin rayon mul,angleT cos rayon mul neg,0){A}
\psPoint(angleT sin rayon mul,angleT cos rayon mul neg,hauteur){B}
\psline[linewidth=0.05](A)(B)
\psPoint(angleT sin rayon mul neg,angleT cos rayon mul,0){C}
\psPoint(angleT sin rayon mul neg,angleT cos rayon mul,hauteur){D}
\psline[linewidth=0.05](C)(D)
\end{pspicture}
\end{center}
\begin{center}
\begin{pspicture}(-5,-6)(5,3)
\psframe(-5,-6)(5,3)
\pstVerb{/rayon 2.5 def /angleT 50 def /pointVue {20 angleT 30 rtp2xyz} def}%
\psset{viewpoint=20 angleT 30 rtp2xyz,Decran=15,lightsrc=15 30 30 rtp2xyz,solidmemory}
\psSolid[object=plan,definition=normalpoint,args={0 0 rayon neg [0 0 1]},
         action=none,
         base=-4 4 -4 4,
         name=monplanH]
\psset{plan=monplanH}
\psProjection[object=cercle,linewidth=0.005,fillstyle=solid,fillcolor=gray!70,resolution=360,linecolor=gray!70,
              args=0 0 rayon]
\composeSolid
\psSolid[object=grille,base=-4 4 -4 4,linewidth=0.02,opacity=0.5](0,0,rayon neg)
\psSolid[object=sphere,
        r=rayon,grid,
        fillcolor=cyan!50,
        ngrid=36 72](0,0,0)
\psSolid[object=plan,definition=normalpoint,args={0 0 0 [pointVue]},
         action=none,
         base=-4 4 -4 4,
         name=monplanV]
\psset{plan=monplanV}
\psProjection[object=cercle,linewidth=0.05,
              args=0 0 rayon]
\end{pspicture}
\end{center}
\begin{center}
\begin{pspicture}(-5,-3)(5,5)
\psframe(-5,-3)(5,5)
\pstVerb{/hauteur 5 def /rayon 3 def /angleT 50 def /pointVue {20 angleT 30 rtp2xyz} def}%
\psset{viewpoint=pointVue,Decran=15,lightsrc=15 30 30 rtp2xyz,solidmemory}
\psSolid[object=grille,base=-4 4 -4 4,linewidth=0.02,opacity=0.5](0,0,0)
\psSolid[object=cone,
         h=hauteur,r=rayon,grid,
         hue=0 1 0.8 1,
        ngrid=1 72](0,0,0)
\psSolid[object=plan,definition=normalpoint,args={0 0 0 [0 0 1]},
         action=none,
         base=-4 4 -4 4,
         name=monplanB]
\psset{plan=monplanB}
\psProjection[object=cercle,linewidth=0.05,
              args=0 0 rayon,range=-90 angleT add 90 angleT add]
\psPoint(angleT sin rayon mul,angleT cos rayon mul neg,0){A}
\psPoint(0,0,hauteur){H}
\psPoint(angleT sin rayon mul neg,angleT cos rayon mul,0){B}
\psline[linewidth=0.05](B)(H)(A)
\end{pspicture}
\end{center}
\end{document}

Dans l'exemple de la sphère, si on inverse les couleurs (avec The Gimp), on obtient une image avec un relief intéressant :



mardi 17 février 2015

Une étude graphique de la tour Eiffel par Carlo Alberini

Une étude graphique de la tour Eiffel par Carlo Alberini dont les schémas ont été réalisés avec les packages pst-3dplot et pst-solides3d.
Voici les dessins de cette étude :
Profili di pilastro a minimo dispendio di materiale. Le variazioni di profilo sono calcolate nel piano xz, a sinistra, e nel piano yz, a destra.
Linee di intersezione tra i profili dei pilastri a minimo dispendio di materiale calcolati in precedenza, a sinistra, e raffigurazione di una delle quattro superfici risultanti, a destra. L’intersezione tra i profili dei due pilastri a minimo dispendio di materiale `e avvenuta lungo direzioni mutuamente perpendicolari.

 Rappresentazione schematica della Tour Eiffel.

Les fichiers :
 http://manuel.luque.perso.neuf.fr/Carlo-Alberini/Eiffel-grafico.pdf
http://manuel.luque.perso.neuf.fr/Carlo-Alberini/Eiffel-grafico.tex


dimanche 15 février 2015

Une autre image d'un tore

La revue Quadrature n°92 représente en couverture un tore faisant apparaître deux familles de cercles de Villarceau :
http://www.quadrature.info/index.php?page=zoom&photo=numero92.jpg

l'image a été réalisée par Boris Asancheyev.
C'est cette image que j'ai essayé de calculer et de reproduire avec PSTricks (révision 16/02/2015)




\documentclass{article}
\usepackage{pst-solides3d}
% Manuel Luque : 16 février 2015
% manuel.luque27@gmail.com
% gswin64c -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -o pst-rubansV-essais-2.pdf pst-rubansV-essais-2.ps
% or even:
% gswin64c -sDEVICE=pdfwrite -o pst-rubansV-essais-2.pdf - < pst-rubansV-essais-2.ps
\begin{document}
\begin{center}
\begin{pspicture}(-5,-5)(5,5)
\psframe*(-5,-5)(5,5)
% \psframe[fillstyle=hlines,hatchangle=0](-5,-5)(5,5)
\psset{viewpoint=100 0 40 rtp2xyz,Decran=100}
\pstVerb{
/nu 72 def /nv 36 def %
/vmax 360 def
/vmin 0 def
/umax 360 def
/umin 0 def
         /Ri1 3 def /ri1 1.5 def
/CalcCoordinates{%2 dict begin
 %        /v exch def /u exch def
         Ri1 ri1 v cos mul add u cos mul % x
         Ri1 ri1 v cos mul add u sin mul % y
         ri1 v sin mul % z
%         end
         } def
/du umax umin sub nu div def
/dv vmax vmin sub nv div def
/sommets0 [
       vmin dv vmax  {% méridien après méridien
        /v exch def
% les sommets le long d'un méridien
  /u umin def
    nu 1 add {
        [CalcCoordinates]
  /u u du add def
     }repeat
       }for
       ] def
%
/faces0 { % avant l'ajout du centre
   0 1 nv 0 sub {
   /k1 exch def
k1 nu 1 add mul 1 nu k1 1 add mul k1 add 1 sub {/i exch def
    [
     i 1 add
     i
     i nu add 1 add
     i nu add 2 add
    ]
    } for
    } for}
    def
%
/Sommets % après l'ajout du centre
[
   0 1 nv 1 sub {
   /k1 exch def
k1 nu 1 add mul 1 nu k1 1 add mul k1 add 1 sub {/i exch def
    [/pointsSommets [
     sommets0 i 1 add get aload pop
     sommets0 i get aload pop
     sommets0 i nu add 1 add get aload pop
     sommets0 i nu add 2 add get aload pop
    ] def
    pointsSommets aload pop pointsSommets isobarycentre3d]
    } for
    } for]
    def
%
/SOMMETS {
0 1 Sommets length 1 sub {/iL exch def
 Sommets iL get aload pop
 } for
 } def
%
/FACES {
 0 5 [SOMMETS] length 3 idiv 5 sub {/iF exch def
 [iF iF 4 add iF 1 add]
 [iF 1 add iF 4 add iF 2 add ]
 [iF 2 add iF 4 add iF 3 add ]
 [iF iF 3 add iF 4 add ]
 } for
 } def
}%
\psSolid[object=new,sommets=SOMMETS,faces=FACES,fillcolor=yellow,grid,
% une bande
%         fcol=0 4 nu mul dup nv 1 sub mul  {/i exch def i (bleu) i 2 add (bleu)}for
% toutes les bandes paires
fcol=0 4 nu 4 mul 4 sub {/j1 exch def j1 4 nu mul dup nv 1 sub mul j1 add {/i1 exch def i1 (bleu) i1 2 add (bleu)}for} for
         ]
\end{pspicture}
\end{center}
\end{document}

vendredi 13 février 2015

Tore découpé en rubans de Villarceau - version 3

Un tore découpé en rubans de Villarceau (suite du message précédent) :

 http://pstricks.blogspot.fr/2015/02/tore-decoupe-en-rubans-de-villarceau.html

 sous forme de package (révision de la documentation 14/02/2015):

http://manuel.luque.perso.neuf.fr/pst-rubansV/


Complément à la documentation 15/02/2015 :
Donuts avec comme décoration des demi-rubans de Villarceau

jeudi 12 février 2015

Tore découpé en rubans de Villarceau - version 2

C'est la suite du message :

http://pstricks.blogspot.fr/2015/02/tore-decoupe-en-cercles-de-villarceau.html

Une commande \psRubansV[options](x,y,z) permet de tracer plus simplement et plus rapidement les cercles(rubans) de Villarceau. Sur le document, tous les exemples du message précédent n'ont pas été repris, seuls les exemples suivants ont été rajoutés :




Les fichiers :
http://manuel.luque.perso.neuf.fr/tore-Villarceau/tore-cercles-villarceau-v2.pdf
http://manuel.luque.perso.neuf.fr/tore-Villarceau/tore-cercles-villarceau-v2.tex

Le listing :

\documentclass{article}
\usepackage[latin1]{inputenc}%
\usepackage[T1]{fontenc}
%\usepackage[garamond]{mathdesign}
%\renewcommand{\ttdefault}{lmtt}
\usepackage[a4paper,margin=2cm]{geometry}
\usepackage{pst-solides3d}
\usepackage{url}
% Manuel Luque
% manuel.luque27@gmail.com
\makeatletter
\pst@addfams{pst-rubansV}
\define@key[psset]{pst-rubansV}{ngrid}{\def\pst@rubansV@ngrid{#1 }}%
\define@key[psset]{pst-rubansV}{base}{\def\pst@rubansV@base{#1 }}%
\define@key[psset]{pst-rubansV}{r1}{\def\pst@rubansV@rM{#1 }}%
\define@key[psset]{pst-rubansV}{r0}{\def\pst@rubansV@rm{#1 }}%
\define@key[psset]{pst-rubansV}{interval}{\def\pst@rubansV@interval{#1 }}%
\define@key[psset]{pst-rubansV}{circle}{\def\pst@rubansV@circle{#1 }}%
%
\psset[pst-rubansV]{ngrid=72 60,base=0 360 0 360,r1=3.5,r0=1.5,interval=1,circle=1}%
\psset{hollow=true}
%
\def\psRubansV{\pst@object{psRubansV}}
% usage : \psRubansV[options](x,y,z) %
\def\psRubansV@i{\@ifnextchar({\psRubansV@ii}{\psRubansV@ii(0,0,0)}}
\def\psRubansV@ii(#1,#2,#3){%
  \pst@killglue%
  \begingroup%
  \use@par%
\addto@pscode{
/interval \pst@rubansV@interval 1 add def
/typeCircle \pst@rubansV@circle def
typeCircle 1 eq {
/CalcCoordinates{2 dict begin
         /v exch def
         /u exch def
         RayonMajeur dup mul rayonmineur dup mul sub sqrt u sin mul v cos mul rayonmineur RayonMajeur u cos mul add v sin mul sub % x
         RayonMajeur dup mul rayonmineur dup mul sub sqrt u sin mul v sin mul rayonmineur RayonMajeur u cos mul add v cos mul add neg % y
         rayonmineur u sin mul % z
         end
         } def
         }{
/CalcCoordinates{2 dict begin
         /v exch def
         /u exch def
         RayonMajeur dup mul rayonmineur dup mul sub sqrt u sin mul v cos mul rayonmineur RayonMajeur u cos mul add v sin mul sub % x
         RayonMajeur dup mul rayonmineur dup mul sub sqrt u sin mul v sin mul rayonmineur RayonMajeur u cos mul add v cos mul add % y
         rayonmineur u sin mul % z
         end
         } def
         } ifelse
\pst@rubansV@ngrid
         /n2 exch def
         /n1 exch def
         /RayonMajeur \pst@rubansV@rM def
         /rayonmineur \pst@rubansV@rm def
\pst@rubansV@base
          /vmax exch def
          /vmin exch def
          /umax exch def
          /umin exch def
typeCircle 1 eq {/vmax vmax neg def} if
         /dx umax umin sub n1 div def % pas sur le cercle
         /dy vmax vmin sub n2 div def % pas entre 2 cercles
/SOMMETS {
       0 1 n1 {
           /i exch def
           0 1 n2 {
               /j exch def
               xmin i dx mul add
               ymin j dy mul add
        CalcCoordinates
           } for
       } for
   }
   def
%
   /FACES {
       0 1 n1 1 sub {
          /i exch def
          0 interval n2 interval sub {
             /j exch def
             [
                j 1 add        i n2 1 add mul add
                j n2 2 add add i n2 1 add mul add
                j n2 1 add add i n2 1 add mul add
                j              i n2 1 add mul add
            ]
          } for
       } for
   } def
  }% fin du code ps
\psSolid[object=new,sommets=SOMMETS,faces=FACES]
  \endgroup%
  \ignorespaces%
}%
\makeatother
\title{Tore découpé en rubans de Villarceau - version 2}
\date{12 février 2015}
\begin{document}
\maketitle
Il existe sur les cercles de Villarceau d'excellentes études, comme celle de Lionel Garnier :

\centerline{\url{http://le2i.cnrs.fr/IMG/publications/2141_refig_EqCercleVillarceauCD4.pdf}}

et celle de Marcel Berger :

\centerline{\url{https://www.bibnum.education.fr/sites/default/files/villarceau-analyse.pdf}}

Ce sont ces équation paramétriques qui sont utilisées pour la représentation des 2 types de cercles de Villarceau (voir le document de Lionel Garnier) :
\[
\left\{
\begin{array}[m]{l}
x=\sqrt{R^2-r^2}\sin(t)\cos\theta-\big(R+r\cos(t)\big)\sin\theta\\[1em]
y=\pm\Big(\sqrt{R^2-r^2}\sin(t)\sin\theta+\big(R+r\cos(t)\big)\cos\theta\Big)\\[1em]
z=R\sin(t)
\end{array}
\right.
\]
%
La commande dédiée à la représentation des cercles sur le tore, ou plutôt des rubans, car c'est l'intervalle entre 2 cercles voisins qui est colorié, s'écrit : \verb+\psRubansV[options](x,y,z)+. Les options sont les suivantes, ce sont les valeurs par défaut qui sont indiquées :
\begin{enumerate}
  \item \texttt{r1=3.5} : rayon moyen du tore ;
  \item \texttt{r0=1.5} : rayon intérieur ;
  \item \texttt{ngrid=72 60} : nombre de points sur un cercle et nombre de cercles de Villarceau ;
  \item \texttt{base=0 360 0 360} : en degrés pour faire le tour des cercles et du tore ;
  \item \texttt{interval=1} : intervalles entre 2 rubans de Villarceau, si \texttt{interval=0} tous les rubans sont dessinés, si \texttt{interval=1} on saute un ruban sur deux, etc.
  \item \texttt{circle=1} : dessine un cercle de Villarceau et \texttt{circle=2} dessine son symétrique.
\end{enumerate}
\begin{center}
\psset{unit=0.7}
\begin{pspicture}(-6,-5.5)(6,5)
\psframe(-6,-5.5)(6,5)
\psset[pst-solides3d]{viewpoint=20 20 40 rtp2xyz,Decran=20,lightsrc=viewpoint}
\psRubansV[grid,fillcolor=red,incolor=gray]
\rput(0,-5){$\backslash${}\texttt{psRubansV[grid,fillcolor=red,incolor=gray]}}
\end{pspicture}
\begin{pspicture}(-6,-5.5)(6,5)
\psframe(-6,-5.5)(6,5)
\psset[pst-solides3d]{viewpoint=20 20 40 rtp2xyz,Decran=20,lightsrc=viewpoint}
\psRubansV[grid,fillcolor=red,incolor=gray,circle=2]
\rput(0,-5){$\backslash${}\texttt{psRubansV[grid,fillcolor=red,circle=2]}}
\end{pspicture}
\end{center}
\begin{center}
\psset{unit=0.75}
\begin{pspicture}(-6,-5)(6,5)
\psframe(-6,-5)(6,5)
\psset[pst-solides3d]{viewpoint=20 20 90 rtp2xyz,Decran=20,lightsrc=viewpoint}
\psRubansV[grid,fillcolor=red,incolor=gray,ngrid=144 36,base=0 360 0 360,interval=3]
\end{pspicture}

\begin{pspicture}(-6,-5)(6,5)
\psframe(-6,-5)(6,5)
\psset[pst-solides3d]{viewpoint=20 0 0 rtp2xyz,Decran=20,lightsrc=viewpoint}
\psRubansV[grid,fillcolor=red,incolor=yellow!50,ngrid=144 72,base=0 360 0 360,interval=3]
\end{pspicture}
\end{center}

\begin{center}
\psset{unit=0.7}
\begin{pspicture}(-6,-6)(6,5)
\psframe(-6,-6)(6,5)
\psset[pst-solides3d]{viewpoint=15 0 60 rtp2xyz,Decran=15,lightsrc=5 -30 90 rtp2xyz}
\psRubansV[grid,fillcolor=white,incolor=gray,linewidth=0.0001,
          interval=2,ngrid=72 72,
          fcol=0 1 n2  1 sub{/iC exch def
                  iC n2  n1 n2 mul  iC add 1 sub {dup 2 mod 0 eq{(blue)}{(red)}ifelse}for}for]
\end{pspicture}
\end{center}

\begin{center}
\psset{unit=0.7}
\begin{pspicture}(-6,-5)(6,5)
\psframe*[linecolor=cyan!20](-6,-5)(6,5)
\psset[pst-solides3d]{viewpoint=20 20 40 rtp2xyz,Decran=20,lightsrc=viewpoint}
\psRubansV[grid,fillcolor=white,incolor=gray,linewidth=0.0001,
          interval=0,ngrid=60 36,hollow=false,
          fcol=0 3 n2 3 sub{/iC exch def
                   iC n2 n1 n2 mul iC add 1 sub {/I exch def I(blue) I 1 add (white) I 2 add (red)}for}for]
\end{pspicture}
\begin{pspicture}(-6,-5)(6,5)
\psframe*[linecolor=cyan!20](-6,-5)(6,5)
\psset[pst-solides3d]{viewpoint=20 20 40 rtp2xyz,Decran=20,lightsrc=viewpoint}
\psRubansV[grid,fillcolor=white,incolor=gray,linewidth=0.0001,
          interval=0,ngrid=72 36,hollow=false,
          fcol=0 3 n2 3 sub{/iC exch def
                   iC n2 n1 n2 mul iC add 1 sub {/I exch def I(black) I 1 add (red) I 2 add (yellow)}for}for]
\end{pspicture}
\end{center}
\begin{center}
\psset{unit=0.7}
\begin{pspicture}(-6,-5)(6,5)
\psframe*[linecolor=cyan!20](-6,-5)(6,5)
\psset[pst-solides3d]{viewpoint=20 20 40 rtp2xyz,Decran=20,lightsrc=viewpoint}
\psRubansV[grid,fillcolor=white,incolor=gray,linewidth=0.0001,
          interval=0,ngrid=72 36,hollow=false,
          fcol=0 3 n2 3 sub{/iC exch def
                   iC n2 n1 n2 mul iC add 1 sub {/I exch def I(green) I 1 add (white) I 2 add (red)}for}for]
\end{pspicture}
\end{center}
\end{document}

lundi 9 février 2015

Donuts avec des décorations en forme de demi-cercles de Villarceau

C'est la suite des donuts aux décorations à motifs géométriques :

http://pstricks.blogspot.fr/2015/01/donuts-geometriques-avec-pst-solides3d.html

\documentclass{article}
\usepackage{pst-solides3d}
% Manuel Luque
% manuel.luque27@gmail.com
\definecolor{chocolat}{rgb}{0.353 0.227 0.133}
\title{Donuts-Villarceau}
\date{8 février 2015}
\begin{document}
\maketitle
\begin{center}
\psset{unit=0.75}
% Cercles de Villarceau dans un sens
\begin{pspicture}(-6,-6)(6,6)
\psframe(-6,-6)(6,6)
\psset[pst-solides3d]{viewpoint=20 0 40 rtp2xyz,Decran=20,lightsrc=viewpoint}
\psset{solidmemory}
\codejps{
/chocolat {0.353 0.227 0.133 setrgbcolor} def
/n1 108 def /n2 72 def /n1n2 n1 n2 mul def
/RayonMajeur 3 def /rayonmineur 1.5 def
/TOREVILLARCEAU{
/biface false def
0 360 0 360 [n1 n2]
{/y exch def
 /x exch def pop pop
         RayonMajeur dup mul rayonmineur dup mul sub sqrt x sin mul y sin mul rayonmineur RayonMajeur x cos mul add y cos mul add % x
         RayonMajeur dup mul rayonmineur dup mul sub sqrt x sin mul y cos mul rayonmineur RayonMajeur x cos mul add y sin mul sub % y
         rayonmineur x sin mul % z
          }
  false % true
  newsurfaceparametree
  } def
/SOMMETS {TOREVILLARCEAU solidgetsommets aload pop} def
/faces1 {TOREVILLARCEAU solidgetfaces} def
 }%
\psSolid[object=new,sommets=SOMMETS,faces=faces1 aload pop,
         fillcolor=chocolat,incolor=gray!50,grid,
         linewidth=0.0001,
         fcol= 0 2 n1n2 2 div cvi 2 sub{/Rang exch def
        Rang (Red) Rang 1 add (Yellow)}for
]
\end{pspicture}
\end{center}
\end{document}

dimanche 8 février 2015

Cercles de Villarceau sur un tore - suite 2

\documentclass{article}
\usepackage[latin1]{inputenc}%
\usepackage[T1]{fontenc}
\usepackage[a4paper,margin=2cm]{geometry}
\usepackage{pst-solides3d}
% Manuel Luque
% manuel.luque27@gmail.com
\definecolor{chocolat}{rgb}{0.353 0.227 0.133}
\title{Cercles de Villarceau sur un tore -3}
\date{8 février 2015}
\begin{document}
\maketitle
\begin{center}
\psset{unit=0.75}
% Cercles de Villarceau dans un sens
\begin{pspicture}(-6,-6)(6,6)
%\psframe*[linecolor=black](-6,-6)(6,6)
\psframe(-6,-6)(6,6)
\psset[pst-solides3d]{viewpoint=20 0 40 rtp2xyz,Decran=20,lightsrc=100 0 10 rtp2xyz}
\psset{solidmemory}
\codejps{
/chocolat {0.353 0.227 0.133 setrgbcolor} def
/n1 72 def /n2 72 def /n1n2 n1 n2 mul def
/RayonMajeur 3 def /rayonmineur 1.5 def
/TOREVILLARCEAU{
/biface false def
0 360 0 360 [n1 n2]
{/y exch def
 /x exch def pop pop
         RayonMajeur dup mul rayonmineur dup mul sub sqrt x sin mul y sin mul rayonmineur RayonMajeur x cos mul add y cos mul add % x
         RayonMajeur dup mul rayonmineur dup mul sub sqrt x sin mul y cos mul rayonmineur RayonMajeur x cos mul add y sin mul sub % y
         rayonmineur x sin mul % z
          }
  false % true
  newsurfaceparametree
  } def
/SOMMETS {TOREVILLARCEAU solidgetsommets aload pop} def
/faces1 {TOREVILLARCEAU solidgetfaces} def
 }%
\psSolid[object=new,sommets=SOMMETS,faces=faces1 aload pop,
         fillcolor=chocolat,incolor=gray!50,grid,
         linewidth=0.0001,
         fcol= 0 2 n1n2 2 div cvi 2 sub{/Rang exch def
        Rang (Red) Rang 1 add (Yellow)}for
]
\end{pspicture}

% Cercles de Villarceau dans l'autre sens

\begin{pspicture}(-6,-6)(6,6)
\psframe(-6,-6)(6,6)
\psset[pst-solides3d]{viewpoint=20 0 40 rtp2xyz,Decran=20,lightsrc=viewpoint}
\psset{solidmemory}
\codejps{
/n1 72 def /n2 72 def /n1n2 n1 n2 mul def
/RayonMajeur 3 def /rayonmineur 1.5 def
/TOREVILLARCEAU{
/biface false def
360 0 0 360 [n1 n2]
{/y exch def
 /x exch def pop pop  
         RayonMajeur dup mul rayonmineur dup mul sub sqrt x sin mul y sin mul rayonmineur RayonMajeur x cos mul add y cos mul add % x
         RayonMajeur dup mul rayonmineur dup mul sub sqrt x sin mul y cos mul rayonmineur RayonMajeur x cos mul add y sin mul sub neg % y
         rayonmineur x sin mul % z
          }
  false % true
  newsurfaceparametree
  } def
/SOMMETS {TOREVILLARCEAU solidgetsommets aload pop} def
/faces1 {TOREVILLARCEAU solidgetfaces} def
 }%
\psSolid[object=new,sommets=SOMMETS,faces=faces1 aload pop,
         fillcolor=cyan,incolor=gray!50,grid,
         linewidth=0.0001,
         fcol= 0 2 n1n2 2 sub{/Rang exch def
        Rang (Red) Rang 1 add (Yellow)}for
]
\end{pspicture}
\end{center}
\end{document}