% Dodecahedron : 31 décembre 2003 % datas : Graphisme scientifique R.Dony % Masson ed. page 240 /DodecahedronDict 100 dict def DodecahedronDict begin /Dodecahedron { 100 dict begin /dd {d 1 sub} bind def /m 3 def % nombre d'arêtes sur un sommet /n 5 def % nombre de côtés de chaque face % les sommets si R=1 /S1 [ 0 0.607062 0.7946545 -0.5773503 0.1875925 0.7946545 -0.3568221 -0.4911235 0.7946545 0.3568221 -0.4911235 0.7946545 0.5773503 0.1875925 0.7946545 0 0.982247 0.1875925 -0.9341724 0.303531 0.1875925 -0.5773503 -0.7946645 0.1875925 0.5773503 -0.7946645 0.1875925 0.9341724 0.303531 0.1875925 0 -0.982247 -0.1875925 0.9341724 -0.303531 -0.1875925 0.5773503 0.7946545 -0.1875925 -0.5773503 0.7946545 -0.1875925 -0.9341724 -0.303531 -0.1875925 -0.5773503 -0.1875925 -0.7946545 -0.3568221 0.4911235 -0.7946545 0.3568221 0.4911235 -0.7946545 0.5773503 -0.1875925 -0.7946545 0 -0.607062 -0.7946545 ] def % en tenant compte du rayon /S [ 0 1 S1 length 1 sub {% /i exch def S1 i get radius mul } for ] def % Les faces repérées par les No des sommets /F [ 1 2 3 4 5 5 4 9 12 10 5 10 13 6 1 1 6 14 7 2 2 7 15 8 3 3 8 11 9 4 11 20 19 12 9 12 19 18 13 10 13 18 17 14 6 14 17 16 15 7 15 16 20 11 8 16 17 18 19 20 ] def %% indice des autres sommets voisins de chaque sommet /co [ 2 5 6 % voisins du sommet 1 1 7 3 % " de 2 2 8 4 % " de 3 3 9 5 % " de 4 1 4 10 % " de 5 1 13 14 % " de 6 2 14 15 % " de 7 3 15 11 % " de 8 4 11 12 % " de 9 5 12 13 % " de 10 8 20 9 % " de 11 9 19 10 % " de 12 6 10 18 % " de 13 6 17 7 % " de 14 7 16 8 % " de 15 15 17 20 % " de 16 16 14 18 % " de 17 13 19 17 % " de 18 12 20 18 % " de 19 19 11 16 % " de 20 ] def /i 0 def /SDT [ % les coordonnées des sommets du % dodéacèdre tronqué 0 m co length m sub { /j exch def S i get /xt1 exch def S i 1 add get /yt1 exch def S i 2 add get /zt1 exch def % sommet 1 co j get 1 sub 3 mul /k exch def S k get /xt2 exch def xt1 dd mul xt2 add d div % S k 1 add get /yt2 exch def yt1 dd mul yt2 add d div % S k 2 add get /zt2 exch def zt1 dd mul zt2 add d div % sommet 2 co j 1 add get 1 sub 3 mul /k exch def S k get /xt2 exch def xt1 dd mul xt2 add d div % S k 1 add get /yt2 exch def yt1 dd mul yt2 add d div % S k 2 add get /zt2 exch def zt1 dd mul zt2 add d div % sommet 3 co j 2 add get 1 sub 3 mul /k exch def S k get /xt2 exch def xt1 dd mul xt2 add d div % S k 1 add get /yt2 exch def yt1 dd mul yt2 add d div % S k 2 add get /zt2 exch def zt1 dd mul zt2 add d div /i i 3 add def } for ] def /FT [ % 20 triangles 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 ] def /FD [ % 12 décagones 1 4 6 7 9 10 12 14 13 2 % 1 2 13 15 28 30 38 37 17 16 3 % 2 12 11 25 27 34 36 29 28 15 14 % 3 9 8 22 24 31 33 26 25 11 10 % 4 26 33 32 59 58 56 55 35 34 27 % 5 36 35 55 57 53 52 39 38 30 29 % 6 5 6 7 8 22 23 45 43 21 19 % 7 1 4 5 19 20 42 40 18 16 3 % 8 23 24 31 32 59 60 48 46 44 45 % 9 20 21 43 44 46 47 49 50 41 42 %10 17 18 40 41 50 51 54 52 39 37 %11 60 58 56 57 53 54 51 49 47 48 %12 ] def % 0 3 FT length 3 sub { % le dessin des triangles /i exch def FT i get 1 sub 3 mul /k exch def SDT k get /Xpoint exch def SDT k 1 add get /Ypoint exch def SDT k 2 add get /Zpoint exch def PointsApresTransformations /Z1 exch def /Y1 exch def /X1 exch def %% FT i 1 add get 1 sub 3 mul /k exch def SDT k get /Xpoint exch def SDT k 1 add get /Ypoint exch def SDT k 2 add get /Zpoint exch def PointsApresTransformations /Z2 exch def /Y2 exch def /X2 exch def %% FT i 2 add get 1 sub 3 mul /k exch def SDT k get /Xpoint exch def SDT k 1 add get /Ypoint exch def SDT k 2 add get /Zpoint exch def PointsApresTransformations /Z3 exch def /Y3 exch def /X3 exch def %% centre de la face /xF {X1 X2 add X3 add 3 div} bind def /yF {Y1 Y2 Y3 add add 3 div} bind def /zF {Z1 Z2 Z3 add add 3 div} bind def %% vecteur : centre de la face -> point de vue /xV {XpointVue xF sub } bind def /yV {YpointVue yF sub } bind def /zV {ZpointVue zF sub } bind def %% normale /xN xF CX sub def /yN yF CY sub def /zN zF CZ sub def % le produit scalaire des 2 vecteurs /PSfacette xV xN mul yV yN mul add zV zN mul add def % vecteur centre de la facette vers la source de lumière /VxLight xLight xF sub def /VyLight yLight yF sub def /VzLight zLight zF sub def % norme /normeL VxLight dup mul VyLight dup mul VzLight dup mul add add sqrt def % produit scalaire /PSLight VxLight xN mul VyLight yN mul add VzLight zN mul add def /normeN xN dup mul yN dup mul zN dup mul add add sqrt def /CosCouleur PSLight normeL normeN mul div def condition { /facette { newpath % tracé de la facette X1 Y1 Z1 3dto2d moveto X2 Y2 Z2 3dto2d lineto X3 Y3 Z3 3dto2d lineto closepath } def facette H_S CosCouleur sethsbcolor fill Trace_arete } if } for H_S /b ED /h ED /H_S {h 2 div b} def 0 10 FD length 10 sub { % le dessin des décagones /i exch def FD i get 1 sub 3 mul /k exch def SDT k get /Xpoint exch def SDT k 1 add get /Ypoint exch def SDT k 2 add get /Zpoint exch def PointsApresTransformations /Z1 exch def /Y1 exch def /X1 exch def %% FD i 1 add get 1 sub 3 mul /k exch def SDT k get /Xpoint exch def SDT k 1 add get /Ypoint exch def SDT k 2 add get /Zpoint exch def PointsApresTransformations /Z2 exch def /Y2 exch def /X2 exch def %% FD i 2 add get 1 sub 3 mul /k exch def SDT k get /Xpoint exch def SDT k 1 add get /Ypoint exch def SDT k 2 add get /Zpoint exch def PointsApresTransformations /Z3 exch def /Y3 exch def /X3 exch def %% FD i 3 add get 1 sub 3 mul /k exch def SDT k get /Xpoint exch def SDT k 1 add get /Ypoint exch def SDT k 2 add get /Zpoint exch def PointsApresTransformations /Z4 exch def /Y4 exch def /X4 exch def %% FD i 4 add get 1 sub 3 mul /k exch def SDT k get /Xpoint exch def SDT k 1 add get /Ypoint exch def SDT k 2 add get /Zpoint exch def PointsApresTransformations /Z5 exch def /Y5 exch def /X5 exch def %% FD i 5 add get 1 sub 3 mul /k exch def SDT k get /Xpoint exch def SDT k 1 add get /Ypoint exch def SDT k 2 add get /Zpoint exch def PointsApresTransformations /Z6 exch def /Y6 exch def /X6 exch def %% FD i 6 add get 1 sub 3 mul /k exch def SDT k get /Xpoint exch def SDT k 1 add get /Ypoint exch def SDT k 2 add get /Zpoint exch def PointsApresTransformations /Z7 exch def /Y7 exch def /X7 exch def %% FD i 7 add get 1 sub 3 mul /k exch def SDT k get /Xpoint exch def SDT k 1 add get /Ypoint exch def SDT k 2 add get /Zpoint exch def PointsApresTransformations /Z8 exch def /Y8 exch def /X8 exch def %% FD i 8 add get 1 sub 3 mul /k exch def SDT k get /Xpoint exch def SDT k 1 add get /Ypoint exch def SDT k 2 add get /Zpoint exch def PointsApresTransformations /Z9 exch def /Y9 exch def /X9 exch def %% FD i 9 add get 1 sub 3 mul /k exch def SDT k get /Xpoint exch def SDT k 1 add get /Ypoint exch def SDT k 2 add get /Zpoint exch def PointsApresTransformations /Z10 exch def /Y10 exch def /X10 exch def %% centre de la face /xF {X1 X2 add X3 add X4 add X5 add X6 add X7 add X8 add X9 add X10 add 10 div} bind def /yF {Y1 Y2 Y3 Y4 Y5 Y6 Y7 Y8 Y9 Y10 add add add add add add add add add 10 div} bind def /zF {Z1 Z2 Z3 Z4 Z5 Z6 Z7 Z8 Z9 Z10 add add add add add add add add add 10 div} bind def %% vecteur : centre de la face -> point de vue /xV {XpointVue xF sub } bind def /yV {YpointVue yF sub } bind def /zV {ZpointVue zF sub } bind def %% normale /xN xF CX sub def /yN yF CY sub def /zN zF CZ sub def % le produit scalaire des 2 vecteurs /PSfacette xV xN mul yV yN mul add zV zN mul add def % vecteur centre de la facette vers la source de lumière /VxLight xLight xF sub def /VyLight yLight yF sub def /VzLight zLight zF sub def % norme /normeL VxLight dup mul VyLight dup mul VzLight dup mul add add sqrt def % produit scalaire /PSLight VxLight xN mul VyLight yN mul add VzLight zN mul add def /normeN xN dup mul yN dup mul zN dup mul add add sqrt def /CosCouleur PSLight normeL normeN mul div def condition { /facette { newpath % tracé de la facette X1 Y1 Z1 3dto2d moveto X2 Y2 Z2 3dto2d lineto X3 Y3 Z3 3dto2d lineto X4 Y4 Z4 3dto2d lineto X5 Y5 Z5 3dto2d lineto X6 Y6 Z6 3dto2d lineto X7 Y7 Z7 3dto2d lineto X8 Y8 Z8 3dto2d lineto X9 Y9 Z9 3dto2d lineto X10 Y10 Z10 3dto2d lineto closepath } def facette H_S CosCouleur sethsbcolor fill Trace_arete } if } for } def end