mercredi 10 août 2011

PStricks : section hyperbolique, version transparente

Dans cette version le bi-cône est représenté dans sa totalité, mais par transparence on peut voir l'intersection.
Pour cette version aussi les deux parties du cône ont été enregistrées sur le disque. Si vous souhaitez l'adapter à votre problème il faudra dé-commenter toutes les lignes. Les fichiers.

\documentclass{article}
\usepackage{pst-solides3d}
\usepackage{pst-math}
\begin{document}
\begin{center}
\begin{pspicture}(-4,-5)(4,5)
    \psset{lightsrc=viewpoint}
    \psset{viewpoint=100 50 20 rtp2xyz,Decran=100}
\psSolid[object=grille,base=-4 4 -4 4,linecolor={[rgb]{0.72 0.72 0.5}}](0,0,-3)
%    \psset{solidmemory}
%    \psSolid[object=cone,h=3,r=3,
%             plansepare={[0 2 1 -1.30]},
%             name=ConeA,
%             ngrid=9 30,
%             action=none](0,0,-3)
%    \psSolid[object=load,
%             load=ConeA1,
%             file=ConeA1,action=writesolid]
%    \psSolid[object=load,
%             load=ConeA0,
%             file=ConeA0,action=writesolid]
%    \psSolid[object=cone,h=3,r=3,
%             plansepare={[0 2 1 -1.30]},
%             name=ConeB,
%             RotY=180,
%             ngrid=9 30,
%             action=none](0,0,3)
%    \psSolid[object=load,
%             load=ConeB1,
%             file=ConeB1,action=writesolid]
%    \psSolid[object=load,
%             load=ConeB0,
%             file=ConeB0,action=writesolid]
    \psSolid[object=datfile,
             file=ConeA1,
             hollow,rm=0 233,
             grid,
             opacity=0.5,
             fillcolor={[rgb]{0.5 0.72 0.5}},incolor=yellow!50]
    \psSolid[object=datfile,
             file=ConeB1,
             hollow,rm=0 137,
             grid,
             opacity=0.5,
             fillcolor={[rgb]{0.5 0.72 0.5}},incolor=yellow!50]
    \psSolid[object=plan,definition=equation,
             args={[0 2 1 -1.3] 180},
             base=-4 4 -4.8 1.9,
             opacity=.5,
             fillcolor=green!20]
\defFunction[algebraic]{hyp1}(t)%
        {0.745*SINH(t)}{0.865+0.43*COSH(t)} {-0.43-0.86*COSH(t)}
    \psSolid[object=courbe,
             r=0,
             range=-1.75 1.75,
             linecolor=blue,
             linewidth=2\pslinewidth,
             function=hyp1]
\defFunction[algebraic]{hyp2}(t)%
        {0.745*SINH(t)}{0.865-0.43*COSH(t)} {-0.43+0.86*COSH(t)}
    \psSolid[object=courbe,
             r=0,
             range=-2.05 2.05,
             linecolor=blue,
             linewidth=2\pslinewidth,
             function=hyp2]
    \psSolid[object=datfile,
             file=ConeB0,
             hollow,rm=0 102,
             grid,
             opacity=0.5,
             fillcolor={[rgb]{0.5 0.72 0.5}},incolor=yellow!50]
    \psSolid[object=datfile,
             file=ConeA0,
             hollow,rm=0 20,
             grid,
             opacity=0.5,
             fillcolor={[rgb]{0.5 0.72 0.5}},incolor=yellow!50]
\axesIIID(0,0,2)(5,5,7)
        \end{pspicture}
\end{center}
\end{document}



mardi 9 août 2011

POV-Ray vs PStricks

