jeudi 28 juillet 2011

Sections Coniques : partie 1

Les sections d'un cône avec PStricks et son package pst-solides3d. Il existe de nombreuses façons de les réaliser, en voici quelques-unes. Tous les cas ont été envisagés et les méthodes employées sont diverses : commandes PStricks ou usage du code jps dans la macro \codejps. Afin d'obtenir des tracés avec une haute résolution les solides ont été pré-calculés, pour ensuite pouvoir être utilisés rapidement, car sinon le temps de calcul de l'interpréteur postscript est relativement long. Dans cette première partie, c'est la macro \codejps qui est essentiellement utilisée : on utilise les commandes PostScript incluses dans le fichier pst-solides3d.pro.

Tous les fichiers liés à cette première partie (.tex, .pdf et .dat) sont dans l'archive :
On a donc opéré en quatre étapes :
Étape 1 :
% fabrique du bi-cône
\codejps{
-5 3 0 [18 60] newcone
 5 3 0 [18 60] newcone
  dup solidfacesreverse
 solidfuz
(bicone) writesolidfile
 }
Explications : le cône est vertical, le premier paramètre est la cote du centre de la base, le deuxième le rayon de la base et le troisième la cote du sommet du cône. Entre les crochets, on place le nombre de divisions pour la hauteur et pour la base : 18 sous-divisions pour la hauteur et  60 sous-divisions pour la base (soit un pas de 10°), c'est la définition du maillage du cône : 18x60. Plus le maillage est serré et plus le temps de calcul sera long pour la coupe du bicône par un plan, d'où l'intérêt de sauvegarder les données des deux parties obtenues lors de la partition du bicône, car, par contre, la lecture des données est très rapide, ce qui permet ensuite d'affiner la mise en page, le choix des couleurs, le point de vue, les annotations sur le schéma etc. sans être obligé d'attendre que l'interpréteur ait terminé les calculs.
Cette étape enregistre sur le disque les données du bicône (bicone-sommets.dat etc.). On pourra ensuite commenter ces lignes (ajouter un % au début de chaque ligne), il est, en effet, inutile de recommencer ces calculs à chaque nouvelle compilation.
Étape 2 : la partition du bicône par un plan et l'écriture des données des deux parties ainsi obtenues.
Explications : le plan est défini par son équation ax+by+cz+d=0 avec le paramètre plansepare={[a b c d]}. Les deux parties ainsi obtenues sont réunies par un seul nom avec name=biconepartcircle (dans le cas de la section circulaire, tout autre nom est possible), chacune des parties sera indexée respectivement biconepartcircle0 et biconepartcircle1.

\psset{solidmemory}
\psSolid[object=datfile,
   file=bicone,
   plansepare={[0 0 1 -3]},
   name=biconepartcircle,
  action=none]
\psSolid[object=load,
   load=biconepartcircle1,
   file=biconepartcircle1,action=writesolid]
\psSolid[object=load,
   load=biconepartcircle0,
   file=biconepartcircle0,action=writesolid]

L'étape du calcul des caractéristiques des deux parties est la plus longue. Ensuite, lorsque les données auront été enregistrées, on pourra commenter toutes les lignes précédentes, pour se consacrer à la mise en page.
Étape 3 : l'affichage des deux parties par la lecture des données, par exemple pour la partie 1 :
\psSolid[object=datfile,
   file=biconepartcircle1,
  grid,
   fillcolor={[rgb]{0.5 0.72 0.5}},incolor=yellow!50,
   rm=0 1,
   hollow]
 Étape 4 : le dessin de l'intersection, cercle, ellipse, parabole ou hyperbole suivant le cas.
Les équations paramétriques de l'intersection se déterminent aisément, quelques explications sont données dans les documents du sous répertoire "sections_bicone_doc" de l'archive :

 Le problème le plus délicat est la détermination des limites du paramètre. Il peut-être traité à part ou bien résolu directement avec du code postscript.
Si vous souhaitez faire vous-même les calculs adaptées à votre problème particulier pour enregistrer les données, il faudra dé-commenter les lignes correspondantes.
1 - Section Circulaire :
 

\documentclass{article}
\usepackage{pst-solides3d}
\begin{document}
\begin{center}
\begin{pspicture}(-5,-6)(8,7)
\pstVerb{/theta 3 5 atan def
         /tantheta 3 5 div def
         /rayon 3 tantheta mul def}%
