\documentclass{article} \usepackage{pst-solides3d} \usepackage[latin1]{inputenc} \usepackage[T1]{fontenc} \usepackage[a4paper]{geometry} \usepackage{showexpl} \usepackage{url} %\usepackage[colorlinks=true]{hyperref} \usepackage[french]{babel} \newcommand\Cadre[1]{\psframebox[fillstyle=solid,fillcolor=yellow,linecolor={[cmyk]{0,0,1,0.1}}]{\texttt{#1}}} \makeatletter \define@key[psset]{pst-solides3d}{levelrecursion}{\def\pst@solides@levelrecursion{#1}} % \psset[pst-solides3d]{levelrecursion=0} % niveau de récursion % polyedre par defaut % 0->tetrahedron 1->octahedron 2->icosahedron \def\pst@@tetrahedron{tetrahedron} \def\pst@@octahedron{octahedron} \def\pst@@icosahedron{icosahedron} % \define@key[psset]{pst-solides3d}{polyhedron}{% \def\pst@tempA{#1}% \edef\psk@polyhedron{% \ifx\pst@@tetrahedron\pst@tempA 0 \else % tetrahedron \ifx\pst@@octahedron\pst@tempA 1 \else % octahedron \ifx\pst@@icosahedron\pst@tempA 2 \else 1 % icosahedron \@pstrickserr{pst-solides3d: unknown polyhedron -> #1, using type "octahedron" instead.}% \fi\fi\fi% }} \psset[pst-solides3d]{polyhedron=octahedron}% \def\psgeode{\pst@object{psgeode}} \def\psgeode@i{\@ifnextchar({\psgeode@ii}{\psgeode@ii(0,0,0)}} \def\psgeode@ii(#1,#2,#3){% \pst@killglue% \begingroup% \use@par% \pstVerb{% /levelrecursion \pst@solides@levelrecursion\space def /Radius \pst@solides@R\space def}% \ifcase\psk@polyhedron% \pstVerb{% /polyhedron{ % les coordonnées des 4 sommets du tétraèdre /S0 [ 0 0 1 -0.4714045 -0.8164965 -0.3333 0.942809 0 -0.3333 -0.4714045 0.8164965 -0.3333 ] def % les quatre faces du tétraèdre /F0 [ [0 1 2] [0 2 3] [0 3 1] [1 3 2] ] def } def}\or\pstVerb{% /polyhedron{ % les coordonnées des 6 sommets de l'octaèdre /S0 [0 0 1 1 0 0 0 1 0 -1 0 0 0 -1 0 0 0 -1 ] def % les 8 faces de l'octaèdre /F0 [ [1 5 2] [2 5 3] [3 5 4] [4 5 1] [1 0 4] [4 0 3] [3 0 2] [2 0 1] ] def } def }% \or\pstVerb{% /polyhedron{ % les coordonnées des 12 sommets de l'icosaèdre /Xi 0.52573111212 def /Zi 0.85065080835 def /S0 [Xi neg 0 Zi % 1 Xi 0 Zi % 2 Xi neg 0 Zi neg % 3 Xi 0 Zi neg % 4 0 Zi Xi % 5 0 Zi Xi neg % 6 0 Zi neg Xi % 7 0 Zi neg Xi neg % 8 Zi Xi 0 % 9 Zi neg Xi 0 % 10 Zi Xi neg 0 % 11 Zi neg Xi neg 0 % 12 ] def % les 20 faces de l'icosaèdre /F0 [ [0 4 1] [0 9 4] [9 5 4] [4 5 8] [4 8 1] [8 10 1] [8 3 10] [5 3 8] [5 2 3] [2 7 3] [7 10 3] [7 6 10] [7 11 6] [11 0 6] [0 1 6] [6 1 10] [9 0 11] [9 11 2] [9 2 5] [7 2 11] ] def } def }\fi% \codejps{ /geode { polyhedron 0 1 levelrecursion { /Ft [] def /St [] def /iF 0 def % Sortir les faces une à une 0 1 F0 length 1 sub { /i exch def /Fi F0 i get def /I {Fi 0 get 3 mul} bind def % 1er sommet de la face i % les coordonnées du sommet 0 /x0 S0 I get def /y0 S0 I 1 add get def /z0 S0 I 2 add get def /I {Fi 1 get 3 mul} bind def % 2eme sommet de la face i % les coordonnées du sommet 1 /x1 S0 I get def /y1 S0 I 1 add get def /z1 S0 I 2 add get def /I {Fi 2 get 3 mul} bind def % 3eme sommet de la face i % les coordonnées du sommet 2 /x2 S0 I get def /y2 S0 I 1 add get def /z2 S0 I 2 add get def % norme des vecteurs /N12 {x2 x1 add dup mul y2 y1 add dup mul z2 z1 add dup mul add add sqrt} bind def /N01 {x0 x1 add dup mul y0 y1 add dup mul z0 z1 add dup mul add add sqrt} bind def /N02 {x2 x0 add dup mul y2 y0 add dup mul z2 z0 add dup mul add add sqrt} bind def % les coordonnées des milieux des côtés /X0 x1 x2 add N12 div def /Y0 y1 y2 add N12 div def /Z0 z1 z2 add N12 div def /X1 x0 x2 add N02 div def /Y1 y0 y2 add N02 div def /Z1 z0 z2 add N02 div def /X2 x0 x1 add N01 div def /Y2 y0 y1 add N01 div def /Z2 z0 z1 add N01 div def % On en déduit les nouveaux sommets /S1 [St aload pop x0 y0 z0 x1 y1 z1 x2 y2 z2 X0 Y0 Z0 X1 Y1 Z1 X2 Y2 Z2] def /St S1 def /F [Ft aload pop [0 iF add 5 iF add 4 iF add] [1 iF add 3 iF add 5 iF add] [2 iF add 4 iF add 3 iF add] [3 iF add 4 iF add 5 iF add] ] def /Ft F def /iF iF 6 add def } for /S0 S1 def /F0 F def } for /S [ 0 1 S1 length 1 sub {/vTemp exch def S1 vTemp get Radius mul} for ] def S F generesolid RotX 0 ne RotY 0 ne or RotZ 0 ne or { dup {RotX RotY RotZ rotateOpoint3d} solidtransform } if #1 0 ne #2 0 ne or #3 0 ne or { dup {#1 #2 #3 translatepoint3d} solidtransform } if solidhue length 0 gt { dup solidhue solidputhuecolors } { dup (fillcolor) outputcolors } ifelse } def geode drawsolid**}% \endgroup% \ignorespaces% } \makeatother \title{pst-geode : une extension de pst-solides3d} \date{25 décembre 2\,007} \begin{document} \maketitle \begin{abstract} \texttt{pst-geode} est une commande dérivée du package \texttt{pst-solides3d}. Elle permet d'obtenir une représentation de la \texttt{géode} par la méthode décrite dans l'article \textit{Indexing the Sphere with the Hierarchical Triangular Mesh} : \centerline{\url{http://research.microsoft.com/research/pubs/view.aspx?msr_tr_id=MSR-TR-2005-123}} Outre les options du package \texttt{pst-solides3d}, les paramètres acceptés par la commande \Cadre{\texttt{\textbackslash psgeode[R=rayon, levelrecursion=0 1 2\ldots](x0,y0,z0)}} sont le rayon de la sphère et le niveau de récursion qui doit être un nombre entier. Précisons que le temps de calcul croît exponentiellement avec la valeur du niveau. Dans la méthode utilisée le polyèdre de départ par défaut est l'octaèdre, mais il est possible d'envisager un autre polyèdre comme point de départ : tétraèdre, icosaèdre avec l'option : \Cadre{\texttt{polyhedron=tetraehedron}} ou \Cadre{\texttt{polyhedron=icosahedron}}. Des renseignements très intéressants sur les géodes et leurs duales sont disponibles sur : \centerline{\url{http://fr.wikipedia.org/wiki/G\%C3\%A9ode}} \end{abstract} \begin{LTXexample}[pos=t] \begin{pspicture}(-3,-3)(3,3) \psframe*[linecolor=blue!30](-3,-3)(3,3) \psset{viewpoint=25 80 10,SphericalCoor,Decran=25,lightsrc=4 25 4} \psgeode[R=2,levelrecursion=0,hue=0 1 0.5 1,polyhedron=icosahedron]% \end{pspicture} \begin{pspicture}(-3,-3)(3,3) \psframe*[linecolor=blue!30](-3,-3)(3,3) \psset{viewpoint=25 80 10,SphericalCoor,Decran=25,lightsrc=4 25 4} \psgeode[R=2,levelrecursion=1,hue=0 1 0.5 1,polyhedron=icosahedron]% \end{pspicture} \end{LTXexample} \begin{LTXexample}[pos=t] \begin{pspicture}(-3,-3)(3,3) \psframe*[linecolor=blue!30](-3,-3)(3,3) \psset{viewpoint=25 80 10,SphericalCoor,Decran=25,lightsrc=4 25 4} \psgeode[R=3,levelrecursion=2,hue=0 1 0.5 1,polyhedron=icosahedron]% \end{pspicture} \begin{pspicture}(-3,-3)(3,3) \psframe*[linecolor=blue!30](-3,-3)(3,3) \psset{viewpoint=25 10 10,SphericalCoor,Decran=25,lightsrc=12 5 5} \psgeode[R=3,levelrecursion=2,hue=0 1 0.4 1,polyhedron=icosahedron,grid]% \end{pspicture} \end{LTXexample} \begin{LTXexample}[pos=t] \begin{pspicture}(-3,-3)(3,3) \psframe*[linecolor=blue!30](-3,-3)(3,3) \psset{viewpoint=25 10 10,SphericalCoor,Decran=25,lightsrc=12 5 5} \psgeode[R=2,levelrecursion=0,fillcolor=blue!50]% \end{pspicture} \begin{pspicture}(-3,-3)(3,3) \psframe*[linecolor=blue!30](-3,-3)(3,3) \psset{viewpoint=25 10 10,SphericalCoor,Decran=25,lightsrc=12 5 5} \psgeode[R=2,levelrecursion=1,fillcolor=yellow!50,linecolor={[cmyk]{1,0,1,0.5}},linewidth=0.75\pslinewidth]% \end{pspicture} \end{LTXexample} \begin{LTXexample}[pos=t] \begin{pspicture}(-3,-3)(3,3) \psframe*[linecolor=blue!30](-3,-3)(3,3) \psset{viewpoint=25 10 10,SphericalCoor,Decran=25,lightsrc=12 5 5,linewidth=0.5\pslinewidth} \psgeode[R=3,levelrecursion=2,fillcolor=blue!50]% \end{pspicture} \begin{pspicture}(-3,-3)(3,3) \psframe*[linecolor=blue!30](-3,-3)(3,3) \psset{viewpoint=25 10 10,SphericalCoor,Decran=25,lightsrc=12 5 10,linewidth=0.5\pslinewidth} \psgeode[R=3,levelrecursion=3,linewidth=0.5\pslinewidth]% \end{pspicture} \end{LTXexample} \begin{LTXexample}[pos=t] \begin{pspicture}(-3,-3)(3,3) \psframe*[linecolor=green!50](-3,-3)(3,3) \psset{viewpoint=25 10 75,SphericalCoor,Decran=25,lightsrc=5 1.25 25,linewidth=0.5\pslinewidth} \psgeode[R=3,levelrecursion=2,fillcolor=yellow!50,polyhedron=tetrahedron,linecolor={[cmyk]{1,0,1,0.5}}]% \end{pspicture} \begin{pspicture}(-3,-3)(3,3) \psframe*[linecolor=green!50](-3,-3)(3,3) \psset{viewpoint=25 10 75,SphericalCoor,Decran=25,lightsrc=1.25 5 12 ,linewidth=0.5\pslinewidth} \psgeode[R=3,levelrecursion=3,linecolor={[cmyk]{1,0,1,0.5}},hue=0 1 0.7 1,polyhedron=tetrahedron]% \end{pspicture} \end{LTXexample} \end{document}