POV-Ray peut-être utilisé pour représenter les sections d'un cône avec un plan. Les images obtenues, non-vectorielles, sont très belles.
Voici trois essais (à peine ébauchés) qui doivent beaucoup aux pages de Friedrich Lohmueller . Je lui ai emprunté, pour ces exemples, les macros permettant de dessiner les axes et l'astuce pour tracer les courbes en 3D. Tous les fichiers sont dans l'archive :
1- Section elliptique : ( ellipse_1.pov )

// POV-Ray 3.6 / 3.7 Scene File "ellipse_1.pov"
// d'après Friedrich A. Lohmueller
// date: Aug-2011
// email: Friedrich.Lohmueller_at_t-online.de
// http:// www.friedrich.lohmueller.de/
//------------------------------------------------------------------------
// Choose image_size by               Wählen Sie die Bildgröße, indem
// adding to the commandline:         sie in der Kommandozeile einfügen:
//
//                      +h700 +w700
//
//------------------------------------------------------------------------
#version 3.6; // 3.7;
global_settings{assumed_gamma 1.0}
#default{ finish{ ambient 0.1 diffuse 0.9 }}
//------------------------------------------------------------------------
#include "colors.inc"
#include "textures.inc"
#include "stones.inc"
//------------------------------------------------------------------------
#declare Camera_0 = camera { perspective
                             location  < 50, 25,30>
                             look_at   < 0.00, 0.00, 0.00>
                             angle 15
                             right     x*image_width/image_height
                           }
camera{Camera_0}

//Place a light--you can have more than one!
light_source {
  <10,0,10>    //Change this if you want to put the light at a different point
  color White*2        //Multiplying by 2 doubles the brightness
}
background { color rgb <0.5, 0.5, 1> }
//------------------------------ the Axes --------------------------------
//------------------------------------------------------------------------
#macro Axis_( AxisLen, Dark_Texture,Light_Texture)
 union{
    cylinder { <0,-AxisLen-3,0>,<0,AxisLen,0>,0.05
               texture{checker texture{Dark_Texture }
                               texture{Light_Texture}
                       translate<0.1,0,0.1>}
             }
    cone{<0,AxisLen,0>,0.2,<0,AxisLen+0.7,0>,0
          texture{Dark_Texture}
         }
     } // end of union                  
#end // of macro "Axis()"
//------------------------------------------------------------------------
#macro AxisXYZ( AxisLenX, AxisLenY, AxisLenZ, Tex_Dark, Tex_Light)
//--------------------- drawing of 3 Axes --------------------------------
union{
#if (AxisLenX != 0)
 object { Axis_(AxisLenX, Tex_Dark, Tex_Light)   rotate< 0,0,-90>}// x-Axis
 text   { ttf "arial.ttf",  "x",  0.15,  0  texture{Tex_Dark}
          scale 0.5 translate }
#end // of #if
#if (AxisLenY != 0)
 object { Axis_(AxisLenY, Tex_Dark, Tex_Light)   rotate< 0,0,  0>}// y-Axis
 text   { ttf "arial.ttf",  "y",  0.15,  0  texture{Tex_Dark}   
           scale 0.5 translate <-0.55,AxisLenY+0.20,-0.10>}
#end // of #if
#if (AxisLenZ != 0)
 object { Axis_(AxisLenZ, Tex_Dark, Tex_Light)   rotate<90,0,  0>}// z-Axis
 text   { ttf "arial.ttf",  "z",  0.15,  0  texture{Tex_Dark}
               scale 0.5 translate <-0.55,0.1,AxisLenZ+0.10>}
#end // of #if
} // end of union
#end// of macro "AxisXYZ( ... )"
//------------------------------------------------------------------------

#declare Texture_A_Dark  = texture {
                               pigment{color rgb<1,0.35,0>}
                               finish {ambient 0.15 diffuse 0.85 phong 1}
                             }
#declare Texture_A_Light = texture {
                               pigment{color rgb<1,1,1>}
                               finish {ambient 0.15 diffuse 0.85 phong 1}
                             }