%\codejps{ % bicone de rayon 3 et de 1/2 hauteur 5
%-5 3 0 [24 60] newcone
% 5 3 0 [24 60] newcone
% dup solidfacesreverse
% solidfuz
%(bicone) writesolidfile
% }
\psset{viewpoint=50 -30 30 rtp2xyz,,Decran=50,lightsrc=viewpoint}
\psframe[fillstyle=solid,fillcolor=gray!50](-5,-6)(8,7)%
\psSolid[object=grille,base=-4 4 -4 8,linecolor={[rgb]{0.72 0.72 0.5}}](0,0,-5)
%\psset{solidmemory}
%\psSolid[object=datfile,
%   file=bicone,
%   plansepare={[0 0 1 -3]},
%   name=biconepartcircle,
%  action=none]
%\psSolid[object=load,
%   load=biconepartcircle1,
%   file=biconepartcircle1,action=writesolid]
%\psSolid[object=load,
%   load=biconepartcircle0,
%   file=biconepartcircle0,action=writesolid]
%
\psSolid[object=datfile,
   file=biconepartcircle1,grid,
   fillcolor={[rgb]{0.5 0.72 0.5}},incolor=yellow!50,
   rm=0 1,
   hollow]
% l'intersection
\defFunction[algebraic]{cercle}(t){rayon*cos(t)}{rayon*sin(t)}{3}
\psSolid[object=courbe,r=0,
         range=0 2 pi mul,
         linecolor=red,%{[rgb]{0.08 0.24 0.09}},
         function=cercle]%
\psSolid[object=plan,action=draw,
   definition=equation,
   args={[0 0 1 -3]},
   base=-3 3 -5 5,planmarks,showBase]
\psSolid[object=datfile,
   file=biconepartcircle0,grid,
   fillcolor={[rgb]{0.5 0.72 0.5}},incolor=yellow!50,
   rm=0 1,
   hollow](0,5,0)
\axesIIID[linecolor=blue](0,0,3)(4,3,6)
\composeSolid
\end{pspicture}
\end{center}
\end{document}
Éventuellement, cliquer sur "Plus d'infos" pour les autres sections.
2 - Section elliptique :

\documentclass{article}
\usepackage{pst-solides3d}
\begin{document}
\begin{center}
\begin{pspicture}(-5,-6)(8,7)
\pstVerb{/theta 3 5 atan def
         /tantheta 3 5 div def
         /rayon 3 tantheta mul def
         /sinW 1 def
         /cosW 0.5 def
         /dH 3 def}%
%\codejps{ % bicone de rayon 3 et de 1/2 hauteur 5
%-5 3 0 [24 60] newcone
% 5 3 0 [24 60] newcone
% dup solidfacesreverse
% solidfuz
%(bicone) writesolidfile
% }
\psset{viewpoint=50 -10 30 rtp2xyz,,Decran=50,lightsrc=viewpoint}
\psframe[fillstyle=solid,fillcolor=gray!50](-5,-6)(8,7)%
\psSolid[object=grille,base=-4 4 -4 8,linecolor={[rgb]{0.72 0.72 0.5}}](0,0,-5)
%\psset{solidmemory}
%\psSolid[object=datfile,
%   file=bicone,
%   plansepare={[0 0.5 1 -3]},
%   name=biconepartellipse,
%  action=none]
%\psSolid[object=load,
%   load=biconepartellipse1,
%   file=biconepartellipse1,action=writesolid]
%\psSolid[object=load,
%   load=biconepartellipse0,
%   file=biconepartellipse0,action=writesolid]
%
\psSolid[object=datfile,
   file=biconepartellipse1,grid,
   fillcolor={[rgb]{0.5 0.72 0.5}},incolor=yellow!50,
   rm=0 1,
   hollow]
% l'intersection
\defFunction[algebraic]{ellipse}(t){(dH/(sinW+tantheta*cosW*sin(t)))*tantheta*cos(t)}{(dH/(sinW+tantheta*cosW*sin(t)))*tantheta*sin(t)}{dH/(sinW+tantheta*cosW*sin(t))}
\psSolid[object=courbe,r=0,
         range=0 2 pi mul,
         linecolor=red,%{[rgb]{0.08 0.24 0.09}},
         function=ellipse]%
\psSolid[object=plan,action=draw,
   definition=equation,
   args={[0 0.5 1 -3]},
   base=-3 3 -6 7,planmarks,showBase]
