| 5815 | | indnouveauxsommets bubblesort arrayrmdouble |
|---|
| 5816 | | /indnouveauxsommets exch def |
|---|
| 5817 | | %% maintenant, on ajoute la face de plan de coupe |
|---|
| 5818 | | /nouveauxsommets [ |
|---|
| 5819 | | 0 1 indnouveauxsommets length 1 sub { |
|---|
| 5820 | | /i exch def |
|---|
| 5821 | | result indnouveauxsommets i get solidgetsommet |
|---|
| 5822 | | } for |
|---|
| 5823 | | ] def |
|---|
| 5824 | | |
|---|
| 5825 | | 0 0 0 eqplan pointeqplan 0 eq { |
|---|
| 5826 | | /ptref {0 1 1} def |
|---|
| 5827 | | } { |
|---|
| 5828 | | /ptref {0 0 0} def |
|---|
| 5829 | | } ifelse |
|---|
| 5830 | | |
|---|
| 5831 | | %% restera a traiter le cas limite ou la nouvelle face existe deja |
|---|
| 5832 | | %% tester si max(indicestries) < nb sommets avant section |
|---|
| 5833 | | nouveauxsommets ptref ordonnepoints3d |
|---|
| 5834 | | /indicestries exch def |
|---|
| 5835 | | /nvelleface [ |
|---|
| 5836 | | 0 1 indicestries length 1 sub { |
|---|
| 5837 | | /m exch def |
|---|
| 5838 | | indnouveauxsommets indicestries m get get |
|---|
| 5839 | | } for |
|---|
| 5840 | | ] def |
|---|
| 5841 | | /F result solidgetfaces def |
|---|
| 5842 | | /FC result solidgetfcolors def |
|---|
| 5843 | | /IO result solidgetinouttable def |
|---|
| 5844 | | IO dup 1 get 1 add 1 exch put |
|---|
| 5845 | | result [nvelleface F aload pop] solidputfaces |
|---|
| 5846 | | result [lacouleur FC aload pop] solidputfcolors |
|---|
| 5847 | | result |
|---|
| | 5853 | nouvellesaretes separe_composantes |
|---|
| | 5854 | /composantes exch def |
|---|
| | 5855 | |
|---|
| | 5856 | %% pour chacune des composantes |
|---|
| | 5857 | 0 1 composantes length 1 sub { |
|---|
| | 5858 | %% on oriente et on ajoute la face |
|---|
| | 5859 | /icomp exch def |
|---|
| | 5860 | %indnouveauxsommets bubblesort arrayrmdouble |
|---|
| | 5861 | /indnouveauxsommets composantes icomp get def |
|---|
| | 5862 | %% maintenant, on ajoute la face de plan de coupe |
|---|
| | 5863 | /nouveauxsommets [ |
|---|
| | 5864 | 0 1 indnouveauxsommets length 1 sub { |
|---|
| | 5865 | /i exch def |
|---|
| | 5866 | result indnouveauxsommets i get solidgetsommet |
|---|
| | 5867 | } for |
|---|
| | 5868 | ] def |
|---|
| | 5869 | |
|---|
| | 5870 | 0 0 0 eqplan pointeqplan 0 eq { |
|---|
| | 5871 | /ptref {0 1 1} def |
|---|
| | 5872 | } { |
|---|
| | 5873 | /ptref {0 0 0} def |
|---|
| | 5874 | } ifelse |
|---|
| | 5875 | |
|---|
| | 5876 | %% restera a traiter le cas limite ou la nouvelle face existe deja |
|---|
| | 5877 | %% tester si max(indicestries) < nb sommets avant section |
|---|
| | 5878 | nouveauxsommets ptref ordonnepoints3d |
|---|
| | 5879 | /indicestries exch def |
|---|
| | 5880 | /nvelleface [ |
|---|
| | 5881 | 0 1 indicestries length 1 sub { |
|---|
| | 5882 | /m exch def |
|---|
| | 5883 | indnouveauxsommets indicestries m get get |
|---|
| | 5884 | } for |
|---|
| | 5885 | ] def |
|---|
| | 5886 | /F result solidgetfaces def |
|---|
| | 5887 | /FC result solidgetfcolors def |
|---|
| | 5888 | /IO result solidgetinouttable def |
|---|
| | 5889 | IO dup 1 get 1 add 1 exch put |
|---|
| | 5890 | result [nvelleface F aload pop] solidputfaces |
|---|
| | 5891 | result [lacouleur FC aload pop] solidputfcolors |
|---|
| | 5892 | } for |
|---|
| | 5898 | } def |
|---|
| | 5899 | |
|---|
| | 5900 | %% syntaxe : elt array compteoccurences |
|---|
| | 5901 | %% ou array est un tableau du type [ [a1 a2] [b1 b2] [c1 c2] ... ] |
|---|
| | 5902 | /compteoccurences { |
|---|
| | 5903 | 5 dict begin |
|---|
| | 5904 | /table exch def |
|---|
| | 5905 | /elt exch def |
|---|
| | 5906 | /n 0 def |
|---|
| | 5907 | 0 1 table length 1 sub { |
|---|
| | 5908 | /i exch def |
|---|
| | 5909 | elt table i get in { |
|---|
| | 5910 | pop |
|---|
| | 5911 | /n n 1 add store |
|---|
| | 5912 | } if |
|---|
| | 5913 | } for |
|---|
| | 5914 | n |
|---|
| | 5915 | end |
|---|
| | 5916 | } def |
|---|
| | 5917 | |
|---|
| | 5918 | /separe_composantes { |
|---|
| | 5919 | 10 dict begin |
|---|
| | 5920 | /result [] def %% les composantes deja faites |
|---|
| | 5921 | /table exch def %% ce qui reste a faire |
|---|
| | 5922 | |
|---|
| | 5923 | % (recu) == table {==} apply |
|---|
| | 5924 | { |
|---|
| | 5925 | /ext1 table 0 get 1 get def |
|---|
| | 5926 | /ext0 table 0 get 0 get def |
|---|
| | 5927 | /composante [] def |
|---|
| | 5928 | |
|---|
| | 5929 | { %% maintenant on suit les extremites et on epluche une composante |
|---|
| | 5930 | /change false def |
|---|
| | 5931 | /aenlever [] def |
|---|
| | 5932 | 0 1 table length 1 sub { |
|---|
| | 5933 | /i exch def |
|---|
| | 5934 | ext1 table i get In |
|---|
| | 5935 | ext0 table i get In or { |
|---|
| | 5936 | /aenlever [aenlever aload pop i] store |
|---|
| | 5937 | /change true store |
|---|
| | 5938 | %% l'arete i contient l'extremite ext0 ou ext1 |
|---|
| | 5939 | ext0 table i get in { |
|---|
| | 5940 | %% index = 0 ou 1 |
|---|
| | 5941 | neg 1 add table i get exch get |
|---|
| | 5942 | /ext0 exch store |
|---|
| | 5943 | ext0 composante In not { |
|---|
| | 5944 | /composante [composante aload pop ext0] store |
|---|
| | 5945 | } if |
|---|
| | 5946 | %% on verifie que ext0 est legitime |
|---|
| | 5947 | ext0 table compteoccurences 2 gt { |
|---|
| | 5948 | /ext0 -1 store |
|---|
| | 5949 | } if |
|---|
| | 5950 | } if |
|---|
| | 5951 | ext1 table i get in { |
|---|
| | 5952 | %% index = 0 ou 1 |
|---|
| | 5953 | neg 1 add table i get exch get |
|---|
| | 5954 | /ext1 exch store |
|---|
| | 5955 | ext1 composante In not { |
|---|
| | 5956 | /composante [composante aload pop ext1] store |
|---|
| | 5957 | } if |
|---|
| | 5958 | %% on verifie que ext1 est legitime |
|---|
| | 5959 | ext1 table compteoccurences 2 gt { |
|---|
| | 5960 | /ext1 -1 store |
|---|
| | 5961 | } if |
|---|
| | 5962 | } if |
|---|
| | 5963 | } if |
|---|
| | 5964 | } for |
|---|
| | 5965 | %% il faut reconstruire table |
|---|
| | 5966 | /table [ |
|---|
| | 5967 | 0 1 table length 1 sub { |
|---|
| | 5968 | /i exch def |
|---|
| | 5969 | i aenlever in { |
|---|
| | 5970 | pop |
|---|
| | 5971 | } { |
|---|
| | 5972 | table i get |
|---|
| | 5973 | } ifelse |
|---|
| | 5974 | } for |
|---|
| | 5975 | ] store |
|---|
| | 5976 | change not {exit} if |
|---|
| | 5977 | } loop |
|---|
| | 5978 | %% on vient de finir une composante |
|---|
| | 5979 | /result [result aload pop composante] store |
|---|
| | 5980 | %% (nouvelle comp) == composante {==} apply |
|---|
| | 5981 | table length 0 eq {exit} if |
|---|
| | 5982 | } loop |
|---|
| | 5983 | result |
|---|
| | 5984 | % (renvoie) == result {==} apply |
|---|
| | 5985 | end |
|---|
| 5866 | | /facecoupe solid 0 solidgetface def |
|---|
| 5867 | | /couleurfacecoupe solid 0 solidgetfcolor def |
|---|
| 5868 | | solid 0 solidrmface |
|---|
| 5869 | | /n n 1 sub store |
|---|
| | 6003 | |
|---|
| | 6004 | /F [] def |
|---|
| | 6005 | /FC [] def |
|---|
| | 6006 | %% on retire les faces de coupe |
|---|
| | 6007 | 0 1 nbcomposantes 1 sub { |
|---|
| | 6008 | /i exch def |
|---|
| | 6009 | /F [F aload pop solid i solidgetface] store |
|---|
| | 6010 | /FC [FC aload pop solid i solidgetfcolor] store |
|---|
| | 6011 | } for |
|---|
| | 6012 | solid [0 1 nbcomposantes 1 sub {} for] solidrmfaces |
|---|
| | 6013 | /n n nbcomposantes sub store |
|---|
| | 6014 | |
|---|
| | 6015 | %% on separe les autres faces en 2 parties |
|---|
| 5893 | | %% on rajoute maintenant la face du plan de coupe |
|---|
| 5894 | | result1 facecoupe couleurfacecoupe solidaddface |
|---|
| 5895 | | %% et on verifie l'orientation |
|---|
| 5896 | | result1 dup solidnombrefaces 1 sub solidnormaleface |
|---|
| 5897 | | result1 dup solidnombrefaces 1 sub solidcentreface addv3d |
|---|
| 5898 | | eqplan pointeqplan 0 gt { |
|---|
| 5899 | | %% l'orientation est mauvaise |
|---|
| 5900 | | result1 dup solidnombrefaces 1 sub solidrmface |
|---|
| 5901 | | result2 facecoupe couleurfacecoupe solidaddface |
|---|
| 5902 | | result1 facecoupe reverse couleurfacecoupe solidaddface |
|---|
| 5903 | | } { |
|---|
| 5904 | | %% l'orientation est ok |
|---|
| 5905 | | result2 facecoupe reverse solidaddface |
|---|
| 5906 | | } ifelse |
|---|
| | 6039 | |
|---|
| | 6040 | 0 1 nbcomposantes 1 sub { |
|---|
| | 6041 | /i exch def |
|---|
| | 6042 | /facecoupe F i get def |
|---|
| | 6043 | /couleurfacecoupe FC i get def |
|---|
| | 6044 | /lesfaces1 result1 solidgetfaces def |
|---|
| | 6045 | /lescouleurs1 result1 solidgetfcolors def |
|---|
| | 6046 | /lesfaces2 result2 solidgetfaces def |
|---|
| | 6047 | /lescouleurs2 result2 solidgetfcolors def |
|---|
| | 6048 | %% on rajoute maintenant la face du plan de coupe |
|---|
| | 6049 | % result1 facecoupe couleurfacecoupe solidaddface |
|---|
| | 6050 | result1 [facecoupe lesfaces1 aload pop] solidputfaces |
|---|
| | 6051 | result1 [couleurfacecoupe lescouleurs1 aload pop] solidputfcolors |
|---|
| | 6052 | %% et on verifie l'orientation |
|---|
| | 6053 | % result1 dup solidnombrefaces 1 sub solidnormaleface |
|---|
| | 6054 | % result1 dup solidnombrefaces 1 sub solidcentreface addv3d |
|---|
| | 6055 | result1 0 solidnormaleface |
|---|
| | 6056 | result1 0 solidcentreface addv3d |
|---|
| | 6057 | eqplan pointeqplan 0 gt { |
|---|
| | 6058 | %% l'orientation est mauvaise |
|---|
| | 6059 | result1 0 solidrmface |
|---|
| | 6060 | result2 [facecoupe lesfaces2 aload pop] solidputfaces |
|---|
| | 6061 | result2 [couleurfacecoupe lescouleurs2 aload pop] solidputfcolors |
|---|
| | 6062 | result1 [facecoupe reverse lesfaces1 aload pop] solidputfaces |
|---|
| | 6063 | result1 [couleurfacecoupe lescouleurs1 aload pop] solidputfcolors |
|---|
| | 6064 | } { |
|---|
| | 6065 | %% l'orientation est ok |
|---|
| | 6066 | result2 [facecoupe reverse lesfaces2 aload pop] solidputfaces |
|---|
| | 6067 | result2 [couleurfacecoupe lescouleurs2 aload pop] solidputfcolors |
|---|
| | 6068 | } ifelse |
|---|
| | 6069 | } for |
|---|