object{ AxisXYZ( 6.0, 4.0, 7.0, Texture_A_Dark, Texture_A_Light)} // <<<<<<<<<<<<<<<<< adapt the axes here !!!
//-------------------------------------------------- end of coordinate axes

//--------------------------------------------------------------------------
//---------------------------   scenery objects  ---------------------------
//--------------------------------------------------------------------------

// angle de la normale au plan
// n<0, cos(Omega), sin(Omega)>
#declare Omega = pi/6;

intersection{
cone { <0, 3, 0>, 3, <0, 0, 0>, 0 texture {Yellow_Pine}}
plane {<0,cos(Omega),sin(Omega)>, 1 texture {Yellow_Pine}}
}

union{
 #declare X   = -5.5; // start X    attention: x != X  use capital letter X
 #declare EndX = 5.5; // end   X
 #while ( X < EndX )
 // Drawing of the "points"< X / f(X) >:    
 // Zeichnen der "Punkte"  ( X / f(X) ):

                       //       Color - Farbe                  //< X, f(X)         ,0>} 
                      
  sphere{ <0,0,0>,0.025 pigment{ color Red  }  translate< 1.414*cos(X),1.732-sin(X),-1+1.732*sin(X)>}

 // next step:
 #declare X = X + 0.002;  // next Nr  <<<-- increase this value if you have not enough RAM
                          //                              or if your computer is too slow!
 #end // --------------- end of loop 
} // end of union

cone { <0, -3, 0>, 3, <0, 0, 0>, 0 texture {Yellow_Pine}}
 
//------------------------------------------------------------------------------------ end

2 - Section parabolique ( parabole_1.pov)
// POV-Ray 3.6 / 3.7 Scene File "parabole_1.pov"
// d'après Friedrich A. Lohmueller
// date: Aug-2011
// email: Friedrich.Lohmueller_at_t-online.de
// http:// www.friedrich.lohmueller.de/
//------------------------------------------------------------------------
// Choose image_size by               Wählen Sie die Bildgröße, indem
// adding to the commandline:         sie in der Kommandozeile einfügen:
//
//                      +h700 +w700
//
//------------------------------------------------------------------------
#version 3.6; // 3.7;
global_settings{assumed_gamma 1.0}
#default{ finish{ ambient 0.1 diffuse 0.9 }}
//------------------------------------------------------------------------
#include "colors.inc"
#include "textures.inc"
#include "stones.inc"
//------------------------------------------------------------------------
#declare Camera_0 = camera { perspective
                             location  < 50, 25,30>
                             look_at   < 0.00, 0.00, 0.00>
                             angle 15
                             right     x*image_width/image_height
                           }
camera{Camera_0}

//Place a light--you can have more than one!
light_source {
  <10,0,10>    //Change this if you want to put the light at a different point
  color White*2        //Multiplying by 2 doubles the brightness
}
background { color rgb <0.5, 0.5, 1> }
//------------------------------ the Axes --------------------------------
//------------------------------------------------------------------------
#macro Axis_( AxisLen, Dark_Texture,Light_Texture)
 union{
    cylinder { <0,-AxisLen-3,0>,<0,AxisLen,0>,0.05
               texture{checker texture{Dark_Texture }
                               texture{Light_Texture}
                       translate<0.1,0,0.1>}
             }
    cone{<0,AxisLen,0>,0.2,<0,AxisLen+0.7,0>,0
          texture{Dark_Texture}
         }
     } // end of union                  