\axesIIID[linecolor=blue](0,0,3)(5,6,6)
\psSolid[object=datfile,
   file=biconepartellipse0,grid,
   fillcolor={[rgb]{0.5 0.72 0.5}},incolor=yellow!50,
   rm=0 1,
   hollow](0,5,-2.5)
%\composeSolid
\end{pspicture}
\end{center}
\end{document}

 3 - Section parabolique :

\documentclass{article}
\usepackage{pst-solides3d}
\usepackage{pst-math}
\begin{document}
%\section{Section par un plan incliné en \textbackslash codejps : parabole}
\begin{center}
%% fabrique du bi-cone
%\codejps{
%-5 3 0 [18 60] newcone
% 5 3 0 [18 60] newcone
% dup solidfacesreverse
% solidfuz
%(bicone) writesolidfile
% }
\begin{pspicture}(-5,-6)(8,7)
\psset{viewpoint=50 -50 20 rtp2xyz,Decran=50}
\psset{lightsrc=viewpoint}
\psframe[fillstyle=solid,fillcolor=gray!50](-5,-6)(8,7)%
\psSolid[object=grille,base=-4 4 -4 8,linecolor={[rgb]{0.72 0.72 0.5}}](0,0,-5)
\codejps{
solidlightOn
/solidgrid false def
%(bicone) readsolidfile
%[30.9638 cos 0 30.9638 sin -1] solidplansepare
%exch
%{0 0 90 rotateOpoint3d} solidtransform
%{0 5 0 translatepoint3d} solidtransform
%(biconeplaninclineparabole-part0) writesolidfile
%(biconeplaninclineparabole-part1) writesolidfile
(biconeplaninclineparabole-part0) readsolidfile
dup  (0.7 1 0.7 setrgbcolor) outputcolors
dup 0 (0.8 0.8 0.3 setrgbcolor) solidputfcolor
dup 1 (0.8 0.8 0.3 setrgbcolor) solidputfcolor
 drawsolid**
(biconeplaninclineparabole-part1) readsolidfile
dup  (0.7 1 0.7 setrgbcolor) outputcolors
dup 0 (0.8 0.8 0.3 setrgbcolor) solidputfcolor
 drawsolid**
}
\psSolid[object=plan,action=draw,
   definition=equation,
   args={[30.9638 cos 0 30.9638 sin -1] 90},
   base=-3 3 -7.4 3.65,planmarks,showBase]
\psSolid[object=plan,action=draw,
   definition=normalpoint,
   args={0 30.9638 cos 5 add 30.9638 sin [0 30.9638 cos neg 30.9638 sin neg 0]},
   base=-3 3 -7.5 5.25,planmarks,showBase]
\pstVerb{/sinTheta 3 3 dup mul 5 dup mul add sqrt div def}%
\defFunction[algebraic]{parabole}(t)%
        {cos(t)*0.6/sinTheta/(1+cos(t))}{sin(t)*0.6/sinTheta/(1+cos(t))} {1/sinTheta/(1+cos(t))}
        \psSolid[object=courbe,
                r=0,
                range=-2.228 2.228,
                linecolor=red,
                function=parabole,
                RotZ=90
        ](0,5,0)
        \psSolid[object=courbe,
                r=0,
                range=-2.228 2.228,
                linecolor=red,
                function=parabole
        ]
\axesIIID[linecolor=blue](0,0,2)(4,3,6)
\end{pspicture}
\end{center}
\end{document}

4 - Section hyperbolique :

