% version 01 : 7 août 2006 10 h 00 /CUBE { 100 dict begin /Normal .setblendmode transparence .setshapealpha %% le calcul des sommets du cube /m 3 def % nombre d'arêtes sur un sommet /n 4 def % nombre de côtés de chaque face %% les sommets %% abscisses /x1 {A 2 div} bind def /x2 {x1 neg} bind def /x3 x2 def /x4 x1 def /x5 x1 def /x6 x2 def /x7 x2 def /x8 x1 def %% ordonnées /y1 {B 2 div} bind def /y2 y1 def /y3 {y1 neg} bind def /y4 y3 def /y5 y1 def /y6 y1 def /y7 y3 def /y8 y3 def %% les cotes /z1 {C 2 div} bind def /z2 z1 def /z3 z1 def /z4 z1 def /z5 {z1 neg} bind def /z6 z5 def /z7 z5 def /z8 z5 def %% les sommets : 8 sommets = 24 coordonnées /S [x1 y1 z1 % 0->2 x2 y2 z2 % 3->5 x3 y3 z3 % 6->8 x4 y4 z4 % 9->11 x5 y5 z5 % 12->14 x6 y6 z6 % 15->17 x7 y7 z7 % 18->20 x8 y8 z8 % 21->23 ] def %% les 6 faces %% tableau des faces /FacesCube [ % No 1 2 3 4 % 0 1 5 6 2 % 1 2 3 7 6 % 2 3 4 8 7 % 3 1 4 8 5 % 4 5 6 7 8 % 5 ] def %% indice des autres sommets voisins de chaque sommet /co [ 2 4 5 % voisins du sommet 1 1 3 6 % " de 2 2 4 7 % " de 3 1 3 8 % " de 4 1 6 8 % " de 5 2 5 7 % " de 6 3 6 8 % " de 7 4 5 7 % " de 8 ] def %% dessin du cube tronqué %% paramètre pour tronquer %% de différentes façons le cube %% 2 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 /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 closepath } def condition { facette j 0 eq {ColorFace1 setrgbcolor} if j 1 eq {ColorFace3 setrgbcolor} if j 2 eq {ColorFace5 setrgbcolor} if j 3 eq {ColorFace6 setrgbcolor} if j 4 eq {ColorFace2 setrgbcolor} if j 5 eq {ColorFace4 setrgbcolor} if fill facette Trace_arete } if /j j 1 add def } for 0 3 FT length 3 sub { % le dessin des triangles /i exch def FT i get 1 sub 3 mul /k exch def SCT k get /Xpoint exch def SCT k 1 add get /Ypoint exch def SCT 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 SCT k get /Xpoint exch def SCT k 1 add get /Ypoint exch def SCT 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 SCT k get /Xpoint exch def SCT k 1 add get /Ypoint exch def SCT 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 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 ColorFacette setrgbcolor fill Trace_arete } if } for end} def