#end // of macro "Axis()"
//------------------------------------------------------------------------
#macro AxisXYZ( AxisLenX, AxisLenY, AxisLenZ, Tex_Dark, Tex_Light)
//--------------------- drawing of 3 Axes --------------------------------
union{
#if (AxisLenX != 0)
 object { Axis_(AxisLenX, Tex_Dark, Tex_Light)   rotate< 0,0,-90>}// x-Axis
 text   { ttf "arial.ttf",  "x",  0.15,  0  texture{Tex_Dark}
          scale 0.5 translate }
#end // of #if
#if (AxisLenY != 0)
 object { Axis_(AxisLenY, Tex_Dark, Tex_Light)   rotate< 0,0,  0>}// y-Axis
 text   { ttf "arial.ttf",  "y",  0.15,  0  texture{Tex_Dark}   
           scale 0.5 translate <-0.55,AxisLenY+0.20,-0.10>}
#end // of #if
#if (AxisLenZ != 0)
 object { Axis_(AxisLenZ, Tex_Dark, Tex_Light)   rotate<90,0,  0>}// z-Axis
 text   { ttf "arial.ttf",  "z",  0.15,  0  texture{Tex_Dark}
               scale 0.5 translate <-0.55,0.1,AxisLenZ+0.10>}
#end // of #if
} // end of union
#end// of macro "AxisXYZ( ... )"
//------------------------------------------------------------------------

#declare Texture_A_Dark  = texture {
                               pigment{color rgb<1,0.35,0>}
                               finish {ambient 0.15 diffuse 0.85 phong 1}
                             }
#declare Texture_A_Light = texture {
                               pigment{color rgb<1,1,1>}
                               finish {ambient 0.15 diffuse 0.85 phong 1}
                             }

object{ AxisXYZ( 6.0, 4.0, 7.0, Texture_A_Dark, Texture_A_Light)} // <<<<<<<<<<<<<<<<< adapt the axes here !!!
//-------------------------------------------------- end of coordinate axes



//--------------------------------------------------------------------------
//---------------------------   scenery objects  ---------------------------
//--------------------------------------------------------------------------


// angle de la normale au plan
// n<0, cos(Omega), sin(Omega)>
#declare Omega = pi/4;
#declare D = 1.3;
intersection{
cone { <0, 3, 0>, 3, <0, 0, 0>, 0 texture {Yellow_Pine}}
plane {<0,cos(Omega),sin(Omega)>, D texture {Yellow_Pine}}
}

union{
 #declare X   = -0.4; // start X    attention: x != X  use capital letter X
 #declare EndX = 3.54; // end   X
 #while ( X < EndX )
 // Drawing of the "points"< X / f(X) >:    
 // Zeichnen der "Punkte"  ( X / f(X) ):

                       //       Color - Farbe                  //< X, f(X)         ,0>} 
                      
  sphere{ <0,0,0>,0.025 pigment{ color Red  }  translate< 1.3*cos(X)/(0.707+0.707*sin(X)),1.3/(0.707+0.707*sin(X)),1.3*sin(X)/(0.707+0.707*sin(X))>}


 // next step:
 #declare X = X + 0.002;  // next Nr  <<<-- increase this value if you have not enough RAM
                          //                              or if your computer is too slow!
 #end // --------------- end of loop 
} // end of union

cone { <0, -3, 0>, 3, <0, 0, 0>, 0 texture {Yellow_Pine}}
 
//------------------------------------------------------------------------------------ end
 

3 - Section hyperbolique (hyperbole_1.pov)
// POV-Ray 3.6 / 3.7 Scene File "hyperbole_1.pov"
// d'après Friedrich A. Lohmueller
// date: Aug-2011
// email: Friedrich.Lohmueller_at_t-online.de
// http:// www.friedrich.lohmueller.de/

#version 3.6; // 3.7;
global_settings{assumed_gamma 1.0}
#default{ finish{ ambient 0.1 diffuse 0.9 }}
//------------------------------------------------------------------------
#include "colors.inc"
#include "textures.inc"
#include "stones.inc"
//------------------------------------------------------------------------
#declare Camera_0 = camera { perspective
                             location  < 50, 25,30>
                             look_at   < 0.00, 0.00, 0.00>
                             angle 15
                             right     x*image_width/image_height
                           }
camera{Camera_0}

