Page 1 sur 1

Solides

Publié : 22 mai 2012, 23:06
par Jérôme
Bonjour,
j'ai passé quelques temps à essayer de "programmer" en pstricks. Mon objectif était de pouvoir obtenir facilement des solides usuels (cône de révolution, cylindre de révolution, sphère et pavé droit) en pstricks. Jusque là, j'utilisais metapost ou asymptote pour les représentations en perspectives cavalières. Seulement voilà, je ne maîtrise pas du tout ces langages, et je souhaiterais que Pyromaths s'en tienne à pstricks (confère mes essais avec tikz).
Voici mes macros. Elles nécessitent trois "packages" pour fonctionner

Code : Tout sélectionner

\usepackage{pst-eucl,graphicx,pstricks-add}
pstricks-add doit être assez récent pour pouvoir utiliser \psEllipseTangents.
Ensuite, on les appelle assez simplement. Pour l'exemple, voilà ce que j'ai testé :

Code : Tout sélectionner

\begin{pspicture}(0,-1.6)(12.5,5.6)
  \pspPave(4,0){6}{4}{4}
  \pstMiddleAB{PA}{PH}{M}
  \pspCone*(M){2}{6}
  \pstGeonode(sommet){S}
  \pspPointDisque*(M){2}{-30}
  \psline[linestyle=dashed](S)(M)(pointdisque)
  \pspAngleDroit{pointdisque}{M}{S}
  \pspSphere(2,2){1.5}
  \pspCylindre(2,-1){1.5}{6}
\end{pspicture}

Image
Les macros :

Code : Tout sélectionner

