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].
Les fichiers sont dans le dossier :
Dans le cas du cylindre, pour simplifier il faut donner au départ le rayon et la hauteur du cylindre.
 Dans le cas d’une sphère, le contour est celui du grand cercle de rayon celui de la sphère.
Dans le cas du cône, on donne aussi le rayon et la hauteur.


Le listing, à compiler par :  LaTeX->dvips->ps2pdf

\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 - 19 juillet 2017}
\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 le cas du cylindre, pour simplifier il faut donner au départ le rayon et la hauteur du cylindre.
\begin{center}
\begin{pspicture}(-5,-4)(5,5)
\psframe(-5,-4)(5,5)
\pstVerb{/hauteur 5 def /rayon 3 def /alpha {rayon Dobs PHI cos mul div arccos } def
/jaunepale {0 0 0.25 0 setcmykcolor} def}%
\psset{viewpoint=15 50 50 rtp2xyz,Decran=10,lightsrc=50 30 27 rtp2xyz,solidmemory}
\psSolid[object=grille,base=-4 4 -4 4]%
\psSolid[object=plan,definition=normalpoint,args={0 0 0 [0 0 1]},
         action=none,
         base=-4 4 -4 4,
         name=monplan0]%
\psset{plan=monplan0}%
\psProjection[object=cercle,
              args=0 0 rayon]%
\composeSolid
\psSolid[object=cylindre,hollow,
        h=hauteur,r=rayon,grid,
        hue=0 1,incolor=yellow!10,
        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=THETA alpha sub THETA alpha add]
\psPoint(rayon THETA alpha sub cos mul,
         rayon THETA alpha sub sin mul,0){A}
\psPoint(rayon THETA alpha sub cos mul,
         rayon THETA alpha sub sin mul,hauteur){B}
\psline[linewidth=0.05](A)(B)
\psPoint(rayon THETA alpha add cos mul,
         rayon THETA alpha add sin mul,0){C}
\psPoint(rayon THETA alpha add cos mul,
         rayon THETA alpha add sin mul,hauteur){D}
\psline[linewidth=0.05](C)(D)
\end{pspicture}
\end{center}

Dans le cas d'une sphère, le contour est celui du grand cercle de rayon celui de la sphère.
\begin{center}
\begin{pspicture}(-5,-5)(5,3)
\psframe(-5,-5)(5,3)
\pstVerb{/rayon 2.5 def /pointVue {20 50 30 rtp2xyz} def
/jaunepale {0 0 0.25 0 setcmykcolor} def}%
\psset{viewpoint=pointVue,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}

Dans le cas du cône, on donne aussi le rayon et la hauteur.
\begin{center}
\begin{pspicture}(-5,-3)(5,5)
\psframe(-5,-3)(5,5)
\pstVerb{/hauteur 5 def /rayon 3 def }
\psset{viewpoint=20 50 30 rtp2xyz,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 THETA add 90 THETA add]
\psPoint(THETA sin rayon mul,THETA cos rayon mul neg,0){A}
\psPoint(0,0,hauteur){H}
\psPoint(THETA sin rayon mul neg,THETA cos rayon mul,0){B}
\psline[linewidth=0.05](B)(H)(A)
\end{pspicture}
\end{center}
%\newpage
\begin{center}
\begin{pspicture}(-5,-4)(5,5)
\psframe(-5,-4)(5,5)
\pstVerb{/hauteur 5 def /rayon 3 def /alpha {rayon Dobs PHI cos mul div arccos } def
/jaunepale {0 0 0.25 0 setcmykcolor} def}%
\psset{viewpoint=15 50 50 rtp2xyz,Decran=10,lightsrc=50 30 27 rtp2xyz,solidmemory}
\psSolid[object=grille,base=-4 4 -4 4]%
\psSolid[object=plan,definition=normalpoint,args={0 0 0 [0 0 1]},
         action=none,
         base=-4 4 -4 4,
         name=monplan0]%
\psset{plan=monplan0}%
\psProjection[object=cercle,
              args=0 0 rayon]%
\composeSolid
\psSolid[object=cylindre,hollow,
        h=hauteur,r=rayon,grid,
        fillcolor=white,incolor=yellow!10,
        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=THETA alpha sub THETA alpha add]
\psPoint(rayon THETA alpha sub cos mul,
         rayon THETA alpha sub sin mul,0){A}
\psPoint(rayon THETA alpha sub cos mul,
         rayon THETA alpha sub sin mul,hauteur){B}
\psline[linewidth=0.05](A)(B)
\psPoint(rayon THETA alpha add cos mul,
         rayon THETA alpha add sin mul,0){C}
\psPoint(rayon THETA alpha add cos mul,
         rayon THETA alpha add sin mul,hauteur){D}
\psline[linewidth=0.05](C)(D)
\end{pspicture}
\end{center}
\begin{center}
\begin{pspicture}(-5,-5)(5,3)
\psframe*(-5,-5)(5,3)
\pstVerb{/rayon 2.5 def /pointVue {20 50 30 rtp2xyz} def
/jaunepale {0 0 0.25 0 setcmykcolor} def}%
\psset{viewpoint=pointVue,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=white,
        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,resolution=360,
              args=0 0 rayon]%
\composeSolid%
\end{pspicture}
\end{center}
\begin{center}
\begin{pspicture}(-5,-3)(5,5)
\psframe*(-5,-3)(5,5)
\pstVerb{/hauteur 5 def /rayon 3 def }
\psset{viewpoint=20 50 30 rtp2xyz,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,
         fillcolor=white,
        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 THETA add 90 THETA add]
\psPoint(THETA sin rayon mul,THETA cos rayon mul neg,0){A}
\psPoint(0,0,hauteur){H}
\psPoint(THETA sin rayon mul neg,THETA cos rayon mul,0){B}
\psline[linewidth=0.05](B)(H)(A)
\end{pspicture}
\end{center}
\end{document}



Aucun commentaire:

Enregistrer un commentaire