//Place a light--you can have more than one!
light_source {
  <10,0,10>    //Change this if you want to put the light at a different point
  color White*2        //Multiplying by 2 doubles the brightness
}
background { color rgb <0.5, 0.5, 1> }
//------------------------------ the Axes --------------------------------
//------------------------------------------------------------------------
#macro Axis_( AxisLen, Dark_Texture,Light_Texture)
 union{
    cylinder { <0,-AxisLen-3,0>,<0,AxisLen,0>,0.05
               texture{checker texture{Dark_Texture }
                               texture{Light_Texture}
                       translate<0.1,0,0.1>}
             }
    cone{<0,AxisLen,0>,0.2,<0,AxisLen+0.7,0>,0
          texture{Dark_Texture}
         }
     } // end of union                  
#end // of macro "Axis()"
//------------------------------------------------------------------------
#macro AxisXYZ( AxisLenX, AxisLenY, AxisLenZ, Tex_Dark, Tex_Light)
//--------------------- drawing of 3 Axes --------------------------------
union{
#if (AxisLenX != 0)
 object { Axis_(AxisLenX, Tex_Dark, Tex_Light)   rotate< 0,0,-90>}// x-Axis
 text   { ttf "arial.ttf",  "x",  0.15,  0  texture{Tex_Dark}
          scale 0.5 translate }
#end // of #if
#if (AxisLenY != 0)
 object { Axis_(AxisLenY, Tex_Dark, Tex_Light)   rotate< 0,0,  0>}// y-Axis
 text   { ttf "arial.ttf",  "y",  0.15,  0  texture{Tex_Dark}   
           scale 0.5 translate <-0.55,AxisLenY+0.20,-0.10>}
#end // of #if
#if (AxisLenZ != 0)
 object { Axis_(AxisLenZ, Tex_Dark, Tex_Light)   rotate<90,0,  0>}// z-Axis
 text   { ttf "arial.ttf",  "z",  0.15,  0  texture{Tex_Dark}
               scale 0.5 translate <-0.55,0.1,AxisLenZ+0.10>}
#end // of #if
} // end of union
#end// of macro "AxisXYZ( ... )"
//------------------------------------------------------------------------

#declare Texture_A_Dark  = texture {
                               pigment{color rgb<1,0.35,0>}
                               finish {ambient 0.15 diffuse 0.85 phong 1}
                             }
#declare Texture_A_Light = texture {
                               pigment{color rgb<1,1,1>}
                               finish {ambient 0.15 diffuse 0.85 phong 1}
                             }

object{ AxisXYZ( 6.0, 4.0, 7.0, Texture_A_Dark, Texture_A_Light)} // <<<<<<<<<<<<<<<<< adapt the axes here !!!
//-------------------------------------------------- end of coordinate axes


//--------------------------------------------------------------------------
//---------------------------   scenery objects  ---------------------------
//--------------------------------------------------------------------------

// angle de la normale au plan
// n<0, cos(Omega), sin(Omega)>
#declare Omega = pi/2;
#declare D = 1;
#declare bicone =  union {
cone { <0, 3, 0>, 3, <0, 0, 0>, 0 texture {Yellow_Pine}} 
cone { <0, -3, 0>, 3, <0, 0, 0>, 0 texture {Yellow_Pine}}
}
intersection{
object {bicone}
plane {<0,cos(Omega),sin(Omega)>, D texture {Yellow_Pine}}
}

union{
 #declare X   = -1.7627; // start X    attention: x != X  use capital letter X
 #declare EndX = 1.76275; // end   X
 #while ( X < EndX )
 // Drawing of the "points"< X / f(X) >:    
 // Zeichnen der "Punkte"  ( X / f(X) ):
                      
  sphere{ <0,0,0>,0.025 pigment{ color Red  }  translate< sinh(X),cosh(X),1>}
  sphere{ <0,0,0>,0.025 pigment{ color Red  }  translate< sinh(X),-cosh(X),1>}

