/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
|