/CubeDict 100 dict def CubeDict begin /CUBE { %% 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 % 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 /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 H_S CosCouleur sethsbcolor 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 ED /Y1 ED /X1 ED %% 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 ED /Y2 ED /X2 ED %% 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 ED /Y3 ED /X3 ED %% 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 % les vecteurs de la face % /V1x X2 X1 sub def % /V1y Y2 Y1 sub def % /V1z Z2 Z1 sub def % /V2x X3 X2 sub def % /V2y Y3 Y2 sub def % /V2z Z3 Z2 sub def % le produit vectoriel % /xN V1y V2z mul V1z V2y mul sub def % /yN V1x V2z mul V1z V2x mul sub neg def % /zN V1x V2y mul V1y V2x mul 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 } def end