 // next step:
 #declare X = X + 0.002;  // next Nr  <<<-- increase this value if you have not enough RAM
                          //                              or if your computer is too slow!
 #end // --------------- end of loop 
} // end of union

lundi 8 août 2011

Maple vs PStricks

Il est intéressant de comparer les réalisations obtenues avec Maple et PStricks. Il est évident que les calculs sont bien plus rapides avec Maple et les calculs littéraux étant effectués par le logiciel, les erreurs sont minimisées. L'avantage pour PStricks est que le dessin est plus facilement personnalisable et que les possibilités d'enrichissement du schéma (couleurs, notations etc.) sont incomparables. À vous de décider...
Le code ci-dessous est adapté de celui(excellent) de la page de Philippe Dumas  : code Maple.
J'ai modifié le paramétrage du cône que j'ai trouvé inutilement compliqué.

>    cone_param:=[r*cos(psi),r*sin(psi),r/tan(theta)];


>    plane_param:=[v,h*cos(omega)-u*sin(omega),h*sin(omega)+u*cos(omega)];
>    plane_cart:=y*cos(omega)+z*sin(omega)-h; 


>    equ:=subs(x=cone_param[1],y=cone_param[2],z=cone_param[3],plane_cart);

>    rr:=solve(equ,r);
>    conic:=subs(r=rr,cone_param); 
Theta:=Pi/4:Omega:=Pi/3:H:=4:
m:=20:
picture[cone]:=plot3d(subs(theta=Theta,h=H,cone_param),r=-m..m,psi=-Pi..Pi,shading=xyz):
>    picture[plane]:=plot3d(subs(omega=Omega,h=H,plane_param),u=-m..1.5*m,v=-m..m,grid=[9,9],color=[0.9,0.9,1]):
>    picture[conic]:=plots[spacecurve](subs(theta=Theta,omega=Omega,h=H,conic),psi=-Pi..Pi,color=blue,thickness=3):
>    plots[display]({seq(picture[i],i={cone,plane,conic})},scaling=constrained,axes=boxed);


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}

mercredi 3 août 2011

Pourquoi deux systèmes d'équations paramétriques très différents définissent-ils exactement la même courbe ?

Les deux méthodes permettant de déterminer les équations paramétriques des sections coniques aboutissent à deux systèmes apparemment très différents. Je reprends l'un des exemples déjà étudiés.

Pour la section elliptique du cône de demi-angle au sommet égal à 45°, coupé par le plan d'équation :
on obtient les deux systèmes d'équations :



Dont voici les tracés correspondants :
 Je me pose la question suivante : comment expliquer que ces deux systèmes d'équations apparemment si dissemblables décrivent exactement la même courbe ? Il doit exister un moyen, une méthode ou une astuce permettant de passer de l'un à l'autre. On peut évidemment vérifier que les coordonnées de chacun des deux systèmes vérifient respectivement les équations du cône et du plan, mais imaginons que l'on ignore l'origine des ces équations paramétriques : elle sont là et je vois qu'elles dessinent la même courbe qui semble être une ellipse, puis-je découvrir un procédé permettant de passer d'un système à l'autre ?  En clair quelle est la relation existant entre $t_1$ et $t_2$ ?
Dans l'exemple ci-dessus, la relation est facile à trouver et la vérification ne pose pas de difficultés (merci à Jean-Gabriel Luque qui m'a indiqué la méthode).

Vous trouverez des calculs plus détaillés dans le document (calculs_intersection.pdf) (calculs_intersection.tex)
 ainsi que dans cette étude (un peu plus ancienne), dont les fichiers se trouvent dans l'archive zip :








mardi 2 août 2011

Équations paramétriques des sections coniques : compléments

