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