\makeatletter
\newcommand*{\pspPointDisque}{%
  % Place le nœud ``pointdisque'' sur le disque d'un plan horizontal en
  % perspective cavalière à un angle donné par rapport au centre.
  % La commande étoilée place le nœud sur un disque sur la face droite d'un
  % cube.
  % (#1): coordonnées du centre du disque
  % #2: rayon du disque
  % #3: angle sur le disque
  \@ifstar{\psppointdisque@(1.0855,0.5585){75.324}}%
          {\psppointdisque@(1.1842,0.2955){9.409}}%
  }

\def\psppointdisque@(#1,#2)#3(#4)#5#6{%
  % (#1,#2): écrasement de l'ellipse
  % #3: angle de rotation
  % (#4): coordonnées du centre du cône
  % #5: rayon de la base
  % #6: angle sur le disque
  \pst@@getcoor{#4}%
  %deplace le cone de centre (0,0) sur le centre choisi :
  \rput[Br](!\pst@coor /YA exch \pst@number\psyunit div def /XA exch %
             \pst@number\psxunit div def XA YA){%
    %rotation de la perspective pour qu'elle s'inscrive dans des faces de cubes
    \rotatebox[x=0cm,y=0cm]{#3}{%
      %grand rayon, petit rayon
      \pstVerb{/PYROGR #1 #5 mul def /PYROPR #2 #5 mul def}%
      \pnode(!PYROGR #6 cos mul PYROPR #6 sin mul){pointdisque}%
      }%
    }%
  }

\def\pspAngleDroit#1#2#3{%
  % Trace un angle droit en perspective cavalière entre les trois nœuds passés
  % en paramètres.
  \pstInterLC[Radius=\pstDistVal{.3},PointSymbol=none,PointName=none]{#2}{#1}{#2}{}{RAAO}{RAA}%
  \pstInterLC[Radius=\pstDistVal{.3},PointSymbol=none,PointName=none]{#2}{#3}{#2}{}{RAOO}{RAO}%
  \pstOrtSym[PointSymbol=none,PointName=none]{RAA}{RAO}{#2}[RA]%
  \pspolygon(#2)(RAO)(RA)(RAA)%
  }

\newcommand*{\pspCylindre}{
  % Trace un cylindre de révolution en perspective cavalière 30°/0.7,
  % de centre, rayon et hauteur donnés, dont la base est sur un plan horizontal.
  % La commande étoilée trace un cylindre dont la base est sur la face droite
  % d'un cube.
  % (#1): coordonnées du centre du cylindre
  % #2: rayon de l'ellipse
  % #3: hauteur du cylindre
  \@ifstar{\pspcylindre@(1.0855,0.5585){75.324}}%
          {\pspcylindre@(1.1842,0.2955){9.409}}%
  }

\def\pspcylindre@(#1,#2)#3(#4)#5#6{%
  % Trace un cylindre de révolution en perspective cavalière 30°/0.7,
  % de centre, rayon et hauteur donnés, dont la base est sur un plan horizontal.
  % La commande étoilée trace un cylindre dont la base est sur la face droite
  % d'un cube.
  % (#1,#2): écrasement de l'ellipse
  % #3: angle de rotation
  % (#4): coordonnées du centre du cylindre
  % #5: rayon de la base
  % #6: hauteur du cylindre
  \pst@@getcoor{#4}%
  %deplace le cone de centre (0,0) sur le centre choisi :
  \rput[Br](!\pst@coor /YA exch \pst@number\psyunit div def /XA exch %
             \pst@number\psxunit div def XA YA){%
    %rotation de la perspective pour qu'elle s'inscrive dans des faces de cubes
    \rotatebox[x=0cm,y=0cm]{#3}{%
      %grand rayon, petit rayon
      \pstVerb{/PYROGR #1 #5 mul def /PYROPR #2 #5 mul def}%
      %hauteur verticale sinon hauteur horizontale :
      \ifdim #3pt=9.409pt\pnode(!#3 sin #6 mul #3 cos #6 mul){sommet}%
        %Angle pour joindre les deux bases :
        \def\AA{!#3 neg}%
        % trouve les coordonnées des points d'intersection d'une droite de
        % coefficient directeur donné avec une ellipse donnée => Base1 et Base2.
        % (d) ux+vy+w=0 est tangente à (E) x²/a²+y²/b²=1 ssi u²a²+v²b²=w²
        \pstVerb{/PYROWW PYROGR #3 cos mul dup mul PYROPR #3 sin mul dup mul add sqrt def}%
        \pstVerb{/PYROOO PYROWW #3 sin div def}%
        \psEllipseTangents(0,0)(!PYROGR PYROPR)(!0 PYROOO)%
        \pnode(EllipseT1){Base1}%
        \psEllipseTangents(0,0)(!PYROGR PYROPR)(!0 PYROOO neg)%
        \pnode(EllipseT1){Base2}%
      \else\pnode(!#3 cos #6 mul #3 sin neg #6 mul){sommet}%
        %Angle pour joindre les deux bases :
        \def\AA{!#3 neg 90 sub}%
        % trouve les coordonnées des points d'intersection d'une droite de
        % coefficient directeur donné avec une ellipse donnée => Base1 et Base2.
        % (d) ux+vy+w=0 est tangente à (E) x²/a²+y²/b²=1 ssi u²a²+v²b²=w²
        \pstVerb{/PYROWW PYROGR #3 sin mul dup mul PYROPR #3 cos mul dup mul add sqrt def}%
        \pstVerb{/PYROOO PYROWW #3 cos div def}%
        \psEllipseTangents(0,0)(!PYROGR PYROPR)(!0 PYROOO)%
        \pnode(EllipseT2){Base1}%
        \psEllipseTangents(0,0)(!PYROGR PYROPR)(!0 PYROOO neg)%
        \pnode(EllipseT2){Base2}%
      \fi%
      %pointillés sur la base inférieure du cylindre, déterminée en fonction du
      %signe de la hauteur :
      \ifdim #6cm>0cm\def\LBI{dashed}\def\LBII{solid}%
      \else\def\LBI{solid}\def\LBII{dashed}%
      \fi%
      %ordonnée à l'origine de la tangente
      \psline(Base1)([offset=#6,angle=\AA]Base1)
      \psline(Base2)([offset=#6,angle=\AA]Base2)%
      \psellipticarc(0,0)(!PYROGR PYROPR){(Base1)}{(Base2)}%
      \psellipticarc[linestyle=\LBI](0,0)(!PYROGR PYROPR){(Base2)}{(Base1)}%
      \psellipticarc(sommet)(!PYROGR PYROPR){(Base1)}{(Base2)}%
      \psellipticarc[linestyle=\LBII](sommet)(!PYROGR PYROPR){(Base2)}{(Base1)}%
      }%
    }%
  }

\newcommand*{\pspCone}{%
  \@ifstar{\pspcone@(1.0855,0.5585){75.324}}%
          {\pspcone@(1.1842,0.2955){9.409}}%
  }

\def\pspcone@(#1,#2)#3(#4)#5#6{%
  % Trace un cône de révolution en perspective cavalière 30°/0.7,
  % de centre, rayon et hauteur donnés, dont la base est sur un plan horizontal.
  % La commande étoilée trace un cône dont la base est sur la face droite d'un
  % cube.
  % (#4): coordonnées du centre du cône
  % #5: rayon de la base
  % #6: hauteur du cône
  \pst@@getcoor{#4}
  % déplace le cône de centre (0,0) sur le centre choisi :
  \rput[Br](!\pst@coor /YA exch \pst@number\psyunit div def /XA exch %
             \pst@number\psxunit div def XA YA){%
    %rotation de la perspective pour qu'elle s'inscrive dans des faces de cubes
    \rotatebox[x=0cm,y=0cm]{#3}{%
      %grand rayon, petit rayon
      \pstVerb{/PYROGR #1 #5 mul def /PYROPR #2 #5 mul def}%
      %hauteur verticale sinon hauteur horizontale :
      \ifdim #3pt=9.409pt\pnode(!#3 sin #6 mul #3 cos #6 mul){sommet}%
      \else\pnode(!#3 cos #6 mul #3 sin neg #6 mul){sommet}\fi%
      \psEllipseTangents(0,0)(!PYROGR PYROPR)(sommet)%
      %si hauteur positive, alors pointillés sur la base du cône :
      \ifdim #6cm<0cm\def\LS{solid}\else\def\LS{dashed}\fi
      \psellipticarc(0,0)(!PYROGR PYROPR){(EllipseT1)}{(EllipseT2)}%
      \psellipticarc[linestyle=\LS](0,0)(!PYROGR PYROPR){(EllipseT2)}{(EllipseT1)}%
      \psline[](EllipseT2)(sommet)(EllipseT1)%
      }%
    }%
  }

\newcommand*{\pspSphere}{%
  \@ifstar{\pspsphere@(1.0855,0.5585){75.324}}%
          {\pspsphere@(1.1842,0.2955){9.409}}%
  }

\def\pspsphere@(#1,#2)#3(#4)#5{%
  % Trace une sphère en perspective cavalière 30°/0.7, de centre et rayon
  % donnés, dont la base est sur un plan horizontal.
  % La commande étoilée trace une sphère dont la base est sur la face droite
  % d'un cube.
  % (#4): coordonnées du centre de la sphère
  % #5: rayon de la sphère
  \pst@@getcoor{#4}
  % déplace la sphère de centre (0,0) sur le centre choisi :
  \rput[Br](!\pst@coor /YA exch \pst@number\psyunit div def /XA exch %
             \pst@number\psxunit div def XA YA){%
    %rotation de la perspective pour qu'elle s'inscrive dans des faces de cubes
    \rotatebox[x=0cm,y=0cm]{#3}{%
      %grand rayon, petit rayon
      \pstVerb{/PYROGR #1 #5 mul def /PYROPR #2 #5 mul def}%
      %gestion des pointillés selon l'orientation du grand cercle :
      \ifdim #3pt=9.409pt\def\LI{solid}\def\LII{dashed}\else\def\LI{dashed}\def\LII{solid}\fi%
      \psellipticarc[linestyle=\LI](0,0)(!PYROGR PYROPR){180}{360}%
      \psellipticarc[linestyle=\LII](0,0)(!PYROGR PYROPR){0}{180}%
      \pscircle{!#1 #5 mul}%
      }%
    }%
  }

\def\pspPave(#1)#2#3#4{%
  % Trace un pavé droit en perspective cavalière 30°/0.7.
  % (#1): position du sommet inférieur droit de la face avant
  % #2: largeur
  % #3: profondeur
  % #4: hauteur
  \pst@@getcoor{#1}
  % déplace le pavé sur le point choisi :
  \rput[Br](!\pst@coor /YA exch \pst@number\psyunit div def /XA exch %
             \pst@number\psxunit div def XA YA){%
    \pnode(0,0){PA}%
    \pnode(#2,0){PB}%
    \pnode(!0.7 #3 mul 30 cos mul 0.7 #3 mul 30 sin mul){PD}%
    \pnode(!0.7 #3 mul 30 cos mul #2 add 0.7 #3 mul 30 sin mul){PC}%
    \pnode([offset=#4]PA){PE}%
    \pnode([offset=#4]PB){PF}%
    \pnode([offset=#4]PC){PG}%
    \pnode([offset=#4]PD){PH}%
    \pspolygon(PA)(PB)(PC)(PG)(PH)(PE)%
    \psline(PE)(PF)(PB)%
    \psline(PG)(PF)%
    \psline[linestyle=dashed](PC)(PD)(PA)%
    \psline[linestyle=dashed](PH)(PD)%
    }%
  }
\makeatother
La question est : que pourrions nous faire de cela dans Pyromaths ?

Re: Solides

Publié : 23 mai 2012, 01:19
par Arnaud
T'essayes par là de nous dire qu'il manque des exos de géométrie dans l'espace dans pyromaths ? :mrgreen:

L'information est là, on verra avec celui ou celle qui se lancera le premier là-dedans.
Tu peux déjà commencer par intégrer ces commandes dans le git.

Perso, je pars en vacances samedi, donc vous aurez peu de nouvelles pendant les deux prochaines semaines.

Re: Solides

Publié : 23 mai 2012, 09:36
par Jérôme
Bonnes vacances alors ! :)
J'essaie plutôt de dire : "qui se chargerait de faire des exos de géométrie dans l'espace maintenant qu'on a ces outils ?". ;)
Les publier sur le git ? Oui. Ça fait tellement longtemps que je ne suis pas certain de me souvenir comment faire... :? En faisant un petit effort, je devrais trouver.

Re: Solides

Publié : 23 mai 2012, 10:03
par Arnaud

Re: Solides

Publié : 23 mai 2012, 12:10
par Jérôme
Très bien. Je crois que tu as mon adresse postale :mrgreen:

Re: Solides

Publié : 23 mai 2012, 19:44
par Jérôme

Code : Tout sélectionner

jerome@jerome-P5K:~/Documents/projets/pyromaths$ git pull
Le programme 'git' n'est pas encore installé.  Vous pouvez l'installer en tapant :
sudo apt-get install git
Ah oui, quand même...

Re: Solides

Publié : 23 mai 2012, 23:06
par Arnaud
Ha ben c'est du joli...

Re: Solides

Publié : 11 juin 2012, 21:03
par guicel
D'ici peu je vais pouvoir y réfléchir...

C'est un gros boulot que tu as fait là.

Je suis un peu gêné par la représentation du cylindre et de la sphère.
L'angle de 30° pour la base et le grand cercle m'est peu familier.
J'ai peur que cela dérange les élèves.

Cela peut-il être paramétrable ?

Je verrais bien un exo de représentation de section en 3e

J'ai hâte de trouver le temps de m'y mettre.
A bientôt

Guillaume

Re: Solides

Publié : 11 juin 2012, 22:27
par Jérôme
Salut Guillaume,
merci pour tes commentaires. Concernant la gêne occasionnée par les représentations de la sphère et du cylindre, elle est pour tes élèves ou pour toi ? ;)
Je trouve cela pratique, car cela permet de "poser" un cylindre sur un cube par exemple. J'imagine donc que cette représentation est correcte (mais ne suis pas expert en la matière).
En effet, un exo de sections serait le bienvenu. Je n'ai rien fait pour la pyramide encore, car je ne sais pas quoi mettre comme paramètre de ma fonction pspPyramide. Si vous avez des idées, je suis preneur.

Re: Solides

Publié : 12 juin 2012, 08:53
par guicel
peut être plus moi que mes élèves. Ce qui m'inquiète davantage :)

Le souci c'est que le cylindre ne semble pas être un cylindre de révoution.

Je vais faire un sondage chez mes collègues.

Guillaume

Re: Solides

Publié : 26 mai 2013, 19:07
par Jérôme
Salut Guillaume,
tu ne m'as jamais donné le résultat du sondage auprès de tes collègues :)