Deux façons de trouver les équations paramétriques des sections coniques. On se limite dans cette étude à un cas particulier : la section parabolique.
Le document (calculs_intersection.pdf) est dans l'archive:
Méthode utilisant les équations paramétriques du bicône :
\begin{center}
 \begin{pspicture}(-4,-7)(4,7)
        \psset{lightsrc=viewpoint}
        \psset{viewpoint=100 20 30 rtp2xyz,Decran=100}
        \psSolid[object=grille,base=-4 4 -4 4,linecolor={[rgb]{0.72 0.72 0.5}}](0,0,-3)
        \psSolid[object=cone,h=3,r=3,
                 fillcolor={[rgb]{0.5 0.72 0.5}},incolor=yellow!50,
                 grid,
                 ngrid=9 30](0,0,-3)
\psset{solidmemory}%
        \psSolid[object=cone,h=3,r=3,
                 rm=0,
                 plansepare={[0 0.707 0.707 -1.30]},
                 name=ConeB,
                 RotY=180,
                 ngrid=9 30,
                 action=none](0,0,3)%
        \psSolid[object=load,
                 load=ConeB1,
                 hollow,rm=0,
                 grid,
                 fillcolor={[rgb]{0.5 0.72 0.5}},incolor=yellow!50]%
        \psSolid[object=plan,definition=equation,
                 args={[0 0.707 0.707 -1.3] 180},
                 base=-4 4 -8 4,
                 planmarks,showBase,
                 opacity=.5,
                 fillcolor=green!20]%
\pstVerb{/omega 45 def /H 3 def
         /t_1 1.3 H omega sin mul sub H div omega cos div Arcsin def
         /t_2 pi t_1 sub def}%
\defFunction[algebraic]{parabole}(t)%
        {1.3*cos(t)/(0.707+0.707*sin(t))}
        {1.3*sin(t)/(0.707+0.707*sin(t))}
        {1.3/(0.707+0.707*sin(t))}
        \psSolid[object=courbe,
                r=0,
%                range=-0.4 3.54,
                range=t_1 t_2,
                linecolor=blue,
          linewidth=2\pslinewidth,
               function=parabole]
\axesIIID(0,0,1.3)(5,5,7)
        \end{pspicture}
    \end{center}
 Méthode utilisant l'équation cartésienne du bicône :
\begin{center}
 \begin{pspicture}(-4,-7)(4,7)
        \psset{lightsrc=viewpoint}
        \psset{viewpoint=100 15 15 rtp2xyz,Decran=100}
        \psSolid[object=grille,base=-4 4 -4 4,linecolor={[rgb]{0.72 0.72 0.5}}](0,0,-3)
        \psSolid[object=cone,h=3,r=3,
                 fillcolor={[rgb]{0.5 0.72 0.5}},incolor=yellow!50,
                 grid,
                 ngrid=9 30](0,0,-3)
\psset{solidmemory}%
        \psSolid[object=cone,h=3,r=3,
                 rm=0,
                 plansepare={[0 0.707 0.707 -1.30]},
                 name=ConeB,
                 RotY=180,
                 ngrid=9 30,
                 action=none](0,0,3)%
        \psSolid[object=load,
                 load=ConeB1,
                 hollow,rm=0,
                 grid,
                 fillcolor={[rgb]{0.5 0.72 0.5}},incolor=yellow!50]%
        \psSolid[object=plan,definition=equation,
                 args={[0 0.707 0.707 -1.3] 180},
                 base=-4 4 -8 4,
                 planmarks,showBase,
                 opacity=.5,
                 fillcolor=green!20]%
\defFunction[algebraic]{parabole}(t)%
        {t}
        {-0.272*t^2+0.919}
        {0.272*t^2+0.919}
        \psSolid[object=courbe,
                r=0,
                range=-2.766 2.766,
                linecolor=red,
                linewidth=2\pslinewidth,
               function=parabole]
        \axesIIID(0,0,1.3)(5,5,7)
        \end{pspicture}
    \end{center}
On notera les différences entre les équations et les limites du paramètre, mais que les courbes obtenues sont absolument identiques !