\documentclass{article}
\usepackage{pst-solides3d}
\usepackage{pst-math}
\begin{document}
%\section{Section par un plan incliné en \textbackslash codejps : hyperbole}
\begin{center}
% fabrique du bi-cone
%\codejps{
%-5 3 0 [18 60] newcone
% 5 3 0 [18 60] newcone
% dup solidfacesreverse
% solidfuz
%(bicone) writesolidfile
% }
\begin{pspicture}(-5,-6)(8,7)
\psset{viewpoint=50 -30 15 rtp2xyz,Decran=50}
\psset{lightsrc=viewpoint}
\psframe[fillstyle=solid,fillcolor=gray!50](-5,-6)(8,7)%
\psSolid[object=grille,base=-4 4 -4 8,linecolor={[rgb]{0.72 0.72 0.5}}](0,0,-5)
\codejps{
solidlightOn
/solidgrid false def
%(bicone) readsolidfile
%[20 cos 0 20 sin -0.25] solidplansepare
%exch
%{0 0 90 rotateOpoint3d} solidtransform
%{0 5 0 translatepoint3d} solidtransform
%(biconehyperbole-part0) writesolidfile
%(biconehyperbole-part1) writesolidfile
(biconehyperbole-part0) readsolidfile
dup  (0.7 1 0.7 setrgbcolor) outputcolors
dup 0 (0.8 0.8 0.3 setrgbcolor) solidputfcolor
dup 1 (0.8 0.8 0.3 setrgbcolor) solidputfcolor
 drawsolid**
(biconehyperbole-part1) readsolidfile
dup  (0.7 1 0.7 setrgbcolor) outputcolors
dup 0 (0.8 0.8 0.3 setrgbcolor) solidputfcolor
dup 1 (0.8 0.8 0.3 setrgbcolor) solidputfcolor
 drawsolid**
}
\defFunction[algebraic]{Hyp1}(t)%
        {cos(t)*0.6*0.25/(0.6*0.9397*cos(t)+0.342)}{sin(t)*0.6*0.25/(0.6*0.9397*cos(t)+0.342)} {0.25/(0.6*0.9397*cos(t)+0.342)}
        \psSolid[object=courbe,
                r=0,
                range=-2.115 2.115,
                linecolor=red,
                function=Hyp1,
                RotZ=90
        ](0,5,0)
        \psSolid[object=courbe,
                r=0,
                range=-2.115 2.115,
                linecolor=red,
                function=Hyp1
        ]
\defFunction[algebraic]{Hyp2}(t)%
        {-cos(t)*0.6*0.25/(-0.6*0.9397*cos(t)+0.342)}{-sin(t)*0.6*0.25/(-0.6*0.9397*cos(t)+0.342)} {0.25/(-0.6*0.9397*cos(t)+0.342)}
        \psSolid[object=courbe,
                r=0,
                range=-0.8 0.8,
                linecolor=red,
                function=Hyp2,
                RotZ=90
        ](0,5,0)
        \psSolid[object=courbe,
                r=0,
                range=-0.8 0.8,
                linecolor=red,
                function=Hyp2
        ]
\psSolid[object=plan,action=draw,
   definition=equation,
   args={[20 cos 0 20 sin -0.25] 90},
   base=-3 3 -6.1 4.6,planmarks,showBase]
\psSolid[object=plan,action=draw,
   definition=normalpoint,
   args={0 20 cos 0.25 mul 5 add 20 sin 0.25 mul [0 20 cos neg 20 sin neg 0]},
   base=-3 3 -5.5 5.23,planmarks,showBase]
\axesIIID[linecolor=blue](0,0,0)(4,3,6)
\end{pspicture}
\end{center}
\end{document}



5 commentaires:

  1. Réponses
    1. See the pst-solides3d documentation (Chapter 5 Use of external files) or http://tug.org/PSTricks/main.cgi/:
      <<
      By default, under Windows and Linux, the security of files on the hard drive is activated
      and doesn’t allow to write on the drive. To deactivate that security option, more or less temporarily, here the two corresponding procedures:
      Linux: The advice from Jean-Michel Sarlat: the simplest will be to use GhostScript directly, within the console. As there is no image to wait for:
      $> gs -dNOSAFER monfichier.ps quit.ps
      Windows: Within the menue Options, the option Security of files must be turned to unchecked.

      Supprimer
    2. i tried to $> gs -dNOSAFER monfichier.ps quit.ps in consele of ubuntu, but not funtion, the console produce error,any idea?

      Supprimer
  2. the console produce:
    GPL Ghostscript 9.10 (2013-08-30)
    Copyright (C) 2013 Artifex Software, Inc. All rights reserved.
    This software comes with NO WARRANTY: see the file PUBLIC for details.
    Error: /undefinedfilename in (monfichier.ps)
    Operand stack:

    Execution stack:
    %interp_exit .runexec2 --nostringval-- --nostringval-- --nostringval-- 2 %stopped_push --nostringval-- --nostringval-- --nostringval-- false 1 %stopped_push
    Dictionary stack:
    --dict:1172/1684(ro)(G)-- --dict:0/20(G)-- --dict:77/200(L)--
    Current allocation mode is local
    Last OS error: No such file or directory
    GPL Ghostscript 9.10: Unrecoverable error, exit code 1

    RépondreSupprimer
    Réponses
    1. In a first step, we must remove% at the beginning of the lines: LaTeX-> DVIPS-> gs or ps2pdf

      Supprimer