Source PostScript (solidplansection.pps)

Retour Texte non formaté
%% syntaxe : M eqplan --> real %% image de M par la fonction definie par l equation eqplan /pointeqplan { 8 dict begin /@qplan exch def /@z exch def /@y exch def /@x exch def /@a @qplan 0 get def /@b @qplan 1 get def /@c @qplan 2 get def /@d @qplan 3 get def @a @x mul @b @y mul add @c @z mul add @d add end } def %% syntaxe : A B eqplan segment_inter_plan --> array true ou false %% array contient 1 point M si [AB] inter plan = {M} %% array contient les 2 points A et B si [AB] inter plan = [AB] /segment_inter_plan { 4 dict begin dup isplan {plan2eq} if /plan exch def plan aload pop /d exch def /c exch def /b exch def /a exch def /B defpoint3d /A defpoint3d A /zA exch def /yA exch def /xA exch def B /zB exch def /yB exch def /xB exch def /imA a xA mul b yA mul add c zA mul add d add def /imB a xB mul b yB mul add c zB mul add d add def imA imB mul dup 0 gt { %% pas d intersection pop false } { 0 eq { %% intersection en A ou en B [ imA 0 eq {A} if imB 0 eq {B} if ] true } { %% intersection entre A et B /k imA neg xB xA sub a mul yB yA sub b mul add zB zA sub c mul add dup 0 eq { (Error dans segment_inter_plan) == quit } if div def [ A B vecteur3d k mulv3d A addv3d ] true } ifelse } ifelse end } def %% syntaxe : solid i solidface2eqplan --> [a b c d] %% equation cartesienne de la face d'indice i du solide solid /solidface2eqplan { 8 dict begin /i exch def /solid exch def solid i solidnormaleface /c exch def /b exch def /a exch def solid 0 i solidgetsommetface /z exch def /y exch def /x exch def [a b c a x mul b y mul add c z mul add neg] end } def %% syntaxe : array1 arrayrmdouble --> array2 %% remplace 2 elts identiques consecutifs par 1 elt /arrayrmdouble { 5 dict begin /table exch def /result [table 0 get] def /j 0 def 1 1 table length 1 sub { /i exch def table i get result j get eq not { /result [result aload pop table i get] store /j j 1 add store } if } for result end } def %% syntaxe : solid eqplan/plantype solidplansection --> solid2 /solidplansection { 10 dict begin dup isbool { /tr@nsmit exch def } { /tr@nsmit false def } ifelse dup isplan { plan2eqplan /eqplan exch def } { /eqplan exch def } ifelse dupsolid /result exch def /solid exch def /aenlever [] def /indnouveauxsommets [] def /nouvellesaretes [] def %% pour chaque face d'indice i 0 1 solid solidnombrefaces 1 sub { /i exch def /lacouleur solid i solidgetfcolor def /F solid i solidgetface def %% table des indices des sommets /n F length def %% nb d'aretes /k1 -1 def /k2 -1 def /k3 -1 def /k4 -1 def /k3a -3 def /k4a -3 def %% pour chaque arete [AB] 0 1 n 1 sub { /j exch def %% arete testee : [j, j+1 mod n] (indices relatifs a la face i) solid j i solidgetsommetface /A defpoint3d solid j 1 add n mod i solidgetsommetface /B defpoint3d %% y a-t-il intersection A B eqplan segment_inter_plan { %% il y a intersection dup length 6 eq { %% l'intersection, c'est [AB] /k1 -1 def /k2 -1 def /k3 -1 def /k4 -1 def /k3a -1 def /k4a -1 def dup 0 getp3d /A defpoint3d 1 getp3d /B defpoint3d result A solidaddsommet /a1 exch def result B solidaddsommet /a2 exch def /indnouveauxsommets [ indnouveauxsommets aload pop a1 a2 ] store /nouvellesaretes [ [a1 a2] nouvellesaretes aload pop ] store exit %% c est deja scinde } if %% il y a intersection <> [AB] k1 0 lt { %% 1ere intersection de la face /k1 j def %% sommet precedent intersection 1 result exch aload pop solidaddsommet /k1a exch def %% sommet intersection 1 } { k2 0 lt { %% 2eme intersection de la face /k2 j def %% sommet precedent intersection 2 result exch aload pop solidaddsommet /k2a exch def %% sommet intersection 2 } { k3 0 lt { %% 3eme intersection de la face /k3 j def %% sommet precedent intersection 3 result exch aload pop solidaddsommet /k3a exch def %% sommet intersection 3 } { %% 4eme intersection de la face /k4 j def %% sommet precedent intersection 4 result exch aload pop solidaddsommet /k4a exch def %% sommet intersection 4 } ifelse } ifelse } ifelse } if } for %% y a-t-il eu une coupe ? %% si oui, il faut scinder la face d'indice i en cours k1 0 ge { %% (coupe) == %% (n) == n == %% k1 == k2 == k3 == k4 == %% (a) == %% k1a == k2a == k3a == k4a == k1a k2a eq k3 0 lt and { %% 1 pt d'intersection } { %% il y a coupe, on cherche a eliminer les %% doublons dans {k1a, k2a, k3a, k4a} k1a k2a eq k3 0 ge and { %% 2 pts d'intersection /k2a k3a def /k2 k3 def } if k1a k3a eq k4 0 ge and { %% 2 pts d'intersection /k2a k4a def /k2 k4 def } if /nouvellesaretes [ [k1a k2a] nouvellesaretes aload pop ] store [ k1a F k1 1 add n mod get ne { k1a } if k1 1 add n mod 1 k2 {F exch get} for k2a F k2 get ne { k2a } if ] result exch lacouleur solidaddface /indnouveauxsommets [indnouveauxsommets aload pop k1a k2a] store [ k2a F k2 1 add n mod get ne { k2a } if k2 1 add n ne { k2 1 add n mod 1 n 1 sub {F exch get} for } if 0 1 k1 {F exch get} for k1a F k1 get ne { k1a } if ] result exch lacouleur solidaddface /aenlever [aenlever aload pop i] store } ifelse } if } for result aenlever solidrmfaces nouvellesaretes separe_composantes /composantes exch def %% pour chacune des composantes 0 1 composantes length 1 sub { %% on oriente et on ajoute la face /icomp exch def %indnouveauxsommets bubblesort arrayrmdouble /indnouveauxsommets composantes icomp get def %% maintenant, on ajoute la face de plan de coupe /nouveauxsommets [ 0 1 indnouveauxsommets length 1 sub { /i exch def result indnouveauxsommets i get solidgetsommet } for ] def 0 0 0 eqplan pointeqplan 0 eq { /ptref {0 1 1} def } { /ptref {0 0 0} def } ifelse %% restera a traiter le cas limite ou la nouvelle face existe deja %% tester si max(indicestries) < nb sommets avant section nouveauxsommets ptref ordonnepoints3d /indicestries exch def /nvelleface [ 0 1 indicestries length 1 sub { /m exch def indnouveauxsommets indicestries m get get } for ] def /F result solidgetfaces def /FC result solidgetfcolors def /IO result solidgetinouttable def /n1 IO 1 get def IO 1 n1 1 add put result IO solidputinouttable result [nvelleface F aload pop] solidputfaces result [lacouleur FC aload pop] solidputfcolors } for result tr@nsmit { composantes length } if end } def %% syntaxe : elt array compteoccurences %% ou array est un tableau du type [ [a1 a2] [b1 b2] [c1 c2] ... ] /compteoccurences { 5 dict begin /table exch def /elt exch def /n 0 def 0 1 table length 1 sub { /i exch def elt table i get in { pop /n n 1 add store } if } for n end } def /separe_composantes { 10 dict begin /result [] def %% les composantes deja faites /table exch def %% ce qui reste a faire % (recu) == table {==} apply { /ext1 table 0 get 1 get def /ext0 table 0 get 0 get def /composante [] def { %% maintenant on suit les extremites et on epluche une composante /change false def /aenlever [] def 0 1 table length 1 sub { /i exch def ext1 table i get In ext0 table i get In or { /aenlever [aenlever aload pop i] store /change true store %% l'arete i contient l'extremite ext0 ou ext1 ext0 table i get in { %% index = 0 ou 1 neg 1 add table i get exch get /ext0 exch store ext0 composante In not { /composante [composante aload pop ext0] store } if %% on verifie que ext0 est legitime ext0 table compteoccurences 2 gt { /ext0 -1 store } if } if ext1 table i get in { %% index = 0 ou 1 neg 1 add table i get exch get /ext1 exch store ext1 composante In not { /composante [composante aload pop ext1] store } if %% on verifie que ext1 est legitime ext1 table compteoccurences 2 gt { /ext1 -1 store } if } if } if } for %% il faut reconstruire table /table [ 0 1 table length 1 sub { /i exch def i aenlever in { pop } { table i get } ifelse } for ] store change not {exit} if } loop %% on vient de finir une composante /result [result aload pop composante] store %% (nouvelle comp) == composante {==} apply table length 0 eq {exit} if } loop result % (renvoie) == result {==} apply end } def /solideqplansepare {solidplansepare} def %% syntaxe : solid eqplan/plantype solidplansepare --> solid1 solid2 /solidplansepare { 10 dict begin dup isplan { plan2eq /eqplan exch def } { /eqplan exch def } ifelse eqplan true solidplansection /nbcomposantes exch def /solid exch def /n solid solidnombrefaces def /F [] def /FC [] def %% on retire les faces de coupe 0 1 nbcomposantes 1 sub { /i exch def /F [F aload pop solid i solidgetface] store /FC [FC aload pop solid i solidgetfcolor] store } for solid [0 1 nbcomposantes 1 sub {} for] solidrmfaces /n n nbcomposantes sub store %% on separe les autres faces en 2 parties /lesneg [] def %% indices des faces "positives" /lespos [] def %% indices des faces negatives" 0 1 n 1 sub { /i exch def solid i solidcentreface /G defpoint3d G eqplan pointeqplan dup 0 gt { pop /lespos [lespos aload pop i] store } { 0 lt { /lesneg [lesneg aload pop i] store } { % /lesneg [lesneg aload pop i] store % /lespos [lespos aload pop i] store } ifelse } ifelse } for solid dupsolid dup lesneg solidrmfaces /result1 exch def dupsolid dup lespos solidrmfaces /result2 exch def pop 0 1 nbcomposantes 1 sub { /i exch def /facecoupe F i get def /couleurfacecoupe FC i get def /lesfaces1 result1 solidgetfaces def /lescouleurs1 result1 solidgetfcolors def /IO1 result1 solidgetinouttable def /lesfaces2 result2 solidgetfaces def /lescouleurs2 result2 solidgetfcolors def /IO2 result2 solidgetinouttable def %% on rajoute maintenant la face du plan de coupe % result1 facecoupe couleurfacecoupe solidaddface result1 [facecoupe lesfaces1 aload pop] solidputfaces result1 [couleurfacecoupe lescouleurs1 aload pop] solidputfcolors result1 IO1 dup dup 1 get 1 add 1 exch put solidputinouttable %% et on verifie l'orientation % result1 dup solidnombrefaces 1 sub solidnormaleface % result1 dup solidnombrefaces 1 sub solidcentreface addv3d result1 0 solidnormaleface result1 0 solidcentreface addv3d eqplan pointeqplan 0 gt { %% l'orientation est mauvaise result1 0 solidrmface result2 [facecoupe lesfaces2 aload pop] solidputfaces result2 [couleurfacecoupe lescouleurs2 aload pop] solidputfcolors result2 IO2 dup dup 1 get 1 add 1 exch put solidputinouttable result1 [facecoupe reverse lesfaces1 aload pop] solidputfaces result1 [couleurfacecoupe lescouleurs1 aload pop] solidputfcolors result1 dup solidgetinouttable dup dup 1 get 1 add 1 exch put solidputinouttable } { %% l'orientation est ok result2 IO2 dup dup 1 get 1 add 1 exch put solidputinouttable result2 [facecoupe reverse lesfaces2 aload pop] solidputfaces result2 [couleurfacecoupe lescouleurs2 aload pop] solidputfcolors } ifelse } for %% maintenant on enleve les sommets isoles /sommetspos [] def /sommetsneg [] def %% pour chaque face du cote negatif 0 1 lesneg length 1 sub { lesneg exch get /i exch def /F solid i solidgetface def %% pour chaque sommet de cette face 0 1 F length 1 sub { /j exch def /sommet F j get def %% si le sommet n'est pas encore note sommet sommetsneg in not { %% et s'il est isole, on peut l'enlever result1 sommet solidsommetsadjsommet length 0 eq { /sommetsneg [sommetsneg aload pop sommet] store } if } { pop } ifelse } for } for sommetsneg bubblesort reverse {result1 exch solidrmsommet} apply %% pour chaque face du cote positif 0 1 lespos length 1 sub { lespos exch get /i exch def /F solid i solidgetface def %% pour chaque sommet de cette face 0 1 F length 1 sub { /j exch def /sommet F j get def %% si le sommet n'est pas encore note sommet sommetspos in not { %% et s'il est isole, on peut l'enlever result2 sommet solidsommetsadjsommet length 0 eq { /sommetspos [sommetspos aload pop sommet] store } if } { pop } ifelse } for } for sommetspos bubblesort reverse {result2 exch solidrmsommet} apply result1 result2 end } def %% %% syntaxe : M eqplan --> real %% %% image de M par la fonction definie par l equation eqplan %% /pointeqplan { %% 8 dict begin %% /@qplan exch def %% /@z exch def %% /@y exch def %% /@x exch def %% /@a @qplan 0 get def %% /@b @qplan 1 get def %% /@c @qplan 2 get def %% /@d @qplan 3 get def %% @a @x mul @b @y mul add @c @z mul add @d add %% end %% } def %% %% %% syntaxe : A B eqplan segment_inter_plan --> array true ou false %% %% array contient 1 point M si [AB] inter plan = {M} %% %% array contient les 2 points A et B si [AB] inter plan = [AB] %% /segment_inter_plan { %% 4 dict begin %% /plan exch def %% plan aload pop %% /d exch def %% /c exch def %% /b exch def %% /a exch def %% /B defpoint3d %% /A defpoint3d %% A %% /zA exch def %% /yA exch def %% /xA exch def %% B %% /zB exch def %% /yB exch def %% /xB exch def %% /imA a xA mul b yA mul add c zA mul add d add def %% /imB a xB mul b yB mul add c zB mul add d add def %% imA imB mul dup 0 gt { %% %% pas d intersection %% pop %% false %% } { %% 0 eq { %% %% intersection en A ou en B %% [ %% imA 0 eq {A} if %% imB 0 eq {B} if %% ] true %% } { %% %% intersection entre A et B %% /k %% imA neg %% xB xA sub a mul %% yB yA sub b mul add %% zB zA sub c mul add %% dup 0 eq { %% (Error dans segment_inter_plan) == %% quit %% } if %% div %% def %% [ %% A B vecteur3d %% k mulv3d %% A addv3d %% ] true %% } ifelse %% } ifelse %% end %% } def %% %% %% syntaxe : solid i solidface2eqplan --> [a b c d] %% %% equation cartesienne de la face d'indice i du solide solid %% /solidface2eqplan { %% 8 dict begin %% /i exch def %% /solid exch def %% solid i solidnormaleface %% /c exch def %% /b exch def %% /a exch def %% solid 0 i solidgetsommetface %% /z exch def %% /y exch def %% /x exch def %% [a b c a x mul b y mul add c z mul add neg] %% end %% } def %% %% %% syntaxe : array1 arrayrmdouble --> array2 %% %% remplace 2 elts identiques consecutifs par 1 elt %% /arrayrmdouble { %% 5 dict begin %% /table exch def %% /result [table 0 get] def %% /j 0 def %% 1 1 table length 1 sub { %% /i exch def %% table i get %% result j get %% eq not { %% /result [result aload pop table i get] store %% /j j 1 add store %% } if %% } for %% result %% end %% } def %% %% %% syntaxe : solid eqplan/plantype solidplansection --> solid2 %% /solidplansection { %% 10 dict begin %% dup isbool { %% /tr@nsmit exch def %% } { %% /tr@nsmit false def %% } ifelse %% dup isplan { %% plan2eqplan %% /eqplan exch def %% } { %% /eqplan exch def %% } ifelse %% dupsolid /result exch def %% /solid exch def %% /aenlever [] def %% /indnouveauxsommets [] def %% /nouvellesaretes [] def %% %% %% pour chaque face d'indice i %% 0 1 solid solidnombrefaces 1 sub { %% /i exch def %% /lacouleur solid i solidgetfcolor def %% /F solid i solidgetface def %% table des indices des sommets %% /n F length def %% nb d'aretes %% /k1 -1 def %% /k2 -1 def %% /k3 -1 def %% /k4 -1 def %% /k3a -3 def %% /k4a -3 def %% %% pour chaque arete [AB] %% 0 1 n 1 sub { %% /j exch def %% %% arete testee : [j, j+1 mod n] (indices relatifs a la face i) %% solid j i solidgetsommetface /A defpoint3d %% solid j 1 add n mod i solidgetsommetface /B defpoint3d %% %% y a-t-il intersection %% A B eqplan segment_inter_plan { %% %% il y a intersection %% dup length 6 eq { %% %% l'intersection, c'est [AB] %% /k1 -1 def %% /k2 -1 def %% /k3 -1 def %% /k4 -1 def %% /k3a -1 def %% /k4a -1 def %% dup 0 getp3d /A defpoint3d %% 1 getp3d /B defpoint3d %% result A solidaddsommet /a1 exch def %% result B solidaddsommet /a2 exch def %% /indnouveauxsommets [ %% indnouveauxsommets aload pop a1 a2 %% ] store %% /nouvellesaretes [ %% [a1 a2] %% nouvellesaretes aload pop %% ] store %% exit %% c est deja scinde %% } if %% %% il y a intersection <> [AB] %% k1 0 lt { %% %% 1ere intersection de la face %% /k1 j def %% sommet precedent intersection 1 %% result exch aload pop solidaddsommet %% /k1a exch def %% sommet intersection 1 %% } { %% k2 0 lt { %% %% 2eme intersection de la face %% /k2 j def %% sommet precedent intersection 2 %% result exch aload pop solidaddsommet %% /k2a exch def %% sommet intersection 2 %% } { %% k3 0 lt { %% %% 3eme intersection de la face %% /k3 j def %% sommet precedent intersection 3 %% result exch aload pop solidaddsommet %% /k3a exch def %% sommet intersection 3 %% } { %% %% 4eme intersection de la face %% /k4 j def %% sommet precedent intersection 4 %% result exch aload pop solidaddsommet %% /k4a exch def %% sommet intersection 4 %% } ifelse %% } ifelse %% } ifelse %% } if %% } for %% %% %% y a-t-il eu une coupe ? %% %% si oui, il faut scinder la face d'indice i en cours %% k1 0 ge { %% %% (coupe) == %% %% (n) == n == %% %% k1 == k2 == k3 == k4 == %% %% (a) == %% %% k1a == k2a == k3a == k4a == %% k1a k2a eq k3 0 lt and { %% %% 1 pt d'intersection %% } { %% %% il y a coupe, on cherche a eliminer les %% %% doublons dans {k1a, k2a, k3a, k4a} %% k1a k2a eq k3 0 ge and { %% %% 2 pts d'intersection %% /k2a k3a def %% /k2 k3 def %% } if %% k1a k3a eq k4 0 ge and { %% %% 2 pts d'intersection %% /k2a k4a def %% /k2 k4 def %% } if %% /nouvellesaretes [ %% [k1a k2a] %% nouvellesaretes aload pop %% ] store %% [ %% k1a F k1 1 add n mod get ne { %% k1a %% } if %% k1 1 add n mod 1 k2 {F exch get} for %% k2a F k2 get ne { %% k2a %% } if %% ] %% result exch lacouleur solidaddface %% /indnouveauxsommets [indnouveauxsommets aload pop k1a k2a] store %% [ %% k2a F k2 1 add n mod get ne { %% k2a %% } if %% k2 1 add n ne { %% k2 1 add n mod 1 n 1 sub {F exch get} for %% } if %% 0 1 k1 {F exch get} for %% k1a F k1 get ne { %% k1a %% } if %% ] %% result exch lacouleur solidaddface %% /aenlever [aenlever aload pop i] store %% } ifelse %% } if %% } for %% result aenlever solidrmfaces %% %% nouvellesaretes separe_composantes %% /composantes exch def %% %% %% pour chacune des composantes %% 0 1 composantes length 1 sub { %% %% on oriente et on ajoute la face %% /icomp exch def %% %indnouveauxsommets bubblesort arrayrmdouble %% /indnouveauxsommets composantes icomp get def %% %% maintenant, on ajoute la face de plan de coupe %% /nouveauxsommets [ %% 0 1 indnouveauxsommets length 1 sub { %% /i exch def %% result indnouveauxsommets i get solidgetsommet %% } for %% ] def %% %% 0 0 0 eqplan pointeqplan 0 eq { %% /ptref {0 1 1} def %% } { %% /ptref {0 0 0} def %% } ifelse %% %% %% restera a traiter le cas limite ou la nouvelle face existe deja %% %% tester si max(indicestries) < nb sommets avant section %% nouveauxsommets ptref ordonnepoints3d %% /indicestries exch def %% /nvelleface [ %% 0 1 indicestries length 1 sub { %% /m exch def %% indnouveauxsommets indicestries m get get %% } for %% ] def %% /F result solidgetfaces def %% /FC result solidgetfcolors def %% /IO result solidgetinouttable def %% IO dup 1 get 1 add 1 exch put %% result [nvelleface F aload pop] solidputfaces %% result [lacouleur FC aload pop] solidputfcolors %% } for %% result %% tr@nsmit { %% composantes length %% } if %% end %% } def %% %% %% syntaxe : elt array compteoccurences %% %% ou array est un tableau du type [ [a1 a2] [b1 b2] [c1 c2] ... ] %% /compteoccurences { %% 5 dict begin %% /table exch def %% /elt exch def %% /n 0 def %% 0 1 table length 1 sub { %% /i exch def %% elt table i get in { %% pop %% /n n 1 add store %% } if %% } for %% n %% end %% } def %% %% /separe_composantes { %% 10 dict begin %% /result [] def %% les composantes deja faites %% /table exch def %% ce qui reste a faire %% %% % (recu) == table {==} apply %% { %% /ext1 table 0 get 1 get def %% /ext0 table 0 get 0 get def %% /composante [] def %% %% { %% maintenant on suit les extremites et on epluche une composante %% /change false def %% /aenlever [] def %% 0 1 table length 1 sub { %% /i exch def %% ext1 table i get In %% ext0 table i get In or { %% /aenlever [aenlever aload pop i] store %% /change true store %% %% l'arete i contient l'extremite ext0 ou ext1 %% ext0 table i get in { %% %% index = 0 ou 1 %% neg 1 add table i get exch get %% /ext0 exch store %% ext0 composante In not { %% /composante [composante aload pop ext0] store %% } if %% %% on verifie que ext0 est legitime %% ext0 table compteoccurences 2 gt { %% /ext0 -1 store %% } if %% } if %% ext1 table i get in { %% %% index = 0 ou 1 %% neg 1 add table i get exch get %% /ext1 exch store %% ext1 composante In not { %% /composante [composante aload pop ext1] store %% } if %% %% on verifie que ext1 est legitime %% ext1 table compteoccurences 2 gt { %% /ext1 -1 store %% } if %% } if %% } if %% } for %% %% il faut reconstruire table %% /table [ %% 0 1 table length 1 sub { %% /i exch def %% i aenlever in { %% pop %% } { %% table i get %% } ifelse %% } for %% ] store %% change not {exit} if %% } loop %% %% on vient de finir une composante %% /result [result aload pop composante] store %% %% (nouvelle comp) == composante {==} apply %% table length 0 eq {exit} if %% } loop %% result %% % (renvoie) == result {==} apply %% end %% } def %% %% /solideqplansepare {solidplansepare} def %% %% %% syntaxe : solid eqplan/plantype solidplansepare --> solid1 solid2 %% /solidplansepare { %% 10 dict begin %% dup isplan { %% plan2eq %% /eqplan exch def %% } { %% /eqplan exch def %% } ifelse %% eqplan true solidplansection %% /nbcomposantes exch def %% /solid exch def %% /n solid solidnombrefaces def %% %% /F [] def %% /FC [] def %% %% on retire les faces de coupe %% 0 1 nbcomposantes 1 sub { %% /i exch def %% /F [F aload pop solid i solidgetface] store %% /FC [FC aload pop solid i solidgetfcolor] store %% } for %% solid [0 1 nbcomposantes 1 sub {} for] solidrmfaces %% /n n nbcomposantes sub store %% %% %% on separe les autres faces en 2 parties %% /lesneg [] def %% indices des faces "positives" %% /lespos [] def %% indices des faces negatives" %% 0 1 n 1 sub { %% /i exch def %% solid i solidcentreface /G defpoint3d %% G eqplan pointeqplan dup 0 gt { %% pop %% /lespos [lespos aload pop i] store %% } { %% 0 lt { %% /lesneg [lesneg aload pop i] store %% } { %% % /lesneg [lesneg aload pop i] store %% % /lespos [lespos aload pop i] store %% } ifelse %% } ifelse %% } for %% solid %% dupsolid dup lesneg solidrmfaces %% /result1 exch def %% dupsolid dup lespos solidrmfaces %% /result2 exch def %% pop %% %% 0 1 nbcomposantes 1 sub { %% /i exch def %% /facecoupe F i get def %% /couleurfacecoupe FC i get def %% /lesfaces1 result1 solidgetfaces def %% /lescouleurs1 result1 solidgetfcolors def %% /lesfaces2 result2 solidgetfaces def %% /lescouleurs2 result2 solidgetfcolors def %% %% on rajoute maintenant la face du plan de coupe %% % result1 facecoupe couleurfacecoupe solidaddface %% result1 [facecoupe lesfaces1 aload pop] solidputfaces %% result1 [couleurfacecoupe lescouleurs1 aload pop] solidputfcolors %% %% et on verifie l'orientation %% % result1 dup solidnombrefaces 1 sub solidnormaleface %% % result1 dup solidnombrefaces 1 sub solidcentreface addv3d %% result1 0 solidnormaleface %% result1 0 solidcentreface addv3d %% eqplan pointeqplan 0 gt { %% %% l'orientation est mauvaise %% result1 0 solidrmface %% result2 [facecoupe lesfaces2 aload pop] solidputfaces %% result2 [couleurfacecoupe lescouleurs2 aload pop] solidputfcolors %% result1 [facecoupe reverse lesfaces1 aload pop] solidputfaces %% result1 [couleurfacecoupe lescouleurs1 aload pop] solidputfcolors %% } { %% %% l'orientation est ok %% result2 [facecoupe reverse lesfaces2 aload pop] solidputfaces %% result2 [couleurfacecoupe lescouleurs2 aload pop] solidputfcolors %% } ifelse %% } for %% %% %% maintenant on enleve les sommets isoles %% /sommetspos [] def %% /sommetsneg [] def %% %% pour chaque face du cote negatif %% 0 1 lesneg length 1 sub { %% lesneg exch get /i exch def %% /F solid i solidgetface def %% %% pour chaque sommet de cette face %% 0 1 F length 1 sub { %% /j exch def %% /sommet F j get def %% %% si le sommet n'est pas encore note %% sommet sommetsneg in not { %% %% et s'il est isole, on peut l'enlever %% result1 sommet solidsommetsadjsommet length 0 eq { %% /sommetsneg [sommetsneg aload pop sommet] store %% } if %% } { %% pop %% } ifelse %% } for %% } for %% sommetsneg bubblesort reverse {result1 exch solidrmsommet} apply %% %% %% pour chaque face du cote positif %% 0 1 lespos length 1 sub { %% lespos exch get /i exch def %% /F solid i solidgetface def %% %% pour chaque sommet de cette face %% 0 1 F length 1 sub { %% /j exch def %% /sommet F j get def %% %% si le sommet n'est pas encore note %% sommet sommetspos in not { %% %% et s'il est isole, on peut l'enlever %% result2 sommet solidsommetsadjsommet length 0 eq { %% /sommetspos [sommetspos aload pop sommet] store %% } if %% } { %% pop %% } ifelse %% } for %% } for %% sommetspos bubblesort reverse {result2 exch solidrmsommet} apply %% %% result1 result2 %% end %% } def %% 07/06/08 %% %% syntaxe : solid eqplan/plantype solidplansection --> solid2 %% 07/06/08 %% /solidplansection { %% 07/06/08 %% 10 dict begin %% 07/06/08 %% dup isplan { %% 07/06/08 %% plan2eqplan %% 07/06/08 %% /eqplan exch def %% 07/06/08 %% } { %% 07/06/08 %% /eqplan exch def %% 07/06/08 %% } ifelse %% 07/06/08 %% dupsolid /result exch def %% 07/06/08 %% /solid exch def %% 07/06/08 %% /aenlever [] def %% 07/06/08 %% /indnouveauxsommets [] def %% 07/06/08 %% %(nombre faces) == %% 07/06/08 %% %solid solidnombrefaces == %% 07/06/08 %% 0 1 solid solidnombrefaces 1 sub { %% 07/06/08 %% /i exch def %% 07/06/08 %% /lacouleur solid i solidgetfcolor def %% 07/06/08 %% %(NOUVELLE FACE) == i == %% 07/06/08 %% /F solid i solidgetface def %% table des indices %% 07/06/08 %% /n F length def %% nb d'aretes %% 07/06/08 %% /k1 -1 def %% 07/06/08 %% /k2 -1 def %% 07/06/08 %% /k3 -1 def %% 07/06/08 %% /k4 -1 def %% 07/06/08 %% /k3a -3 def %% 07/06/08 %% /k4a -3 def %% 07/06/08 %% %% pour chaque arete [AB] %% 07/06/08 %% 0 1 n 1 sub { %% 07/06/08 %% /j exch def %% 07/06/08 %% %(nvell arete) == j == %% 07/06/08 %% solid j i solidgetsommetface /A defpoint3d %% 07/06/08 %% solid j 1 add n mod i solidgetsommetface /B defpoint3d %% 07/06/08 %% %% y a-t-il intersection %% 07/06/08 %% A B eqplan segment_inter_plan { %% 07/06/08 %% %(inter) == %% 07/06/08 %% dup length 6 eq { %% 07/06/08 %% /k1 -1 def %% 07/06/08 %% /k2 -1 def %% 07/06/08 %% /k3 -1 def %% 07/06/08 %% /k4 -1 def %% 07/06/08 %% /k3a -1 def %% 07/06/08 %% /k4a -1 def %% 07/06/08 %% dup 0 getp3d /A defpoint3d %% 07/06/08 %% 1 getp3d /B defpoint3d %% 07/06/08 %% result A solidaddsommet /a1 exch def %% 07/06/08 %% result B solidaddsommet /a2 exch def %% 07/06/08 %% /indnouveauxsommets [ %% 07/06/08 %% indnouveauxsommets aload pop a1 a2 %% 07/06/08 %% ] store %% 07/06/08 %% exit %% c est deja scinde %% 07/06/08 %% } if %% 07/06/08 %% k1 0 lt { %% 07/06/08 %% %% 1ere intersection de la face %% 07/06/08 %% /k1 j def %% 07/06/08 %% result exch aload pop solidaddsommet %% 07/06/08 %% /k1a exch def %% 07/06/08 %% } { %% 07/06/08 %% k2 0 lt { %% 07/06/08 %% %% 2eme intersection de la face %% 07/06/08 %% /k2 j def %% 07/06/08 %% result exch aload pop solidaddsommet %% 07/06/08 %% /k2a exch def %% 07/06/08 %% } { %% 07/06/08 %% k3 0 lt { %% 07/06/08 %% %% 3eme intersection de la face %% 07/06/08 %% /k3 j def %% 07/06/08 %% result exch aload pop solidaddsommet %% 07/06/08 %% /k3a exch def %% 07/06/08 %% } { %% 07/06/08 %% %% 4eme intersection de la face %% 07/06/08 %% /k4 j def %% 07/06/08 %% result exch aload pop solidaddsommet %% 07/06/08 %% /k4a exch def %% 07/06/08 %% } ifelse %% 07/06/08 %% } ifelse %% 07/06/08 %% } ifelse %% 07/06/08 %% } if %% 07/06/08 %% } for %% 07/06/08 %% %% y a-t-il une coupe ? %% 07/06/08 %% k1 0 ge { %% 07/06/08 %% %% (coupe) == %% 07/06/08 %% %% (n) == n == %% 07/06/08 %% %% k1 == k2 == k3 == k4 == %% 07/06/08 %% %% (a) == %% 07/06/08 %% %% k1a == k2a == k3a == k4a == %% 07/06/08 %% k1a k2a eq k3 0 lt and { %% 07/06/08 %% %% 1 pt d'intersection %% 07/06/08 %% } { %% 07/06/08 %% k1a k2a eq k3 0 ge and { %% 07/06/08 %% %% 2 pts d'intersection %% 07/06/08 %% /k2a k3a def %% 07/06/08 %% /k2 k3 def %% 07/06/08 %% } if %% 07/06/08 %% k1a k3a eq k4 0 ge and { %% 07/06/08 %% %% 2 pts d'intersection %% 07/06/08 %% /k2a k4a def %% 07/06/08 %% /k2 k4 def %% 07/06/08 %% } if %% 07/06/08 %% [ %% 07/06/08 %% k1a F k1 1 add n mod get ne { %% 07/06/08 %% k1a %% 07/06/08 %% } if %% 07/06/08 %% k1 1 add n mod 1 k2 {F exch get} for %% 07/06/08 %% k2a F k2 get ne { %% 07/06/08 %% k2a %% 07/06/08 %% } if %% 07/06/08 %% ] %% 07/06/08 %% result exch lacouleur solidaddface %% 07/06/08 %% /indnouveauxsommets [indnouveauxsommets aload pop k1a k2a] store %% 07/06/08 %% [ %% 07/06/08 %% k2a F k2 1 add n mod get ne { %% 07/06/08 %% k2a %% 07/06/08 %% } if %% 07/06/08 %% k2 1 add n ne { %% 07/06/08 %% k2 1 add n mod 1 n 1 sub {F exch get} for %% 07/06/08 %% } if %% 07/06/08 %% 0 1 k1 {F exch get} for %% 07/06/08 %% k1a F k1 get ne { %% 07/06/08 %% k1a %% 07/06/08 %% } if %% 07/06/08 %% ] %% 07/06/08 %% result exch lacouleur solidaddface %% 07/06/08 %% /aenlever [aenlever aload pop i] store %% 07/06/08 %% } ifelse %% 07/06/08 %% } if %% 07/06/08 %% } for %% 07/06/08 %% result aenlever solidrmfaces %% 07/06/08 %% %% 07/06/08 %% indnouveauxsommets bubblesort arrayrmdouble %% 07/06/08 %% /indnouveauxsommets exch def %% 07/06/08 %% %% maintenant, on ajoute la face de plan de coupe %% 07/06/08 %% /nouveauxsommets [ %% 07/06/08 %% 0 1 indnouveauxsommets length 1 sub { %% 07/06/08 %% /i exch def %% 07/06/08 %% result indnouveauxsommets i get solidgetsommet %% 07/06/08 %% } for %% 07/06/08 %% ] def %% 07/06/08 %% %% 07/06/08 %% 0 0 0 eqplan pointeqplan 0 eq { %% 07/06/08 %% /ptref {0 1 1} def %% 07/06/08 %% } { %% 07/06/08 %% /ptref {0 0 0} def %% 07/06/08 %% } ifelse %% 07/06/08 %% %% 07/06/08 %% %% restera a traiter le cas limite ou la nouvelle face existe deja %% 07/06/08 %% %% tester si max(indicestries) < nb sommets avant section %% 07/06/08 %% nouveauxsommets ptref ordonnepoints3d %% 07/06/08 %% /indicestries exch def %% 07/06/08 %% /nvelleface [ %% 07/06/08 %% 0 1 indicestries length 1 sub { %% 07/06/08 %% /m exch def %% 07/06/08 %% indnouveauxsommets indicestries m get get %% 07/06/08 %% } for %% 07/06/08 %% ] def %% 07/06/08 %% /F result solidgetfaces def %% 07/06/08 %% /FC result solidgetfcolors def %% 07/06/08 %% /IO result solidgetinouttable def %% 07/06/08 %% IO dup 1 get 1 add 1 exch put %% 07/06/08 %% result [nvelleface F aload pop] solidputfaces %% 07/06/08 %% result [lacouleur FC aload pop] solidputfcolors %% 07/06/08 %% result %% 07/06/08 %% result %% 07/06/08 %% end %% 07/06/08 %% } def %% 07/06/08 %% %% 07/06/08 %% /solideqplansepare {solidplansepare} def %% 07/06/08 %% %% 07/06/08 %% %% syntaxe : solid eqplan/plantype solidplansepare --> solid1 solid2 %% 07/06/08 %% /solidplansepare { %% 07/06/08 %% 10 dict begin %% 07/06/08 %% dup isplan { %% 07/06/08 %% plan2eq %% 07/06/08 %% /eqplan exch def %% 07/06/08 %% } { %% 07/06/08 %% /eqplan exch def %% 07/06/08 %% } ifelse %% 07/06/08 %% eqplan solidplansection %% 07/06/08 %% /solid exch def %% 07/06/08 %% /n solid solidnombrefaces def %% 07/06/08 %% /facecoupe solid 0 solidgetface def %% 07/06/08 %% /couleurfacecoupe solid 0 solidgetfcolor def %% 07/06/08 %% solid 0 solidrmface %% 07/06/08 %% /n n 1 sub store %% 07/06/08 %% /lesneg [] def %% indices des faces "positives" %% 07/06/08 %% /lespos [] def %% indices des faces negatives" %% 07/06/08 %% 0 1 n 1 sub { %% 07/06/08 %% /i exch def %% 07/06/08 %% solid i solidcentreface /G defpoint3d %% 07/06/08 %% G eqplan pointeqplan dup 0 gt { %% 07/06/08 %% pop %% 07/06/08 %% /lespos [lespos aload pop i] store %% 07/06/08 %% } { %% 07/06/08 %% 0 lt { %% 07/06/08 %% /lesneg [lesneg aload pop i] store %% 07/06/08 %% } { %% 07/06/08 %% % /lesneg [lesneg aload pop i] store %% 07/06/08 %% % /lespos [lespos aload pop i] store %% 07/06/08 %% } ifelse %% 07/06/08 %% } ifelse %% 07/06/08 %% } for %% 07/06/08 %% solid %% 07/06/08 %% dupsolid dup lesneg solidrmfaces %% 07/06/08 %% /result1 exch def %% 07/06/08 %% dupsolid dup lespos solidrmfaces %% 07/06/08 %% /result2 exch def %% 07/06/08 %% pop %% 07/06/08 %% %% on rajoute maintenant la face du plan de coupe %% 07/06/08 %% result1 facecoupe couleurfacecoupe solidaddface %% 07/06/08 %% %% et on verifie l'orientation %% 07/06/08 %% result1 dup solidnombrefaces 1 sub solidnormaleface %% 07/06/08 %% result1 dup solidnombrefaces 1 sub solidcentreface addv3d %% 07/06/08 %% eqplan pointeqplan 0 gt { %% 07/06/08 %% %% l'orientation est mauvaise %% 07/06/08 %% result1 dup solidnombrefaces 1 sub solidrmface %% 07/06/08 %% result2 facecoupe couleurfacecoupe solidaddface %% 07/06/08 %% result1 facecoupe reverse couleurfacecoupe solidaddface %% 07/06/08 %% } { %% 07/06/08 %% %% l'orientation est ok %% 07/06/08 %% result2 facecoupe reverse solidaddface %% 07/06/08 %% } ifelse %% 07/06/08 %% %% 07/06/08 %% /sommetspos [] def %% 07/06/08 %% /sommetsneg [] def %% 07/06/08 %% %% pour chaque face du cote negatif %% 07/06/08 %% 0 1 lesneg length 1 sub { %% 07/06/08 %% lesneg exch get /i exch def %% 07/06/08 %% /F solid i solidgetface def %% 07/06/08 %% %% pour chaque sommet de cette face %% 07/06/08 %% 0 1 F length 1 sub { %% 07/06/08 %% /j exch def %% 07/06/08 %% /sommet F j get def %% 07/06/08 %% %% si le sommet n'est pas encore note %% 07/06/08 %% sommet sommetsneg in not { %% 07/06/08 %% %% et s'il est isole, on peut l'enlever %% 07/06/08 %% result1 sommet solidsommetsadjsommet length 0 eq { %% 07/06/08 %% /sommetsneg [sommetsneg aload pop sommet] store %% 07/06/08 %% } if %% 07/06/08 %% } { %% 07/06/08 %% pop %% 07/06/08 %% } ifelse %% 07/06/08 %% } for %% 07/06/08 %% } for %% 07/06/08 %% sommetsneg bubblesort reverse {result1 exch solidrmsommet} apply %% 07/06/08 %% %% 07/06/08 %% %% pour chaque face du cote positif %% 07/06/08 %% 0 1 lespos length 1 sub { %% 07/06/08 %% lespos exch get /i exch def %% 07/06/08 %% /F solid i solidgetface def %% 07/06/08 %% %% pour chaque sommet de cette face %% 07/06/08 %% 0 1 F length 1 sub { %% 07/06/08 %% /j exch def %% 07/06/08 %% /sommet F j get def %% 07/06/08 %% %% si le sommet n'est pas encore note %% 07/06/08 %% sommet sommetspos in not { %% 07/06/08 %% %% et s'il est isole, on peut l'enlever %% 07/06/08 %% result2 sommet solidsommetsadjsommet length 0 eq { %% 07/06/08 %% /sommetspos [sommetspos aload pop sommet] store %% 07/06/08 %% } if %% 07/06/08 %% } { %% 07/06/08 %% pop %% 07/06/08 %% } ifelse %% 07/06/08 %% } for %% 07/06/08 %% } for %% 07/06/08 %% sommetspos bubblesort reverse {result2 exch solidrmsommet} apply %% 07/06/08 %% %% 07/06/08 %% result1 result2 %% 07/06/08 %% end %% 07/06/08 %% } def %% 25/05/2008 %% %% syntaxe : solid eqplan solidplansection --> solid2 %% 25/05/2008 %% /solidplansection { %% 25/05/2008 %% 10 dict begin %% 25/05/2008 %% /eqplan exch def %% 25/05/2008 %% dupsolid /result exch def %% 25/05/2008 %% /solid exch def %% 25/05/2008 %% /aenlever [] def %% 25/05/2008 %% %(nombre faces) == %% 25/05/2008 %% %solid solidnombrefaces == %% 25/05/2008 %% 0 1 solid solidnombrefaces 1 sub { %% 25/05/2008 %% /i exch def %% 25/05/2008 %% /lacouleur solid i solidgetfcolor def %% 25/05/2008 %% %(NOUVELLE FACE) == i == %% 25/05/2008 %% /F solid i solidgetface def %% table des indices %% 25/05/2008 %% /n F length def %% nb d'aretes %% 25/05/2008 %% /k1 -1 def %% 25/05/2008 %% /k2 -1 def %% 25/05/2008 %% /k3 -1 def %% 25/05/2008 %% /k4 -1 def %% 25/05/2008 %% /k3a -3 def %% 25/05/2008 %% /k4a -3 def %% 25/05/2008 %% %% pour chaque arete [AB] %% 25/05/2008 %% 0 1 n 1 sub { %% 25/05/2008 %% /j exch def %% 25/05/2008 %% %(nvell arete) == j == %% 25/05/2008 %% solid j i solidgetsommetface /A defpoint3d %% 25/05/2008 %% solid j 1 add n mod i solidgetsommetface /B defpoint3d %% 25/05/2008 %% %% y a-t-il intersection %% 25/05/2008 %% A B eqplan segment_inter_plan { %% 25/05/2008 %% %(inter) == %% 25/05/2008 %% dup length 6 eq { %% 25/05/2008 %% /k1 -1 def %% 25/05/2008 %% /k2 -1 def %% 25/05/2008 %% /k3 -1 def %% 25/05/2008 %% /k4 -1 def %% 25/05/2008 %% /k3a -1 def %% 25/05/2008 %% /k4a -1 def %% 25/05/2008 %% exit %% c est deja scinde %% 25/05/2008 %% } if %% 25/05/2008 %% k1 0 lt { %% 25/05/2008 %% %% 1ere intersection de la face %% 25/05/2008 %% /k1 j def %% 25/05/2008 %% result exch aload pop solidaddsommet %% 25/05/2008 %% /k1a exch def %% 25/05/2008 %% } { %% 25/05/2008 %% k2 0 lt { %% 25/05/2008 %% %% 2eme intersection de la face %% 25/05/2008 %% /k2 j def %% 25/05/2008 %% result exch aload pop solidaddsommet %% 25/05/2008 %% /k2a exch def %% 25/05/2008 %% } { %% 25/05/2008 %% k3 0 lt { %% 25/05/2008 %% %% 3eme intersection de la face %% 25/05/2008 %% /k3 j def %% 25/05/2008 %% result exch aload pop solidaddsommet %% 25/05/2008 %% /k3a exch def %% 25/05/2008 %% } { %% 25/05/2008 %% %% 4eme intersection de la face %% 25/05/2008 %% /k4 j def %% 25/05/2008 %% result exch aload pop solidaddsommet %% 25/05/2008 %% /k4a exch def %% 25/05/2008 %% } ifelse %% 25/05/2008 %% } ifelse %% 25/05/2008 %% } ifelse %% 25/05/2008 %% } if %% 25/05/2008 %% } for %% 25/05/2008 %% %% y a-t-il une coupe ? %% 25/05/2008 %% k1 0 ge { %% 25/05/2008 %% %% (coupe) == %% 25/05/2008 %% %% (n) == n == %% 25/05/2008 %% %% k1 == k2 == k3 == k4 == %% 25/05/2008 %% %% (a) == %% 25/05/2008 %% %% k1a == k2a == k3a == k4a == %% 25/05/2008 %% k1a k2a eq k3 0 lt and { %% 25/05/2008 %% } { %% 25/05/2008 %% k1a k2a eq k3 0 ge and { %% 25/05/2008 %% /k2a k3a def %% 25/05/2008 %% /k2 k3 def %% 25/05/2008 %% } if %% 25/05/2008 %% k1a k3a eq k4 0 ge and { %% 25/05/2008 %% /k2a k4a def %% 25/05/2008 %% /k2 k4 def %% 25/05/2008 %% } if %% 25/05/2008 %% [ %% 25/05/2008 %% k1a F k1 1 add n mod get ne { %% 25/05/2008 %% k1a %% 25/05/2008 %% } if %% 25/05/2008 %% k1 1 add n mod 1 k2 {F exch get} for %% 25/05/2008 %% k2a F k2 get ne { %% 25/05/2008 %% k2a %% 25/05/2008 %% } if %% 25/05/2008 %% ] %% 25/05/2008 %% result exch lacouleur solidaddface %% 25/05/2008 %% [ %% 25/05/2008 %% k2a F k2 1 add n mod get ne { %% 25/05/2008 %% k2a %% 25/05/2008 %% } if %% 25/05/2008 %% k2 1 add n ne { %% 25/05/2008 %% k2 1 add n mod 1 n 1 sub {F exch get} for %% 25/05/2008 %% } if %% 25/05/2008 %% 0 1 k1 {F exch get} for %% 25/05/2008 %% k1a F k1 get ne { %% 25/05/2008 %% k1a %% 25/05/2008 %% } if %% 25/05/2008 %% ] %% 25/05/2008 %% result exch lacouleur solidaddface %% 25/05/2008 %% /aenlever [aenlever aload pop i] store %% 25/05/2008 %% } ifelse %% 25/05/2008 %% } if %% 25/05/2008 %% } for %% 25/05/2008 %% result aenlever solidrmfaces %% 25/05/2008 %% result %% 25/05/2008 %% end %% 25/05/2008 %% } def %% 25/05/2008 %% %% 25/05/2008 %% %% syntaxe : solid eqplan solideqplansepare --> solid1 solid2 %% 25/05/2008 %% /solideqplansepare { %% 25/05/2008 %% 10 dict begin %% 25/05/2008 %% /eqplan exch def %% 25/05/2008 %% eqplan solidplansection %% 25/05/2008 %% /solid exch def %% 25/05/2008 %% /n solid solidnombrefaces def %% 25/05/2008 %% /lesneg [] def %% 25/05/2008 %% /lespos [] def %% 25/05/2008 %% 0 1 n 1 sub { %% 25/05/2008 %% /i exch def %% 25/05/2008 %% solid i solidcentreface /G defpoint3d %% 25/05/2008 %% G eqplan pointeqplan dup 0 gt { %% 25/05/2008 %% pop %% 25/05/2008 %% /lespos [lespos aload pop i] store %% 25/05/2008 %% } { %% 25/05/2008 %% 0 lt { %% 25/05/2008 %% /lesneg [lesneg aload pop i] store %% 25/05/2008 %% } { %% 25/05/2008 %% /lesneg [lesneg aload pop i] store %% 25/05/2008 %% /lespos [lespos aload pop i] store %% 25/05/2008 %% } ifelse %% 25/05/2008 %% } ifelse %% 25/05/2008 %% } for %% 25/05/2008 %% solid %% 25/05/2008 %% dupsolid dup lesneg solidrmfaces %% 25/05/2008 %% /result1 exch def %% 25/05/2008 %% dupsolid dup lespos solidrmfaces %% 25/05/2008 %% /result2 exch def %% 25/05/2008 %% pop %% 25/05/2008 %% /sommetspos [] def %% 25/05/2008 %% /sommetsneg [] def %% 25/05/2008 %% %% pour chaque face du cote negatif %% 25/05/2008 %% 0 1 lesneg length 1 sub { %% 25/05/2008 %% lesneg exch get /i exch def %% 25/05/2008 %% /F solid i solidgetface def %% 25/05/2008 %% %% pour chaque sommet de cette face %% 25/05/2008 %% 0 1 F length 1 sub { %% 25/05/2008 %% /j exch def %% 25/05/2008 %% /sommet F j get def %% 25/05/2008 %% %% si le sommet n'est pas encore note %% 25/05/2008 %% sommet sommetsneg in not { %% 25/05/2008 %% %% et s'il est isole, on peut l'enlever %% 25/05/2008 %% result1 sommet solidsommetsadjsommet length 0 eq { %% 25/05/2008 %% /sommetsneg [sommetsneg aload pop sommet] store %% 25/05/2008 %% } if %% 25/05/2008 %% } { %% 25/05/2008 %% pop %% 25/05/2008 %% } ifelse %% 25/05/2008 %% } for %% 25/05/2008 %% } for %% 25/05/2008 %% sommetsneg bubblesort reverse {result1 exch solidrmsommet} apply %% 25/05/2008 %% %% 25/05/2008 %% %% pour chaque face du cote positif %% 25/05/2008 %% 0 1 lespos length 1 sub { %% 25/05/2008 %% lespos exch get /i exch def %% 25/05/2008 %% /F solid i solidgetface def %% 25/05/2008 %% %% pour chaque sommet de cette face %% 25/05/2008 %% 0 1 F length 1 sub { %% 25/05/2008 %% /j exch def %% 25/05/2008 %% /sommet F j get def %% 25/05/2008 %% %% si le sommet n'est pas encore note %% 25/05/2008 %% sommet sommetspos in not { %% 25/05/2008 %% %% et s'il est isole, on peut l'enlever %% 25/05/2008 %% result2 sommet solidsommetsadjsommet length 0 eq { %% 25/05/2008 %% /sommetspos [sommetspos aload pop sommet] store %% 25/05/2008 %% } if %% 25/05/2008 %% } { %% 25/05/2008 %% pop %% 25/05/2008 %% } ifelse %% 25/05/2008 %% } for %% 25/05/2008 %% } for %% 25/05/2008 %% sommetspos bubblesort reverse {result2 exch solidrmsommet} apply %% 25/05/2008 %% %% 25/05/2008 %% result1 result2 %% 25/05/2008 %% end %% 25/05/2008 %% } def %% %% syntaxe : solid eqplan solideqplansepare --> solid1 solid2 %% /solideqplansepare { %% 10 dict begin %% /eqplan exch def %% eqplan solidplansection %% /solid exch def %% /n solid solidnombrefaces def %% /lesneg [] def %% /lespos [] def %% 0 1 n 1 sub { %% /i exch def %% solid i solidcentreface /G defpoint3d %% G eqplan pointeqplan dup 0 gt { %% pop %% /lespos [lespos aload pop i] store %% } { %% 0 lt { %% /lesneg [lesneg aload pop i] store %% } { %% /lesneg [lesneg aload pop i] store %% /lespos [lespos aload pop i] store %% } ifelse %% } ifelse %% } for %% solid %% dupsolid dup lesneg solidrmfaces %% exch dup lespos solidrmfaces %% end %% } def