| | 3252 | %%%%% ### ordonnepoints3d ### |
|---|
| | 3253 | %% syntaxe : array1 M ordonnepoints3d --> array2 |
|---|
| | 3254 | %% array1 = tableau de points 3d coplanaires (plan P) |
|---|
| | 3255 | %% M = point3d indiquant la direction de la normale a P |
|---|
| | 3256 | %% array2 = les indices des points de depart, ranges dans le |
|---|
| | 3257 | %% sens trigo par rapport a la normale |
|---|
| | 3258 | /ordonnepoints3d { |
|---|
| | 3259 | 5 dict begin |
|---|
| | 3260 | /M defpoint3d |
|---|
| | 3261 | /table exch def |
|---|
| | 3262 | table isobarycentre3d /G defpoint3d |
|---|
| | 3263 | %% calcul de la normale |
|---|
| | 3264 | table 0 getp3d /ptref defpoint3d |
|---|
| | 3265 | table 1 getp3d /A defpoint3d |
|---|
| | 3266 | G ptref vecteur3d |
|---|
| | 3267 | G A vecteur3d |
|---|
| | 3268 | vectprod3d /vecteurnormal defpoint3d |
|---|
| | 3269 | vecteurnormal G M vecteur3d scalprod3d 0 lt { |
|---|
| | 3270 | vecteurnormal -1 mulv3d /vecteurnormal defpoint3d |
|---|
| | 3271 | } if |
|---|
| | 3272 | %% la table des angles |
|---|
| | 3273 | table duparray exch pop |
|---|
| | 3274 | {1 dict begin |
|---|
| | 3275 | /M defpoint3d |
|---|
| | 3276 | G ptref vecteur3d |
|---|
| | 3277 | G M vecteur3d |
|---|
| | 3278 | vecteurnormal angle3doriente |
|---|
| | 3279 | end} papply3d |
|---|
| | 3280 | [0 1 table length 3 idiv 1 sub {} for] |
|---|
| | 3281 | exch doublebubblesort pop |
|---|
| | 3282 | end |
|---|
| | 3283 | } def |
|---|
| | 3284 | |
|---|
| | 5047 | |
|---|
| | 5048 | %%%%% ### solidchanfreine ### |
|---|
| | 5049 | %% syntaxe : solid coeff i s@lidaffineface |
|---|
| | 5050 | /solidchanfreine { |
|---|
| | 5051 | 10 dict begin |
|---|
| | 5052 | /coeff exch def |
|---|
| | 5053 | /solid exch def |
|---|
| | 5054 | /result newsolid def |
|---|
| | 5055 | solid issolid not { |
|---|
| | 5056 | (Erreur : mauvais type d argument dans solidchanfreine) == |
|---|
| | 5057 | quit |
|---|
| | 5058 | } if |
|---|
| | 5059 | /n solid solidnombresommets def |
|---|
| | 5060 | /nf solid solidnombrefaces def |
|---|
| | 5061 | |
|---|
| | 5062 | %% ajout des faces reduites |
|---|
| | 5063 | 0 1 nf 1 sub { |
|---|
| | 5064 | /i exch def |
|---|
| | 5065 | /Fsommets solid i solidgetsommetsface def |
|---|
| | 5066 | /Findex solid i solidgetface def |
|---|
| | 5067 | /ns Fsommets length 3 idiv def |
|---|
| | 5068 | /couleurfaceorigine solid i solidgetfcolor def |
|---|
| | 5069 | Fsommets isobarycentre3d /G defpoint3d |
|---|
| | 5070 | %% on ajoute les nouveaux sommets |
|---|
| | 5071 | /Sindex [] def |
|---|
| | 5072 | 0 1 ns 1 sub { |
|---|
| | 5073 | /j exch def |
|---|
| | 5074 | /Sindex [ Sindex aload pop |
|---|
| | 5075 | Fsommets j getp3d /M defpoint3d |
|---|
| | 5076 | result M G coeff hompoint3d solidaddsommet |
|---|
| | 5077 | ] store |
|---|
| | 5078 | } for |
|---|
| | 5079 | %% Sindex contient les indices des nouveaux sommets |
|---|
| | 5080 | result Sindex couleurfaceorigine solidaddface |
|---|
| | 5081 | } for |
|---|
| | 5082 | |
|---|
| | 5083 | %% ajout des faces rectangulaires entre faces d'origines adjacentes |
|---|
| | 5084 | %% pour chaque face de depart |
|---|
| | 5085 | 0 1 nf 2 sub { |
|---|
| | 5086 | /i exch def |
|---|
| | 5087 | /F solid i solidgetface def |
|---|
| | 5088 | /couleurfaceorigine solid i solidgetfcolor def |
|---|
| | 5089 | /Fres result i solidgetface def |
|---|
| | 5090 | %% pour chaque arete de la face |
|---|
| | 5091 | 0 1 F length 1 sub { |
|---|
| | 5092 | /j exch def |
|---|
| | 5093 | /trouve false def |
|---|
| | 5094 | /indice1 F j get def |
|---|
| | 5095 | /indice2 F j 1 add F length mod get def |
|---|
| | 5096 | /a1 j def |
|---|
| | 5097 | /a2 j 1 add F length mod def |
|---|
| | 5098 | %% on regarde toutes les autres faces |
|---|
| | 5099 | i 1 add 1 nf 1 sub { |
|---|
| | 5100 | /k exch def |
|---|
| | 5101 | /Ftest solid k solidgetface def |
|---|
| | 5102 | indice1 Ftest in {pop true} {false} ifelse |
|---|
| | 5103 | indice2 Ftest in {pop true} {false} ifelse |
|---|
| | 5104 | and { |
|---|
| | 5105 | /indiceFadj k def |
|---|
| | 5106 | indice1 Ftest in pop /k1 exch def |
|---|
| | 5107 | indice2 Ftest in pop /k2 exch def |
|---|
| | 5108 | /trouve true def |
|---|
| | 5109 | exit |
|---|
| | 5110 | } if |
|---|
| | 5111 | } for |
|---|
| | 5112 | trouve { |
|---|
| | 5113 | /Fadj solid indiceFadj solidgetface def |
|---|
| | 5114 | result [ |
|---|
| | 5115 | Fres a1 get |
|---|
| | 5116 | result indiceFadj solidgetface k1 get |
|---|
| | 5117 | result indiceFadj solidgetface k2 get |
|---|
| | 5118 | Fres a2 get |
|---|
| | 5119 | ] couleurfaceorigine solidaddface |
|---|
| | 5120 | } if |
|---|
| | 5121 | } for |
|---|
| | 5122 | } for |
|---|
| | 5123 | |
|---|
| | 5124 | %% pour chaque face |
|---|
| | 5125 | 0 1 nf 2 sub { |
|---|
| | 5126 | /i exch def |
|---|
| | 5127 | /F solid i solidgetface def |
|---|
| | 5128 | /couleurfaceorigine solid i solidgetfcolor def |
|---|
| | 5129 | %% et pour chaque sommet de cette face |
|---|
| | 5130 | 0 1 F length 1 sub { |
|---|
| | 5131 | /j exch def |
|---|
| | 5132 | /k F j get def |
|---|
| | 5133 | solid k solidfacesadjsommet /adj exch def |
|---|
| | 5134 | %% adj est le tableau des indices des faces adjacentes |
|---|
| | 5135 | %% au sommet d'indice k |
|---|
| | 5136 | %% rque : toutes les faces d'indice strict inferieur a i |
|---|
| | 5137 | %% sont deja traitees |
|---|
| | 5138 | %% Pour chaque face adjacente, on repere l'indice du sommet concerne dans |
|---|
| | 5139 | %% la face |
|---|
| | 5140 | adj min i lt not { |
|---|
| | 5141 | /indadj [] def |
|---|
| | 5142 | 0 1 adj length 1 sub { |
|---|
| | 5143 | /m exch def |
|---|
| | 5144 | k solid adj m get solidgetface in { |
|---|
| | 5145 | /ok exch def |
|---|
| | 5146 | /indadj [indadj aload pop ok] store |
|---|
| | 5147 | } if |
|---|
| | 5148 | } for |
|---|
| | 5149 | |
|---|
| | 5150 | /aajouter [ |
|---|
| | 5151 | 0 1 adj length 1 sub { |
|---|
| | 5152 | /m exch def |
|---|
| | 5153 | result adj m get solidgetface indadj m get get |
|---|
| | 5154 | } for |
|---|
| | 5155 | ] def |
|---|
| | 5156 | |
|---|
| | 5157 | %% la table des sommets |
|---|
| | 5158 | [0 1 aajouter length 1 sub { |
|---|
| | 5159 | /m exch def |
|---|
| | 5160 | result aajouter m get solidgetsommet |
|---|
| | 5161 | } for] |
|---|
| | 5162 | solid k solidgetsommet %% le point indiquant la direction de la normale |
|---|
| | 5163 | ordonnepoints3d |
|---|
| | 5164 | /indicestries exch def |
|---|
| | 5165 | |
|---|
| | 5166 | result [ |
|---|
| | 5167 | 0 1 indicestries length 1 sub { |
|---|
| | 5168 | /m exch def |
|---|
| | 5169 | aajouter indicestries m get get |
|---|
| | 5170 | } for |
|---|
| | 5171 | ] couleurfaceorigine solidaddface |
|---|
| | 5172 | } if |
|---|
| | 5173 | } for |
|---|
| | 5174 | } for |
|---|
| | 5175 | |
|---|
| | 5176 | result |
|---|
| | 5177 | end |
|---|
| | 5178 | } def |
|---|