dimanche 7 août 2011

Sections coniques avec des cônes lissés

 Dans les exemples précédents, on peut voir que les bi-cônes sont constitués de facettes polygonales. On peut adoucir cette représentation en augmentant le nombre de facettes avec le paramètre ngrid. Mais on peut aussi dessiner ces facettes en suivant les contours du cône (génératrices et cercles), ce qui rend leur dessin plus agréable.
1 - Méthode 1 : utilisation du package pst-solrev.
pst-solrev est une adaptation de pst-solides3d qui calcule des points intermédiaires sur les côtés des facettes pour coïncider un peu mieux avec une ligne suivie  sur la surface à représenter (à définir paramétriquement).  Une brêve documentation est incluse dans l'archive :
Ce package(qui n'est pas finalisé).

\documentclass[12pt]{article}
\usepackage[dvipsnames,svgnames,x11names]{xcolor}
\usepackage{pst-solrev}
\begin{document}
\begin{center}
\begin{pspicture}(-4,-4)(4,5)
\psset{lightsrc=50 30 25 rtp2xyz}
\psset{viewpoint=50 30 20 rtp2xyz,Decran=50}
\psSolid[object=grille,base=-3 3 -3 3,linewidth=0.5\pslinewidth](0,0,-3)
\pstVerb{/THETA 45 def % demi-angle au sommet
         /tanTHETA THETA dup sin exch cos div def}%
\psset{solidmemory}
%\defEquations{bicone}%
%             {v u cos mul}%
%             {v u sin mul}%
%             {v tanTHETA div}%
%\pstsolidrev[base=0 360 -3 3,
%             ajustv,
%             linecolor={[cmyk]{1,0,1,0.5}},
%             fillcolor=yellow!50,incolor=green!50,
%             plansepare={[1 0 0 -1]},
%             name=partcone2nappes,
%             action=none,ngrid=18 10]%
%\psSolid[object=load,
%   load=partcone2nappes1,
%% enregistre les caractéristiques du solide
%   file=hyperbole2nappes,
%   action=writesolid
%   ]%
\psSolid[object=datfile,
         file=hyperbole2nappes,
         hollow,rm=0 1 2,
         incolor=yellow!50,
         fillcolor=ForestGreen!20,
         linewidth=0.5\pslinewidth
         ]
\defFunction[algebraic]{hyperbol1}(t){1}{t}{sqrt(t^2+1)}
\defFunction[algebraic]{hyperbol2}(t){1}{t}{-sqrt(t^2+1)}
\psSolid[object=courbe,
   function=hyperbol1,range=8 sqrt neg 8 sqrt,
   r=0,linecolor=red]%
\psSolid[object=courbe,
   function=hyperbol2,range=8 sqrt neg 8 sqrt,
   r=0,linecolor=red]%
\psSolid[object=plan,action=draw,linecolor=blue,
    definition=equation,
    args={[1 0 0 -1] 90},
    base=-3 3 -3 3,planmarks,showBase](1,0,0)
\gridIIID[Zmin=-3,Zmax=3,spotX=r,showAxes](-3,3)(-3,3)
\end{pspicture}
\end{center}
\end{document} 
La première étape : toutes les lignes qui sont commentées, consiste à définir les équations paramétriques du cône, à couper le bi-cône par le plan choisi et à enregistrer la partie qui nous intéresse. C'est l'étape la plus longue (on peut aller boire un café, faire la vaisselle, promener avec son chien etc. pendant ce temps).
Vous devez donc décommenter ces lignes si vous souhaitez créer votre propre section.
Les données étant enregistrées, on commente à nouveau ces lignes et la suite est très rapide : on peut se consacrer à la mise-en-page et aux ajouts d'annotations.

Tous les fichiers de cette partie sont ici dans le sous-dossier( pst-solrev) :

2 - Méthode 2 : écrire quelques lignes de postscript pour définir le bi-cône lissé et l'écriture sur le disque des données : part-cone2nappes.ps

%%%%%%%%%%%% cône à deux nappes %%%%%%%%%%%%%%%%
    /nE 10 def % nb d’etages
    /nM 18 def %  nb de meridiens
    /resolution 5 def
    /ZMAX 8 def % hauteur du cône
    /Radius 3 def % rayon de la base
    /tanTheta Radius ZMAX 2 div def
    /dZ ZMAX nE div def
    /d2Z dZ resolution div def
    /Depart 0 def
    /Fin 360 def
    /dA Fin Depart sub nM div def
    /d2A dA resolution div def
    /sommets [   
    ZMAX 2 div neg dZ ZMAX 2 div dZ sub {% sommets étage après étage
     /zP exch def % z= h/a*k
     /radius1 zP abs tanTheta mul def
     [
      Depart dA Fin dA sub  { % le tour d'un cercle
      /iM exch def
      [ % une facette
      iM d2A iM dA add { % les points intermediaires sur un côté du cercle
        /Ai exch def
        [
         Ai cos radius1 mul
         Ai sin radius1 mul
         zP
         ]
        } for
      zP d2Z zP dZ add {/Zi exch def % les pts intermédiaires sur un côté du méridien
        /radius2  Zi abs tanTheta mul def
        [
         Ai cos radius2 mul
         Ai sin radius2 mul
         Zi
         ]
       } for
     /radius3 zP dZ add abs tanTheta mul def
     iM dA add d2A neg iM {/Ai exch def % les points intermediaires sur un côté du cercle supérieur
        [
         Ai cos radius3 mul
         Ai sin radius3 mul
         zP dZ add
         ]
        } for
      zP dZ add d2Z neg zP  {/Zi exch def % les pts intermédiaires sur le côté du méridien en descendant
        /radius4 Zi abs tanTheta mul def
        [
         iM cos radius4 mul
         iM sin radius4 mul
         Zi
         ]
       } for
       ]
       } for
       ]
       } for
       [
      [
       Fin d2A neg Depart d2A sub  { % le tour d'un cercle
      /iM exch def
      % une facette
        [
         iM cos Radius mul
         iM sin Radius mul
         ZMAX 2 div neg
         ]      
        } for
        ]
        ]
        [
     [
     Depart d2A Fin d2A sub  { % le tour d'un cercle
      /iM exch def
         % une facette
        [
         iM cos Radius mul
         iM sin Radius mul
         ZMAX 2 div
         ]
        } for
      ]
      ]
     ] def
%%%%%%%%%%%%%% le comptage %%%%%%%%%%%%%%%%%%%%%%%%%
    /Nbre 0 def
     /NbreEtages sommets length def % nombre d'étages
     /Faces [
     0 1 NbreEtages 1 sub {/i exch def
             /NbreFaces sommets i get length def
                /etage sommets i get def
                /NbreFacettes etage length def
        0 1 NbreFacettes 1 sub {/j exch def
                  /facette etage j get def
              /nombreSommetsFacette facette length def
          [
          0 1 nombreSommetsFacette 1 sub {/k exch def
              k Nbre add
                          } for
%                    nombreSommetsFacette -1 roll   
          ]
         /Nbre nombreSommetsFacette Nbre add def
                          } for
                          } for                             
            ] def           
    /tableau_des_sommets [
               0 1 NbreEtages 1 sub {/i exch def
                   /etage sommets i get def
                    /NbreFacettes etage length def
                 0 1 NbreFacettes 1 sub {/j exch def
                 /Facette etage j get def
                  0 1 Facette length 1 sub { /k exch def
                     Facette k get aload pop
                                           } for                    
                                        } for
                                        }for
                            ] def
/chaine 15 string def
(cone2nappes-sommets.dat) (w) file /lefichiersommets exch def
(cone2nappes-faces.dat)   (w) file /lefichierfaces exch def
   0 3 tableau_des_sommets length 3 sub {
      /i exch def
      /x tableau_des_sommets i get def
      /y tableau_des_sommets i 1 add get def
      /z tableau_des_sommets i 2 add get def
      lefichiersommets x chaine cvs writestring
      lefichiersommets 32 write %% espace
      lefichiersommets y chaine cvs writestring
      lefichiersommets 32 write %% espace
      lefichiersommets z chaine cvs writestring
      lefichiersommets 10 write %% CR
   } for
   lefichiersommets closefile

   0 1 Faces length 1 sub {
      /i exch def
      /Fi Faces i get def
      lefichierfaces 91 write %% [
      0 1 Fi length 1 sub {
         /j exch def
         lefichierfaces Fi j get chaine cvs writestring
         lefichierfaces 32 write %% espace
      } for
      lefichierfaces 93 write %% ]
      lefichierfaces 10 write %% CR
   } for
   lefichierfaces closefile

Ensuite effectuer la section du bi-cône par le plan : cone2nappes-write.tex

\documentclass{article}
\usepackage{pst-solides3d}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\begin{document}
\begin{center}
\psset{viewpoint=50 50 15 rtp2xyz,Decran=50}
\begin{pspicture}(-6,-3)(6,8)
\psset{solidmemory}
\psset{lightsrc=viewpoint}
\psSolid[object=new,fillcolor=white,incolor=yellow!20,
    linewidth=0.5\pslinewidth,
%    hollow,
    sommets={(cone2nappes-sommets.dat) run},
    faces={(cone2nappes-faces.dat) run},
    plansepare={[1 0 0 -1]},
    name=partcone2nappes,
    action=none
]
\psSolid[object=load,
   load=partcone2nappes1,
%   rm=0,hollow,
% enregistre les caractéristiques du solide
   file=hyperbole2nappes,
   action=writesolid
   ]%
\gridIIID[Zmin=-4,Zmax=4,spotX=r,linecolor=gray!50,planmarks](-4,4)(-4,4)
 \end{pspicture}
\end{center}
\end{document}

Et pour terminer le dessin : hyperbole2nappes.tex



\documentclass{article}
\usepackage{pst-solides3d}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\begin{document}
\begin{enumerate}
  \item Le solide \textsf{cone deux nappes} a été coupé par le plan $x=1$ et les données enregistrées par l'option \textsf{action=writesolid}.
  \item Dans une deuxième étape ce solide ainsi sectionné est affiché et complété avec le plan de coupe.
\end{enumerate}
\begin{center}
\psset{viewpoint=50 30 20 rtp2xyz,Decran=50}
\begin{pspicture}(-6,-3)(6,8)
\psset{lightsrc=viewpoint}
\psSolid[object=datfile,
         file=hyperbole2nappes,
        fcol=0 (0.875 0.75 0.625 setrgbcolor) 1 (0.875 0.75 0.625 setrgbcolor)]
\defFunction[algebraic]{hyperbol1}(t){1}{t}{(sqrt(t^2+1))*4/3}
\defFunction[algebraic]{hyperbol2}(t){1}{t}{-((sqrt(t^2+1))*4/3)}
\psSolid[object=courbe,
   function=hyperbol1,range=8 sqrt neg 8 sqrt,
   r=0,linecolor=red,
   linewidth=2pt]%
\psSolid[object=courbe,
   function=hyperbol2,range=8 sqrt neg 8 sqrt,
   r=0,linecolor=red,
   linewidth=2pt]%
\psSolid[object=plan,action=draw,linecolor=blue,
    definition=equation,
    args={[1 0 0 -1] 90},
    base=-4 4 -4 4,planmarks,showBase](1,0,0)
\gridIIID[Zmin=-4,Zmax=4,spotX=r,showAxes](-4,4)(-4,4)
 \end{pspicture}
\end{center}
\end{document}

Aucun commentaire:

Enregistrer un commentaire