Source PostScript (drawsolid.pps)

Retour Texte non formaté
/solidlightOn { /s@lidlight true def } def /solidlightOff { /s@lidlight false def } def solidlightOff %% syntaxe : solid i solidfacevisible? --> true si la face est visible /solidfacevisible? { 4 dict begin /i exch def /solid exch def solid issolid not { (Error : mauvais type d argument dans solidgetsommetface) == quit } if solid i solidgetface length 2 le { true } { /ligne_de_vue { solid i solidcentreface GetCamPos vecteur3d } def /normale_face { solid i solidnormaleface } def ligne_de_vue normale_face scalprod3d 0 gt } ifelse end } def %% syntaxe : solid i affectecouleursolid_facei --> si la couleur de %% la face i est definie, affecte fillstyle a cette couleur /affectecouleursolid_facei { 3 dict begin /i exch def /solid exch def solid solidgetfcolors /FC exch def FC length 1 sub i ge { FC i get length 1 ge { /fillstyle FC i get ( fill) append cvx solidgrid not { FC i get cvx exec } if true } { false } ifelse } { false } ifelse end {def} if } def %% syntaxe : solid i dessinefacecachee /dessinefacecachee { 11 dict begin /i exch def /solid exch def solid issolid not { (Error : mauvais type d argument dans dessinefacecachee) == quit } if /F solid solidgetfaces def /S solid solidgetsommets def %% face cachee => on prend chacune des aretes de la face et on %% la dessine 4 dict begin /n F i get length def %% nb de sommets de la face 0 1 n 1 sub { /k exch def /k1 F i k get_ij def %% indice sommet1 /k2 F i k 1 add n mod get_ij def %% indice sommet2 gsave currentlinewidth .5 mul setlinewidth pointilles [S k1 getp3d S k2 getp3d sortp3d] ligne3d grestore } for %% trace de la ligne de niveau solidintersectiontype 0 ge { /face_a_dessiner [ %% face visible : F [i] 0 1 n 1 sub { /j exch def solid j i solidgetsommetface } for ] def 0 1 solidintersectionplan length 1 sub { /k exch def /lignedeniveau [] def gsave pointilles k solidintersectionlinewidth length lt { solidintersectionlinewidth k get setlinewidth } { solidintersectionlinewidth 0 get setlinewidth } ifelse k solidintersectioncolor length lt { solidintersectioncolor k get cvx exec } { solidintersectioncolor 0 get cvx exec } ifelse 0 1 n 1 sub { /j exch def face_a_dessiner j getp3d face_a_dessiner j 1 add n mod getp3d solidintersectionplan k get dup isarray { segment_inter_plan } { segment_inter_planz } ifelse { 1 dict begin /table exch def table length 6 eq { /lignedeniveau table store exit } { /lignedeniveau [ lignedeniveau aload pop table 0 getp3d ] store } ifelse end } if } for %% dessin de la ligne lignedeniveau length 4 ge { [lignedeniveau aload pop sortp3d] ligne3d } if grestore } for } if end end } def %% syntaxe : solid i dessinefacevisible /dessinefacevisible { 8 dict begin /i exch def /solid exch def solid issolid not { (Error : mauvais type d argument dans dessinefacevisible) == quit } if /F solid solidgetfaces def /S solid solidgetsommets def /n F i get length def %% nb de sommets de la face startest { s@lidlight { /coeff lightintensity solid i solidnormaleface normalize3d solid i solidcentreface lightsrc vecteur3d normalize3d scalprod3d mul 0 max 1 min def /lightcolor where { pop /lacouleur lightcolor def } { /lacouleur [ gsave solid solidgetfcolors i get cvx exec currentrgbcolor grestore ] def } ifelse /fillstyle { lacouleur {coeff mul} apply setcolor fill } def solidgrid not { lacouleur {coeff mul} apply setcolor } if } { n 2 eq { 1 dict begin solidgridOff solid i affectecouleursolid_facei end } { solid i affectecouleursolid_facei } ifelse } ifelse } if /face_a_dessiner [ %% face visible : F [i] 0 1 n 1 sub { /j exch def solid j i solidgetsommetface } for ] def face_a_dessiner polygone3d %% trace de la ligne de niveau solidintersectiontype 0 ge { 0 1 solidintersectionplan length 1 sub { /k exch def /lignedeniveau [] def gsave k solidintersectionlinewidth length lt { solidintersectionlinewidth k get setlinewidth } { solidintersectionlinewidth 0 get setlinewidth } ifelse k solidintersectioncolor length lt { solidintersectioncolor k get cvx exec } { solidintersectioncolor 0 get cvx exec } ifelse 0 1 n 1 sub { /j exch def face_a_dessiner j getp3d face_a_dessiner j 1 add n mod getp3d solidintersectionplan k get dup isarray { segment_inter_plan } { segment_inter_planz } ifelse { 1 dict begin /table exch def /lignedeniveau [ lignedeniveau aload pop table 0 getp3d table length 4 ge { table 1 getp3d } if ] store end } if } for %% dessin de la ligne lignedeniveau length 4 ge { solid i solidisinface { pointilles } if lignedeniveau ligne3d } if grestore } for } if end } def /drawsolid* { 1 dict begin /startest {true} def drawsolid end } def /peintrealgorithme false def /drawsolid** { 2 dict begin /aretescachees false def /peintrealgorithme true def drawsolid* end } def %% syntaxe : solid array drawsolid %% array est en option, il indique les faces triees /drawsolid { 8 dict begin dup issolid not { /ordre exch def } if /solid exch def solid issolid not { (Error : mauvais type d argument dans drawsolid) == quit } if solid nullsolid not { solid solidgetfaces /F exch def solid solidgetsommets /S exch def /n S length 3 idiv def currentdict /ordre known not { peintrealgorithme { %% tri des indices des faces par distance decroissante [ 0 1 F length 1 sub { /i exch def solid i solidcentreface GetCamPos distance3d } for ] doublequicksort pop reverse } { [ 0 1 F length 1 sub { } for ] } ifelse /ordre exch def } if 0 1 F length 1 sub { /k exch def /i ordre k get def gsave solid i solidfacevisible? { solid i dessinefacevisible } if grestore } for aretescachees { 0 1 F length 1 sub { /k exch def /i ordre k get def gsave solid i solidfacevisible? not { solid i dessinefacecachee } if grestore } for } if %% %% si on veut repasser les traits des faces visibles %% 0 1 F length 1 sub { %% /k exch def %% /i ordre k get def %% gsave %% 1 dict begin %% /startest false def %% solid i solidfacevisible? { %% solid i dessinefacevisible %% } if %% end %% grestore %% } for } if end } def %% 27/06/08 %% /solidlightOn { %% 27/06/08 %% /s@lidlight true def %% 27/06/08 %% } def %% 27/06/08 %% /solidlightOff { %% 27/06/08 %% /s@lidlight false def %% 27/06/08 %% } def %% 27/06/08 %% solidlightOff %% 27/06/08 %% %% 27/06/08 %% %% syntaxe : solid i solidfacevisible? --> true si la face est visible %% 27/06/08 %% /solidfacevisible? { %% 27/06/08 %% 4 dict begin %% 27/06/08 %% /i exch def %% 27/06/08 %% /solid exch def %% 27/06/08 %% solid issolid not { %% 27/06/08 %% (Error : mauvais type d argument dans solidgetsommetface) == %% 27/06/08 %% quit %% 27/06/08 %% } if %% 27/06/08 %% solid i solidgetface length 2 le { %% 27/06/08 %% true %% 27/06/08 %% } { %% 27/06/08 %% /ligne_de_vue { %% 27/06/08 %% solid i solidcentreface %% 27/06/08 %% GetCamPos %% 27/06/08 %% vecteur3d %% 27/06/08 %% } def %% 27/06/08 %% %% 27/06/08 %% /normale_face { %% 27/06/08 %% solid i solidnormaleface %% 27/06/08 %% } def %% 27/06/08 %% ligne_de_vue normale_face scalprod3d 0 gt %% 27/06/08 %% } ifelse %% 27/06/08 %% end %% 27/06/08 %% } def %% 27/06/08 %% %% 27/06/08 %% %% syntaxe : solid i affectecouleursolid_facei --> si la couleur de %% 27/06/08 %% %% la face i est definie, affecte fillstyle a cette couleur %% 27/06/08 %% /affectecouleursolid_facei { %% 27/06/08 %% 3 dict begin %% 27/06/08 %% /i exch def %% 27/06/08 %% /solid exch def %% 27/06/08 %% solid solidgetfcolors /FC exch def %% 27/06/08 %% FC length 1 sub i ge { %% 27/06/08 %% FC i get length 1 ge { %% 27/06/08 %% /fillstyle FC i get ( fill) append cvx %% 27/06/08 %% solidgrid not { %% 27/06/08 %% FC i get cvx exec %% 27/06/08 %% } if %% 27/06/08 %% true %% 27/06/08 %% } { %% 27/06/08 %% false %% 27/06/08 %% } ifelse %% 27/06/08 %% } { %% 27/06/08 %% false %% 27/06/08 %% } ifelse %% 27/06/08 %% end %% 27/06/08 %% {def} if %% 27/06/08 %% } def %% 27/06/08 %% %% 27/06/08 %% %% syntaxe : solid i dessinefacecachee %% 27/06/08 %% /dessinefacecachee { %% 27/06/08 %% 11 dict begin %% 27/06/08 %% /i exch def %% 27/06/08 %% /solid exch def %% 27/06/08 %% solid issolid not { %% 27/06/08 %% (Error : mauvais type d argument dans dessinefacecachee) == %% 27/06/08 %% quit %% 27/06/08 %% } if %% 27/06/08 %% %% 27/06/08 %% /F solid solidgetfaces def %% 27/06/08 %% /S solid solidgetsommets def %% 27/06/08 %% %% 27/06/08 %% %% face cachee => on prend chacune des aretes de la face et on %% 27/06/08 %% %% la dessine %% 27/06/08 %% 4 dict begin %% 27/06/08 %% /n F i get length def %% nb de sommets de la face %% 27/06/08 %% 0 1 n 1 sub { %% 27/06/08 %% /k exch def %% 27/06/08 %% /k1 F i k get_ij def %% indice sommet1 %% 27/06/08 %% /k2 F i k 1 add n mod get_ij def %% indice sommet2 %% 27/06/08 %% gsave %% 27/06/08 %% currentlinewidth .5 mul setlinewidth %% 27/06/08 %% pointilles %% 27/06/08 %% [S k1 getp3d %% 27/06/08 %% S k2 getp3d sortp3d] ligne3d %% 27/06/08 %% grestore %% 27/06/08 %% } for %% 27/06/08 %% %% 27/06/08 %% %% trace de la ligne de niveau %% 27/06/08 %% solidintersectiontype 0 ge { %% 27/06/08 %% /face_a_dessiner [ %% face visible : F [i] %% 27/06/08 %% 0 1 n 1 sub { %% 27/06/08 %% /j exch def %% 27/06/08 %% solid j i solidgetsommetface %% 27/06/08 %% } for %% 27/06/08 %% ] def %% 27/06/08 %% 0 1 solidintersectionplan length 1 sub { %% 27/06/08 %% /k exch def %% 27/06/08 %% /lignedeniveau [] def %% 27/06/08 %% gsave %% 27/06/08 %% pointilles %% 27/06/08 %% k solidintersectionlinewidth length lt { %% 27/06/08 %% solidintersectionlinewidth k get setlinewidth %% 27/06/08 %% } { %% 27/06/08 %% solidintersectionlinewidth 0 get setlinewidth %% 27/06/08 %% } ifelse %% 27/06/08 %% k solidintersectioncolor length lt { %% 27/06/08 %% solidintersectioncolor k get cvx exec %% 27/06/08 %% } { %% 27/06/08 %% solidintersectioncolor 0 get cvx exec %% 27/06/08 %% } ifelse %% 27/06/08 %% 0 1 n 1 sub { %% 27/06/08 %% /j exch def %% 27/06/08 %% face_a_dessiner j getp3d %% 27/06/08 %% face_a_dessiner j 1 add n mod getp3d %% 27/06/08 %% solidintersectionplan k get segment_inter_plan { %% 27/06/08 %% 1 dict begin %% 27/06/08 %% /table exch def %% 27/06/08 %% table length 6 eq { %% 27/06/08 %% /lignedeniveau table store %% 27/06/08 %% exit %% 27/06/08 %% } { %% 27/06/08 %% /lignedeniveau [ %% 27/06/08 %% lignedeniveau aload pop %% 27/06/08 %% table 0 getp3d %% 27/06/08 %% ] store %% 27/06/08 %% } ifelse %% 27/06/08 %% end %% 27/06/08 %% } if %% 27/06/08 %% } for %% 27/06/08 %% %% 27/06/08 %% %% dessin de la ligne %% 27/06/08 %% lignedeniveau length 4 ge { %% 27/06/08 %% [lignedeniveau aload pop sortp3d] ligne3d %% 27/06/08 %% } if %% 27/06/08 %% grestore %% 27/06/08 %% } for %% 27/06/08 %% } if %% 27/06/08 %% %% 27/06/08 %% end %% 27/06/08 %% end %% 27/06/08 %% } def %% 27/06/08 %% %% 27/06/08 %% %% syntaxe : solid i dessinefacevisible %% 27/06/08 %% /dessinefacevisible { %% 27/06/08 %% 8 dict begin %% 27/06/08 %% /i exch def %% 27/06/08 %% /solid exch def %% 27/06/08 %% solid issolid not { %% 27/06/08 %% (Error : mauvais type d argument dans dessinefacevisible) == %% 27/06/08 %% quit %% 27/06/08 %% } if %% 27/06/08 %% /F solid solidgetfaces def %% 27/06/08 %% /S solid solidgetsommets def %% 27/06/08 %% %% 27/06/08 %% /n F i get length def %% nb de sommets de la face %% 27/06/08 %% %% 27/06/08 %% startest { %% 27/06/08 %% s@lidlight { %% 27/06/08 %% /coeff %% 27/06/08 %% lightintensity %% 27/06/08 %% solid i solidnormaleface normalize3d %% 27/06/08 %% solid i solidcentreface lightsrc vecteur3d normalize3d %% 27/06/08 %% scalprod3d mul %% 27/06/08 %% 0 max 1 min %% 27/06/08 %% def %% 27/06/08 %% /lightcolor where { %% 27/06/08 %% pop %% 27/06/08 %% /lacouleur lightcolor def %% 27/06/08 %% } { %% 27/06/08 %% /lacouleur [ %% 27/06/08 %% gsave %% 27/06/08 %% solid solidgetfcolors i get cvx exec currentrgbcolor %% 27/06/08 %% grestore %% 27/06/08 %% ] def %% 27/06/08 %% } ifelse %% 27/06/08 %% /fillstyle { %% 27/06/08 %% lacouleur {coeff mul} apply setcolor fill %% 27/06/08 %% } def %% 27/06/08 %% solidgrid not { %% 27/06/08 %% lacouleur {coeff mul} apply setcolor %% 27/06/08 %% } if %% 27/06/08 %% } { %% 27/06/08 %% n 2 eq { %% 27/06/08 %% 1 dict begin %% 27/06/08 %% solidgridOff %% 27/06/08 %% solid i affectecouleursolid_facei %% 27/06/08 %% end %% 27/06/08 %% } { %% 27/06/08 %% solid i affectecouleursolid_facei %% 27/06/08 %% } ifelse %% 27/06/08 %% } ifelse %% 27/06/08 %% } if %% 27/06/08 %% %% 27/06/08 %% /face_a_dessiner [ %% face visible : F [i] %% 27/06/08 %% 0 1 n 1 sub { %% 27/06/08 %% /j exch def %% 27/06/08 %% solid j i solidgetsommetface %% 27/06/08 %% } for %% 27/06/08 %% ] def %% 27/06/08 %% face_a_dessiner polygone3d %% 27/06/08 %% %% 27/06/08 %% %% trace de la ligne de niveau %% 27/06/08 %% solidintersectiontype 0 ge { %% 27/06/08 %% 0 1 solidintersectionplan length 1 sub { %% 27/06/08 %% /k exch def %% 27/06/08 %% /lignedeniveau [] def %% 27/06/08 %% gsave %% 27/06/08 %% k solidintersectionlinewidth length lt { %% 27/06/08 %% solidintersectionlinewidth k get setlinewidth %% 27/06/08 %% } { %% 27/06/08 %% solidintersectionlinewidth 0 get setlinewidth %% 27/06/08 %% } ifelse %% 27/06/08 %% k solidintersectioncolor length lt { %% 27/06/08 %% solidintersectioncolor k get cvx exec %% 27/06/08 %% } { %% 27/06/08 %% solidintersectioncolor 0 get cvx exec %% 27/06/08 %% } ifelse %% 27/06/08 %% 0 1 n 1 sub { %% 27/06/08 %% /j exch def %% 27/06/08 %% face_a_dessiner j getp3d %% 27/06/08 %% face_a_dessiner j 1 add n mod getp3d %% 27/06/08 %% solidintersectionplan k get segment_inter_plan { %% 27/06/08 %% 1 dict begin %% 27/06/08 %% /table exch def %% 27/06/08 %% /lignedeniveau [ %% 27/06/08 %% lignedeniveau aload pop %% 27/06/08 %% table 0 getp3d %% 27/06/08 %% table length 4 ge { %% 27/06/08 %% table 1 getp3d %% 27/06/08 %% } if %% 27/06/08 %% ] store %% 27/06/08 %% end %% 27/06/08 %% } if %% 27/06/08 %% } for %% 27/06/08 %% %% 27/06/08 %% %% dessin de la ligne %% 27/06/08 %% lignedeniveau length 4 ge { %% 27/06/08 %% solid i solidisinface { %% 27/06/08 %% pointilles %% 27/06/08 %% } if %% 27/06/08 %% lignedeniveau ligne3d %% 27/06/08 %% } if %% 27/06/08 %% grestore %% 27/06/08 %% } for %% 27/06/08 %% } if %% 27/06/08 %% %% 27/06/08 %% end %% 27/06/08 %% } def %% 27/06/08 %% %% 27/06/08 %% /drawsolid* { %% 27/06/08 %% 1 dict begin %% 27/06/08 %% /startest {true} def %% 27/06/08 %% drawsolid %% 27/06/08 %% end %% 27/06/08 %% } def %% 27/06/08 %% %% 27/06/08 %% /peintrealgorithme false def %% 27/06/08 %% %% 27/06/08 %% /drawsolid** { %% 27/06/08 %% 2 dict begin %% 27/06/08 %% /aretescachees false def %% 27/06/08 %% /peintrealgorithme true def %% 27/06/08 %% drawsolid* %% 27/06/08 %% end %% 27/06/08 %% } def %% 27/06/08 %% %% 27/06/08 %% %% syntaxe : solid array drawsolid %% 27/06/08 %% %% array est en option, il indique les faces triees %% 27/06/08 %% /drawsolid { %% 27/06/08 %% 8 dict begin %% 27/06/08 %% dup issolid not { %% 27/06/08 %% /ordre exch def %% 27/06/08 %% } if %% 27/06/08 %% /solid exch def %% 27/06/08 %% solid issolid not { %% 27/06/08 %% (Error : mauvais type d argument dans drawsolid) == %% 27/06/08 %% quit %% 27/06/08 %% } if %% 27/06/08 %% solid nullsolid not { %% 27/06/08 %% solid solidgetfaces %% 27/06/08 %% /F exch def %% 27/06/08 %% solid solidgetsommets %% 27/06/08 %% /S exch def %% 27/06/08 %% /n S length 3 idiv def %% 27/06/08 %% %% 27/06/08 %% currentdict /ordre known not { %% 27/06/08 %% peintrealgorithme { %% 27/06/08 %% %% tri des indices des faces par distance decroissante %% 27/06/08 %% [ %% 27/06/08 %% 0 1 F length 1 sub { %% 27/06/08 %% /i exch def %% 27/06/08 %% solid i solidcentreface %% 27/06/08 %% GetCamPos %% 27/06/08 %% distance3d %% 27/06/08 %% } for %% 27/06/08 %% ] doublequicksort pop reverse %% 27/06/08 %% } { %% 27/06/08 %% [ %% 27/06/08 %% 0 1 F length 1 sub { %% 27/06/08 %% } for %% 27/06/08 %% ] %% 27/06/08 %% } ifelse %% 27/06/08 %% /ordre exch def %% 27/06/08 %% } if %% 27/06/08 %% %% 27/06/08 %% 0 1 F length 1 sub { %% 27/06/08 %% /k exch def %% 27/06/08 %% /i ordre k get def %% 27/06/08 %% gsave %% 27/06/08 %% solid i solidfacevisible? { %% 27/06/08 %% solid i dessinefacevisible %% 27/06/08 %% } if %% 27/06/08 %% grestore %% 27/06/08 %% } for %% 27/06/08 %% aretescachees { %% 27/06/08 %% 0 1 F length 1 sub { %% 27/06/08 %% /k exch def %% 27/06/08 %% /i ordre k get def %% 27/06/08 %% gsave %% 27/06/08 %% solid i solidfacevisible? not { %% 27/06/08 %% solid i dessinefacecachee %% 27/06/08 %% } if %% 27/06/08 %% grestore %% 27/06/08 %% } for %% 27/06/08 %% } if %% 27/06/08 %% %% 27/06/08 %% %% %% si on veut repasser les traits des faces visibles %% 27/06/08 %% %% 0 1 F length 1 sub { %% 27/06/08 %% %% /k exch def %% 27/06/08 %% %% /i ordre k get def %% 27/06/08 %% %% gsave %% 27/06/08 %% %% 1 dict begin %% 27/06/08 %% %% /startest false def %% 27/06/08 %% %% solid i solidfacevisible? { %% 27/06/08 %% %% solid i dessinefacevisible %% 27/06/08 %% %% } if %% 27/06/08 %% %% end %% 27/06/08 %% %% grestore %% 27/06/08 %% %% } for %% 27/06/08 %% } if %% 27/06/08 %% end %% 27/06/08 %% } def