1 |
francois |
283 |
//--------------------------------------------------------------------------- |
2 |
|
|
|
3 |
|
|
#include "gestionversion.h" |
4 |
|
|
#include <math.h> |
5 |
|
|
#include "remailleur.h" |
6 |
|
|
#include "mg_gestionnaire.h" |
7 |
|
|
#include "mailleur3d.h" |
8 |
|
|
#include "mailleur0d.h" |
9 |
|
|
#include "mailleur1d.h" |
10 |
|
|
#include "mailleur2d.h" |
11 |
|
|
#include "ot_mathematique.h" |
12 |
|
|
#include "mg_geometrie_outils.h" |
13 |
|
|
//--------------------------------------------------------------------------- |
14 |
|
|
#pragma package(smart_init) |
15 |
|
|
|
16 |
|
|
|
17 |
|
|
|
18 |
|
|
|
19 |
|
|
|
20 |
francois |
494 |
REMAILLEUR::REMAILLEUR(class MG_GESTIONNAIRE* g1,MG_GESTIONNAIRE* g2,MG_GEOMETRIE* geo1,MG_GEOMETRIE* geo2,class FCT_TAILLE* fct_taille1,FCT_TAILLE* fct_taille2,MG_MAILLAGE* mori,MG_MAILLAGE* mmodi,VCT_COMPARAISON_RESULTAT& cmp):MAILLEUR(false),gestorigine(g1),gestmodifie(g2),carteori(fct_taille1),cartemod(fct_taille2),rescmp(cmp),maiorigine(mori),maimodifie(mmodi),geoorigine(geo1),geomodifie(geo2) |
21 |
francois |
283 |
{ |
22 |
|
|
int nbvolume=geomodifie->get_nb_mg_volume(); |
23 |
|
|
lsttrifront=new TPL_LISTE_ENTITE<MG_TRIANGLE*>[nbvolume]; |
24 |
|
|
} |
25 |
|
|
|
26 |
|
|
REMAILLEUR::~REMAILLEUR() |
27 |
|
|
{ |
28 |
|
|
//TPL_MAP_ENTITE<class MG_SEGMENT_FRONTIERE*>::ITERATEUR it; |
29 |
|
|
//for (MG_SEGMENT_FRONTIERE* seg=lstsegfront.get_premier(it);seg!=NULL;seg=lstsegfront.get_suivant(it) ) delete seg; |
30 |
|
|
delete octree; |
31 |
|
|
delete [] lsttrifront; |
32 |
|
|
} |
33 |
|
|
|
34 |
|
|
|
35 |
couturad |
966 |
int REMAILLEUR::maille(MG_GROUPE_TOPOLOGIQUE* mggt) |
36 |
francois |
283 |
{ |
37 |
couturad |
966 |
if(maille(20)==FAIL) return FAIL; |
38 |
|
|
return OK; |
39 |
francois |
283 |
} |
40 |
|
|
|
41 |
couturad |
966 |
int REMAILLEUR::maille(int etape) |
42 |
francois |
283 |
{ |
43 |
|
|
//etape 0 initialisation |
44 |
|
|
initialise_octree(); |
45 |
|
|
//etape 1 Destruction des entites autour des entites disparues |
46 |
couturad |
966 |
if (etape<1) return OK; |
47 |
francois |
283 |
affiche((char*)" Destruction autour des disparitions"); |
48 |
|
|
TPL_MAP_ENTITE<MG_ELEMENT_MAILLAGE*> lstdetruire; |
49 |
|
|
int nb=rescmp.get_nb_liste_topologie(VCT_COMPARAISON_RESULTAT::ORIGINE_DISPARUE); |
50 |
|
|
for (int i=0;i<nb;i++) |
51 |
|
|
{ |
52 |
|
|
MG_ELEMENT_TOPOLOGIQUE* ele=rescmp.get_liste_topologie(VCT_COMPARAISON_RESULTAT::ORIGINE_DISPARUE,i); |
53 |
|
|
int dim=ele->get_dimension(); |
54 |
|
|
if (dim==0) |
55 |
|
|
{ |
56 |
|
|
MG_SOMMET* som=(MG_SOMMET*)ele; |
57 |
|
|
int nblien=som->get_lien_maillage()->get_nb(); |
58 |
|
|
for (int j=0;j<nblien;j++) |
59 |
|
|
{ |
60 |
|
|
MG_NOEUD* no=(MG_NOEUD*)som->get_lien_maillage()->get(j); |
61 |
|
|
if (maiorigine->get_mg_noeudid(no->get_id())!=NULL) lstdetruire.ajouter(no); |
62 |
|
|
} |
63 |
|
|
} |
64 |
|
|
if (dim==1) |
65 |
|
|
{ |
66 |
|
|
MG_ARETE* are=(MG_ARETE*)ele; |
67 |
|
|
int nblien=are->get_lien_maillage()->get_nb(); |
68 |
|
|
for (int j=0;j<nblien;j++) |
69 |
|
|
{ |
70 |
|
|
MG_SEGMENT* seg=(MG_SEGMENT*)are->get_lien_maillage()->get(j); |
71 |
|
|
if (maiorigine->get_mg_segmentid(seg->get_id())!=NULL) |
72 |
|
|
{ |
73 |
|
|
lstdetruire.ajouter(seg->get_noeud1()); |
74 |
|
|
lstdetruire.ajouter(seg->get_noeud2()); |
75 |
|
|
} |
76 |
|
|
} |
77 |
|
|
} |
78 |
|
|
if (dim==2) |
79 |
|
|
{ |
80 |
|
|
MG_FACE* face=(MG_FACE*)ele; |
81 |
|
|
int nblien=face->get_lien_maillage()->get_nb(); |
82 |
|
|
for (int j=0;j<nblien;j++) |
83 |
|
|
{ |
84 |
|
|
MG_TRIANGLE* tri=(MG_TRIANGLE*)face->get_lien_maillage()->get(j); |
85 |
|
|
if (maiorigine->get_mg_triangleid(tri->get_id())!=NULL) |
86 |
|
|
{ |
87 |
|
|
lstdetruire.ajouter(tri->get_noeud1()); |
88 |
|
|
lstdetruire.ajouter(tri->get_noeud2()); |
89 |
|
|
lstdetruire.ajouter(tri->get_noeud3()); |
90 |
|
|
} |
91 |
|
|
} |
92 |
|
|
} |
93 |
|
|
} |
94 |
|
|
TPL_MAP_ENTITE<MG_ELEMENT_MAILLAGE*>::ITERATEUR it; |
95 |
|
|
for (MG_NOEUD* no=(MG_NOEUD*)lstdetruire.get_premier(it);no!=NULL;no=(MG_NOEUD*)lstdetruire.get_suivant(it)) |
96 |
|
|
{ |
97 |
|
|
double ereelle=0.; |
98 |
|
|
int nbseg=no->get_lien_segment()->get_nb(); |
99 |
|
|
for (int i=0;i<nbseg;i++) |
100 |
|
|
ereelle=ereelle+no->get_lien_segment()->get(i)->get_longueur(); |
101 |
|
|
ereelle=ereelle/nbseg; |
102 |
|
|
detruit_noeud(no,2*ereelle); |
103 |
|
|
} |
104 |
|
|
//etape 2 : transfert des noeuds de sommets; |
105 |
couturad |
966 |
if (etape<2) return OK; |
106 |
francois |
283 |
affiche((char*)" Transfert sommet"); |
107 |
|
|
nb=rescmp.get_nb_liste_topologie(VCT_COMPARAISON_RESULTAT::ORIGINE_CONSERVEE); |
108 |
|
|
for (int i=0;i<nb;i++) |
109 |
|
|
{ |
110 |
|
|
MG_ELEMENT_TOPOLOGIQUE* ele=rescmp.get_liste_topologie(VCT_COMPARAISON_RESULTAT::ORIGINE_CONSERVEE,i); |
111 |
|
|
int dim=ele->get_dimension(); |
112 |
|
|
if (dim==0) |
113 |
|
|
{ |
114 |
|
|
MG_SOMMET* som=(MG_SOMMET*)ele; |
115 |
|
|
int nblien=som->get_lien_maillage()->get_nb(); |
116 |
|
|
for (int j=0;j<nblien;j++) |
117 |
|
|
{ |
118 |
|
|
MG_NOEUD* no=(MG_NOEUD*)som->get_lien_maillage()->get(j); |
119 |
|
|
if ((maiorigine->get_mg_noeudid(no->get_id())!=NULL) && (no->get_nouveau_numero()==CONSERVE)) |
120 |
|
|
{ |
121 |
|
|
MG_SOMMET* nvsom=geomodifie->get_mg_sommetid(rescmp.get_liste_correspondance_modifie(som->get_id())); |
122 |
|
|
transfert_noeud(no,nvsom); |
123 |
|
|
} |
124 |
|
|
} |
125 |
|
|
|
126 |
|
|
} |
127 |
|
|
} |
128 |
|
|
// etape 3 maillage 0d |
129 |
couturad |
966 |
if (etape<3) return OK; |
130 |
francois |
283 |
affiche((char*)" MAILLAGE 0D"); |
131 |
|
|
MAILLEUR0D m0d(maimodifie,geomodifie); |
132 |
|
|
m0d.adapte(); |
133 |
|
|
// etape 4 destruction autour des nouveaux sommets |
134 |
couturad |
966 |
if (etape<4) return OK; |
135 |
francois |
283 |
affiche((char*)" Destruction autour des nouveaux sommets"); |
136 |
|
|
lstdetruire.vide(); |
137 |
|
|
nb=rescmp.get_nb_liste_topologie(VCT_COMPARAISON_RESULTAT::MODIFIE_APPARUE); |
138 |
|
|
for (int i=0;i<nb;i++) |
139 |
|
|
{ |
140 |
|
|
MG_ELEMENT_TOPOLOGIQUE* ele=rescmp.get_liste_topologie(VCT_COMPARAISON_RESULTAT::MODIFIE_APPARUE,i); |
141 |
|
|
int dim=ele->get_dimension(); |
142 |
|
|
if (dim==0) |
143 |
|
|
{ |
144 |
|
|
MG_SOMMET* som=(MG_SOMMET*)ele; |
145 |
|
|
int nblien=som->get_lien_maillage()->get_nb(); |
146 |
|
|
for (int j=0;j<nblien;j++) |
147 |
|
|
{ |
148 |
|
|
MG_NOEUD* no=(MG_NOEUD*)som->get_lien_maillage()->get(j); |
149 |
|
|
if (maimodifie->get_mg_noeudid(no->get_id())!=NULL) lstdetruire.ajouter(no); |
150 |
|
|
} |
151 |
|
|
} |
152 |
|
|
} |
153 |
|
|
for (MG_ELEMENT_MAILLAGE* ele=lstdetruire.get_premier(it);ele!=NULL;ele=lstdetruire.get_suivant(it)) |
154 |
|
|
{ |
155 |
|
|
detruit_noeud(ele,-1,1); |
156 |
|
|
} |
157 |
|
|
// etape 5 transferts des segments d arete |
158 |
couturad |
966 |
if (etape<5) return OK; |
159 |
francois |
283 |
/*affiche(" Transfert arete"); |
160 |
|
|
nb=rescmp.get_nb_liste_topologie(ORIGINE_CONSERVEE); |
161 |
|
|
for (int i=0;i<nb;i++) |
162 |
|
|
{ |
163 |
|
|
MG_ELEMENT_TOPOLOGIQUE* ele=rescmp.get_liste_topologie(ORIGINE_CONSERVEE,i); |
164 |
|
|
int dim=ele->get_dimension(); |
165 |
|
|
if (dim==1) |
166 |
|
|
{ |
167 |
|
|
MG_ARETE* are=(MG_ARETE*)ele; |
168 |
|
|
int nblien=are->get_lien_maillage()->get_nb(); |
169 |
|
|
for (int j=0;j<nblien;j++) |
170 |
|
|
{ |
171 |
|
|
MG_SEGMENT* seg=(MG_SEGMENT*)are->get_lien_maillage()->get(j); |
172 |
|
|
if ((maiorigine->get_mg_segmentid(seg->get_id())!=NULL)) |
173 |
|
|
{ |
174 |
|
|
MG_NOEUD* n1=seg->get_noeud1(); |
175 |
|
|
MG_NOEUD* n2=seg->get_noeud2(); |
176 |
|
|
if (n1->get_nouveau_numero()==CONSERVE) |
177 |
|
|
if (n2->get_nouveau_numero()==CONSERVE) |
178 |
|
|
{ |
179 |
|
|
MG_ARETE* nvare=geomodifie->get_mg_areteid(rescmp.get_liste_correspondance(are->get_id())); |
180 |
|
|
MG_NOEUD* nv1=get_liste_correspondance(n1); |
181 |
|
|
MG_NOEUD* nv2=get_liste_correspondance(n2); |
182 |
|
|
if (nv1==NULL) nv1=transfert_noeud(n1,nvare); |
183 |
|
|
if (nv2==NULL) nv2=transfert_noeud(n2,nvare); |
184 |
|
|
MG_SEGMENT *seg=new MG_SEGMENT(nvare,nv1,nv2,IMPOSE); |
185 |
|
|
maimodifie->ajouter_mg_segment(seg); |
186 |
|
|
} |
187 |
|
|
} |
188 |
|
|
} |
189 |
|
|
|
190 |
|
|
} |
191 |
|
|
} |
192 |
|
|
*/ |
193 |
|
|
affiche((char*)" Creation des blocs de maille 1D"); |
194 |
|
|
int nbarete=geomodifie->get_nb_mg_arete(); |
195 |
|
|
nb=rescmp.get_nb_liste_topologie(VCT_COMPARAISON_RESULTAT::ORIGINE_CONSERVEE); |
196 |
|
|
for (int i=0;i<nb;i++) |
197 |
|
|
{ |
198 |
|
|
MG_ELEMENT_TOPOLOGIQUE* ele=rescmp.get_liste_topologie(VCT_COMPARAISON_RESULTAT::ORIGINE_CONSERVEE,i); |
199 |
|
|
int dim=ele->get_dimension(); |
200 |
|
|
if (dim==1) |
201 |
|
|
{ |
202 |
couturad |
951 |
std::multimap<unsigned long,MG_SEGMENT*,std::less <unsigned long> > lstseg; |
203 |
francois |
283 |
MG_ARETE* arete=(MG_ARETE*)ele; |
204 |
|
|
TPL_SET<MG_ELEMENT_MAILLAGE*>::ITERATEUR ittet; |
205 |
|
|
for (MG_ELEMENT_MAILLAGE* ele=arete->get_lien_maillage()->get_premier(ittet);ele!=NULL;ele=arete->get_lien_maillage()->get_suivant(ittet)) |
206 |
|
|
{ |
207 |
|
|
MG_SEGMENT* seg=(MG_SEGMENT*)ele; |
208 |
|
|
if ((maiorigine->get_mg_segmentid(seg->get_id())!=NULL)) |
209 |
|
|
{ |
210 |
|
|
MG_NOEUD* n1=seg->get_noeud1(); |
211 |
|
|
MG_NOEUD* n2=seg->get_noeud2(); |
212 |
|
|
if (n1->get_nouveau_numero()==CONSERVE) |
213 |
|
|
if (n2->get_nouveau_numero()==CONSERVE) |
214 |
|
|
{ |
215 |
|
|
seg->change_nouveau_numero(NONTRAITE); |
216 |
couturad |
951 |
std::pair<unsigned long,MG_SEGMENT*> tmp(n1->get_id(),seg); |
217 |
francois |
283 |
lstseg.insert(tmp); |
218 |
couturad |
951 |
std::pair<unsigned long,MG_SEGMENT*> tmp2(n2->get_id(),seg); |
219 |
francois |
283 |
lstseg.insert(tmp2); |
220 |
|
|
} |
221 |
|
|
} |
222 |
|
|
} |
223 |
|
|
|
224 |
|
|
cree_bloc_maille(lstseg,arete); |
225 |
|
|
} |
226 |
|
|
} |
227 |
|
|
// etape 6 Maillage des aretes |
228 |
couturad |
966 |
if (etape<6) return OK; |
229 |
francois |
283 |
affiche((char*)" MAILLAGE 1D"); |
230 |
|
|
int nbare=geomodifie->get_nb_mg_arete(); |
231 |
|
|
for (int i=0;i<nbare;i++) |
232 |
|
|
{ |
233 |
|
|
MG_ARETE* arete=geomodifie->get_mg_arete(i); |
234 |
|
|
TPL_LISTE_ENTITE<double> param; |
235 |
|
|
int typeface=arete->get_courbe()->get_type_geometrique(param); |
236 |
couturad |
951 |
std::multimap<unsigned long,BLOC_MAILLE_1D*,std::less <unsigned long> >::iterator it=lstb1d.begin(); |
237 |
francois |
283 |
while (it!=lstb1d.end()) |
238 |
|
|
{ |
239 |
|
|
BLOC_MAILLE_1D *b1d=(*it).second; |
240 |
|
|
if ((b1d->etat==NONATTACHE) && (b1d->type==typeface)) |
241 |
|
|
{ |
242 |
|
|
MG_NOEUD* no1=b1d->lst[0]->get_noeud1(); |
243 |
|
|
MG_NOEUD* no2=b1d->lst[0]->get_noeud2(); |
244 |
|
|
double xyz1[3],xyz2[3],xyz[3]; |
245 |
|
|
transfert_coord(no1->get_coord(),xyz1); |
246 |
|
|
transfert_coord(no2->get_coord(),xyz2); |
247 |
|
|
double t1,t2; |
248 |
|
|
arete->inverser(t1,xyz1); |
249 |
|
|
arete->inverser(t2,xyz2); |
250 |
|
|
int sensidentique=1; |
251 |
|
|
OT_VECTEUR_3D vec(xyz1,xyz2); |
252 |
|
|
vec.norme(); |
253 |
|
|
double dxyz1[3]; |
254 |
|
|
arete->deriver(t1,dxyz1); |
255 |
|
|
OT_VECTEUR_3D dvec(dxyz1); |
256 |
|
|
dvec.norme(); |
257 |
|
|
double ps=dvec*vec; |
258 |
|
|
if (ps <0) sensidentique=0; |
259 |
|
|
if (sensidentique==0) |
260 |
|
|
{ |
261 |
|
|
double t=t1; |
262 |
|
|
t1=t2; |
263 |
|
|
t2=t; |
264 |
|
|
double xyz[3]; |
265 |
|
|
xyz[0]=xyz1[0]; |
266 |
|
|
xyz[1]=xyz1[1]; |
267 |
|
|
xyz[2]=xyz1[2]; |
268 |
|
|
xyz1[0]=xyz2[0]; |
269 |
|
|
xyz1[1]=xyz2[1]; |
270 |
|
|
xyz1[2]=xyz2[2]; |
271 |
|
|
xyz2[0]=xyz[0]; |
272 |
|
|
xyz2[1]=xyz[1]; |
273 |
|
|
xyz2[2]=xyz[2]; |
274 |
|
|
} |
275 |
|
|
if (arete->get_courbe()->est_periodique()==1) |
276 |
|
|
{ |
277 |
|
|
//if (t1<arete->get_tmin()) t1=t1+arete->get_courbe()->get_periode(); |
278 |
|
|
if (t2<t1+1e-6) t2=t2+arete->get_courbe()->get_periode(); |
279 |
|
|
} |
280 |
|
|
double xyz1tmp[3],xyz2tmp[3]; |
281 |
|
|
arete->evaluer(t1,xyz1tmp); |
282 |
|
|
arete->evaluer(t2,xyz2tmp); |
283 |
|
|
OT_VECTEUR_3D vec1(xyz1,xyz1tmp); |
284 |
|
|
OT_VECTEUR_3D vec2(xyz2,xyz2tmp); |
285 |
|
|
double metrique[9]; |
286 |
|
|
cartemod->evaluer(xyz1,metrique); |
287 |
|
|
double eps=(1./sqrt(metrique[0])*1e-6); |
288 |
|
|
double t=0.5*(t1+t2); |
289 |
|
|
if ((vec1.get_longueur()<eps)&&(vec2.get_longueur()<eps)) |
290 |
|
|
{ |
291 |
|
|
if (arete->get_courbe()->est_periodique()==1) |
292 |
|
|
if (t<arete->get_tmin()) t=t+arete->get_courbe()->get_periode(); |
293 |
|
|
if ((t>=arete->get_tmin()) && (t<=arete->get_tmax())) |
294 |
|
|
{ |
295 |
|
|
int nbseg=b1d->lst.size(); |
296 |
|
|
b1d->etat=ATTACHE; |
297 |
|
|
for (int i=0;i<nbseg;i++) |
298 |
|
|
{ |
299 |
|
|
MG_SEGMENT *seg=b1d->lst[i]; |
300 |
|
|
MG_NOEUD* no1=seg->get_noeud1(); |
301 |
|
|
MG_NOEUD* no2=seg->get_noeud2(); |
302 |
|
|
double xyz1[3],xy2[3]; |
303 |
|
|
transfert_coord(no1->get_coord(),xyz1); |
304 |
|
|
transfert_coord(no2->get_coord(),xyz2); |
305 |
|
|
MG_NOEUD* nv1=get_liste_correspondance(no1); |
306 |
|
|
MG_NOEUD* nv2=get_liste_correspondance(no2); |
307 |
|
|
if (nv1==NULL) nv1=transfert_noeud(no1,arete); |
308 |
|
|
if (nv2==NULL) nv2=transfert_noeud(no2,arete); |
309 |
|
|
MG_SEGMENT *nvseg; |
310 |
|
|
if (sensidentique==1) |
311 |
francois |
791 |
nvseg=new MG_SEGMENT(arete,nv1,nv2,MAGIC::ORIGINE::IMPOSE); |
312 |
francois |
283 |
else |
313 |
francois |
791 |
nvseg=new MG_SEGMENT(arete,nv2,nv1,MAGIC::ORIGINE::IMPOSE); |
314 |
francois |
283 |
maimodifie->ajouter_mg_segment(nvseg); |
315 |
|
|
} |
316 |
|
|
} |
317 |
|
|
} |
318 |
|
|
} |
319 |
|
|
it++; |
320 |
|
|
} |
321 |
francois |
446 |
MAILLEUR1D m1d(maimodifie,geomodifie,cartemod,arete); |
322 |
francois |
283 |
m1d.adapte(); |
323 |
|
|
} |
324 |
|
|
//cree_quadtree(maimodifie,quad,&lstsegfront); |
325 |
|
|
// etape 7 Destruction autour des nouveaux segments |
326 |
couturad |
966 |
if (etape<7) return OK; |
327 |
francois |
283 |
affiche((char*)" Destruction autour des nouvelles aretes"); |
328 |
|
|
lstdetruire.vide(); |
329 |
|
|
/*nb=rescmp.get_nb_liste_topologie(MODIFIE_APPARUE); |
330 |
|
|
for (int i=0;i<nb;i++) |
331 |
|
|
{ |
332 |
|
|
MG_ELEMENT_TOPOLOGIQUE* ele=rescmp.get_liste_topologie(MODIFIE_APPARUE,i); |
333 |
|
|
int dim=ele->get_dimension(); |
334 |
|
|
if (dim==1) |
335 |
|
|
{ |
336 |
|
|
MG_ARETE* are=(MG_ARETE*)ele; |
337 |
|
|
int nblien=are->get_lien_maillage()->get_nb(); |
338 |
|
|
for (int j=0;j<nblien;j++) |
339 |
|
|
{ |
340 |
|
|
MG_SEGMENT* seg=(MG_SEGMENT*)are->get_lien_maillage()->get(j); |
341 |
|
|
if (maimodifie->get_mg_segmentid(seg->get_id())!=NULL) |
342 |
|
|
{ |
343 |
|
|
lstnoeuddetruire.ajouter(seg->get_noeud1()); |
344 |
|
|
lstnoeuddetruire.ajouter(seg->get_noeud2()); |
345 |
|
|
} |
346 |
|
|
} |
347 |
|
|
} |
348 |
|
|
}*/ |
349 |
|
|
LISTE_MG_SEGMENT::iterator itnvseg; |
350 |
|
|
for (MG_SEGMENT* seg=maimodifie->get_premier_segment(itnvseg);seg!=NULL;seg=maimodifie->get_suivant_segment(itnvseg)) |
351 |
|
|
{ |
352 |
francois |
791 |
if (seg->get_origine()==MAGIC::ORIGINE::MAILLEUR_AUTO) |
353 |
francois |
283 |
{ |
354 |
|
|
lstdetruire.ajouter(seg); |
355 |
|
|
} |
356 |
|
|
} |
357 |
|
|
for (MG_ELEMENT_MAILLAGE* ele=lstdetruire.get_premier(it);ele!=NULL;ele=lstdetruire.get_suivant(it)) |
358 |
|
|
{ |
359 |
|
|
detruit_noeud(ele,-1,2); |
360 |
|
|
} |
361 |
|
|
|
362 |
|
|
// etape 8 Creation des blocs de mailles 2D |
363 |
couturad |
966 |
if (etape<8) return OK; |
364 |
francois |
283 |
affiche((char*)" Creation des blocs de maille 2D"); |
365 |
|
|
nb=rescmp.get_nb_liste_topologie(VCT_COMPARAISON_RESULTAT::ORIGINE_CONSERVEE); |
366 |
|
|
for (int i=0;i<nb;i++) |
367 |
|
|
{ |
368 |
|
|
MG_ELEMENT_TOPOLOGIQUE* ele=rescmp.get_liste_topologie(VCT_COMPARAISON_RESULTAT::ORIGINE_CONSERVEE,i); |
369 |
|
|
int dim=ele->get_dimension(); |
370 |
|
|
if (dim==2) |
371 |
|
|
{ |
372 |
couturad |
951 |
std::multimap<unsigned long,MG_TRIANGLE*,std::less <unsigned long> > lsttri; |
373 |
francois |
283 |
MG_FACE* face=(MG_FACE*)ele; |
374 |
|
|
TPL_SET<MG_ELEMENT_MAILLAGE*>::ITERATEUR ittet; |
375 |
|
|
int compteur=0,compteur2=0; |
376 |
|
|
for (MG_ELEMENT_MAILLAGE* ele=face->get_lien_maillage()->get_premier(ittet);ele!=NULL;ele=face->get_lien_maillage()->get_suivant(ittet)) |
377 |
|
|
{ |
378 |
|
|
MG_TRIANGLE* tri=(MG_TRIANGLE*)ele; |
379 |
|
|
if ((maiorigine->get_mg_triangleid(tri->get_id())!=NULL)) |
380 |
|
|
{ |
381 |
|
|
MG_NOEUD* n1=tri->get_noeud1(); |
382 |
|
|
MG_NOEUD* n2=tri->get_noeud2(); |
383 |
|
|
MG_NOEUD* n3=tri->get_noeud3(); |
384 |
|
|
compteur2++; |
385 |
|
|
if (n1->get_nouveau_numero()==CONSERVE) |
386 |
|
|
if (n2->get_nouveau_numero()==CONSERVE) |
387 |
|
|
if (n3->get_nouveau_numero()==CONSERVE) |
388 |
|
|
{ |
389 |
|
|
tri->change_nouveau_numero(NONTRAITE); |
390 |
couturad |
951 |
std::pair<unsigned long,MG_TRIANGLE*> tmp(n1->get_id(),tri); |
391 |
francois |
283 |
lsttri.insert(tmp); |
392 |
couturad |
951 |
std::pair<unsigned long,MG_TRIANGLE*> tmp2(n2->get_id(),tri); |
393 |
francois |
283 |
lsttri.insert(tmp2); |
394 |
couturad |
951 |
std::pair<unsigned long,MG_TRIANGLE*> tmp3(n3->get_id(),tri); |
395 |
francois |
283 |
lsttri.insert(tmp3); |
396 |
|
|
compteur++; |
397 |
|
|
} |
398 |
|
|
} |
399 |
|
|
} |
400 |
|
|
|
401 |
|
|
cree_bloc_maille(lsttri,face); |
402 |
|
|
} |
403 |
|
|
} |
404 |
|
|
// etape 9 MAILLAGE 2D |
405 |
couturad |
966 |
if (etape<9) return OK; |
406 |
francois |
283 |
affiche((char*)" MAILLAGE 2D"); |
407 |
|
|
nbfacemod=geomodifie->get_nb_mg_face(); |
408 |
|
|
for (int i=0;i<nbfacemod;i++) |
409 |
|
|
{ |
410 |
|
|
MG_GEOMETRIE_OUTILS ot; |
411 |
|
|
TPL_LISTE_ENTITE<MG_TRIANGLE*> lsttricontraint; |
412 |
|
|
MG_FACE* face=geomodifie->get_mg_face(i); |
413 |
|
|
TPL_LISTE_ENTITE<double> param; |
414 |
|
|
int typeface=face->get_surface()->get_type_geometrique(param); |
415 |
couturad |
951 |
std::multimap<unsigned long,BLOC_MAILLE_2D*,std::less <unsigned long> >::iterator it=lstb2d.begin(); |
416 |
francois |
283 |
while (it!=lstb2d.end()) |
417 |
|
|
{ |
418 |
|
|
BLOC_MAILLE_2D *b2d=(*it).second; |
419 |
|
|
if ((b2d->etat==NONATTACHE) && (b2d->type==typeface)) |
420 |
|
|
{ |
421 |
|
|
MG_NOEUD* no1=b2d->lst[0]->get_noeud1(); |
422 |
|
|
MG_NOEUD* no2=b2d->lst[0]->get_noeud2(); |
423 |
|
|
MG_NOEUD* no3=b2d->lst[0]->get_noeud3(); |
424 |
|
|
double uv[2],uv1[2],uv2[2],uv3[2]; |
425 |
|
|
double xyz1[3],xyz2[3],xyz3[3]; |
426 |
|
|
transfert_coord(no1->get_coord(),xyz1); |
427 |
|
|
transfert_coord(no2->get_coord(),xyz2); |
428 |
|
|
transfert_coord(no3->get_coord(),xyz3); |
429 |
|
|
face->inverser(uv1,xyz1); |
430 |
|
|
face->inverser(uv2,xyz2); |
431 |
|
|
face->inverser(uv3,xyz3); |
432 |
francois |
317 |
if (face->get_surface()->est_periodique_u()==1) |
433 |
|
|
{ |
434 |
|
|
double eps=1e-10*face->get_surface()->get_periode_u(); |
435 |
|
|
if (uv1[0]<-eps) uv1[0]=uv1[0]+face->get_surface()->get_periode_u(); |
436 |
|
|
if (uv1[0]>face->get_surface()->get_periode_u()-eps) uv1[0]=uv1[0]-face->get_surface()->get_periode_u(); |
437 |
|
|
if (uv2[0]<-eps) uv2[0]=uv2[0]+face->get_surface()->get_periode_u(); |
438 |
|
|
if (uv2[0]>face->get_surface()->get_periode_u()-eps) uv2[0]=uv2[0]-face->get_surface()->get_periode_u(); |
439 |
|
|
if (uv3[0]<-eps) uv3[0]=uv3[0]+face->get_surface()->get_periode_u(); |
440 |
|
|
if (uv3[0]>face->get_surface()->get_periode_u()-eps) uv3[0]=uv3[0]-face->get_surface()->get_periode_u(); |
441 |
|
|
} |
442 |
|
|
if (face->get_surface()->est_periodique_v()==1) |
443 |
|
|
{ |
444 |
|
|
double eps=1e-10*face->get_surface()->get_periode_v(); |
445 |
|
|
if (uv1[1]<-eps) uv1[1]=uv1[1]+face->get_surface()->get_periode_v(); |
446 |
|
|
if (uv1[1]>face->get_surface()->get_periode_v()-eps) uv1[1]=uv1[1]-face->get_surface()->get_periode_v(); |
447 |
|
|
if (uv2[1]<-eps) uv2[1]=uv2[1]+face->get_surface()->get_periode_v(); |
448 |
|
|
if (uv2[1]>face->get_surface()->get_periode_v()-eps) uv2[1]=uv2[1]-face->get_surface()->get_periode_v(); |
449 |
|
|
if (uv3[1]<-eps) uv3[1]=uv3[1]+face->get_surface()->get_periode_v(); |
450 |
|
|
if (uv3[1]>face->get_surface()->get_periode_v()-eps) uv3[1]=uv3[1]-face->get_surface()->get_periode_v(); |
451 |
|
|
} |
452 |
|
|
|
453 |
francois |
283 |
double xyz1tmp[3]; |
454 |
|
|
face->evaluer(uv1,xyz1tmp); |
455 |
|
|
double xyz2tmp[3]; |
456 |
|
|
face->evaluer(uv2,xyz2tmp); |
457 |
|
|
double xyz3tmp[3]; |
458 |
|
|
face->evaluer(uv3,xyz3tmp); |
459 |
|
|
OT_VECTEUR_3D vec1(xyz1,xyz1tmp); |
460 |
|
|
OT_VECTEUR_3D vec2(xyz2,xyz2tmp); |
461 |
|
|
OT_VECTEUR_3D vec3(xyz3,xyz3tmp); |
462 |
|
|
double metrique[9]; |
463 |
|
|
cartemod->evaluer(xyz1,metrique); |
464 |
|
|
double eps=(1./sqrt(metrique[0])*1e-6); |
465 |
|
|
if (vec1.get_longueur()<eps) |
466 |
|
|
if (vec2.get_longueur()<eps) |
467 |
|
|
if (vec3.get_longueur()<eps) |
468 |
|
|
{ |
469 |
|
|
OT_DECALAGE_PARAMETRE deca(face->get_surface()->get_periode_u(),face->get_surface()->get_periode_v()); |
470 |
|
|
double du=deca.calcul_decalage_parametre_u(uv1[0]); |
471 |
|
|
double dv=deca.calcul_decalage_parametre_v(uv1[1]); |
472 |
|
|
uv[0]=0.333333333333333333*(deca.decalage_parametre_u(uv1[0],du)+deca.decalage_parametre_u(uv2[0],du)+deca.decalage_parametre_u(uv3[0],du)); |
473 |
|
|
uv[1]=0.333333333333333333*(deca.decalage_parametre_v(uv1[1],dv)+deca.decalage_parametre_v(uv2[1],dv)+deca.decalage_parametre_v(uv3[1],dv)); |
474 |
|
|
uv[0]=deca.decalage_parametre_u(uv[0],-du); |
475 |
|
|
uv[1]=deca.decalage_parametre_v(uv[1],-dv); |
476 |
|
|
double dist=ot.calcule_distance_contour_face_uv(uv,face); |
477 |
|
|
if (dist>0.) |
478 |
|
|
{ |
479 |
|
|
int sensidentique=1; |
480 |
|
|
OT_VECTEUR_3D vec12(xyz1,xyz2); |
481 |
|
|
OT_VECTEUR_3D vec13(xyz1,xyz3); |
482 |
|
|
double normal[3]; |
483 |
|
|
face->calcul_normale_unitaire(uv1,normal); |
484 |
|
|
OT_VECTEUR_3D nor=vec13 & vec12; |
485 |
|
|
nor.norme(); |
486 |
|
|
if ((nor*normal)<0.) sensidentique=0; |
487 |
|
|
int nbtri=b2d->lst.size(); |
488 |
|
|
b2d->etat=ATTACHE; |
489 |
|
|
//cout << " attachment du bloc " << b2d->face->get_id(); |
490 |
|
|
for (int i=0;i<nbtri;i++) |
491 |
|
|
{ |
492 |
|
|
MG_TRIANGLE *tri=b2d->lst[i]; |
493 |
|
|
MG_NOEUD* no1=tri->get_noeud1(); |
494 |
|
|
MG_NOEUD* no2=tri->get_noeud2(); |
495 |
|
|
MG_NOEUD* no3=tri->get_noeud3(); |
496 |
|
|
double xyz1[3],xy2[3],xyz3[3]; |
497 |
|
|
transfert_coord(no1->get_coord(),xyz1); |
498 |
|
|
transfert_coord(no2->get_coord(),xyz2); |
499 |
|
|
transfert_coord(no3->get_coord(),xyz3); |
500 |
francois |
791 |
MG_NOEUD* nvno1=new MG_NOEUD(NULL,xyz1[0],xyz1[1],xyz1[2],MAGIC::ORIGINE::IMPOSE); |
501 |
|
|
MG_NOEUD* nvno2=new MG_NOEUD(NULL,xyz2[0],xyz2[1],xyz2[2],MAGIC::ORIGINE::IMPOSE); |
502 |
|
|
MG_NOEUD* nvno3=new MG_NOEUD(NULL,xyz3[0],xyz3[1],xyz3[2],MAGIC::ORIGINE::IMPOSE); |
503 |
francois |
283 |
MG_TRIANGLE* nvtri; |
504 |
|
|
if (sensidentique==1) |
505 |
francois |
791 |
nvtri=new MG_TRIANGLE(NULL,nvno1,nvno2,nvno3,NULL,NULL,NULL,MAGIC::ORIGINE::IMPOSE); |
506 |
francois |
283 |
else |
507 |
francois |
791 |
nvtri=new MG_TRIANGLE(NULL,nvno2,nvno1,nvno3,NULL,NULL,NULL,MAGIC::ORIGINE::IMPOSE); |
508 |
francois |
283 |
lsttricontraint.ajouter(nvtri); |
509 |
|
|
nvno1->change_nouveau_numero(no1->get_id()); |
510 |
|
|
nvno2->change_nouveau_numero(no2->get_id()); |
511 |
|
|
nvno3->change_nouveau_numero(no3->get_id()); |
512 |
|
|
} |
513 |
|
|
} |
514 |
|
|
} |
515 |
|
|
} |
516 |
|
|
it++; |
517 |
|
|
} |
518 |
francois |
446 |
MAILLEUR2D m2d(maimodifie,geomodifie,cartemod,face); |
519 |
francois |
283 |
char mess[50]; |
520 |
|
|
sprintf(mess," Face %i identificateur %lu",i,face->get_id()); |
521 |
|
|
affiche(mess); |
522 |
|
|
m2d.maille(face,NULL,&(lsttricontraint)); |
523 |
|
|
int nbtricon=lsttricontraint.get_nb(); |
524 |
|
|
for (int i=0;i<nbtricon;i++) |
525 |
|
|
{ |
526 |
|
|
MG_TRIANGLE* tri=lsttricontraint.get(0); |
527 |
|
|
MG_NOEUD* noeud1=tri->get_noeud1(); |
528 |
|
|
MG_NOEUD* noeud2=tri->get_noeud2(); |
529 |
|
|
MG_NOEUD* noeud3=tri->get_noeud3(); |
530 |
|
|
lsttricontraint.supprimer(tri); |
531 |
|
|
delete tri; |
532 |
|
|
delete noeud1; |
533 |
|
|
delete noeud2; |
534 |
|
|
delete noeud3; |
535 |
|
|
} |
536 |
|
|
} |
537 |
couturad |
951 |
std::multimap<unsigned long,BLOC_MAILLE_2D*,std::less <unsigned long> >::iterator itfin2=lstb2d.begin(); |
538 |
francois |
283 |
while (itfin2!=lstb2d.end()) |
539 |
|
|
{ |
540 |
|
|
delete (*itfin2).second; |
541 |
|
|
itfin2++; |
542 |
|
|
} |
543 |
|
|
cree_liste_frontiere(maimodifie); |
544 |
|
|
// etape 10 Destruction autour des nouveaux triangles |
545 |
couturad |
966 |
if (etape<10) return OK; |
546 |
francois |
283 |
affiche((char*)" Destruction autour des nouvelles faces"); |
547 |
|
|
lstdetruire.vide(); |
548 |
|
|
LISTE_MG_TRIANGLE::iterator itnvtri; |
549 |
|
|
for (MG_TRIANGLE* tri=maimodifie->get_premier_triangle(itnvtri);tri!=NULL;tri=maimodifie->get_suivant_triangle(itnvtri)) |
550 |
|
|
{ |
551 |
francois |
791 |
if (tri->get_origine()==MAGIC::ORIGINE::MAILLEUR_AUTO) |
552 |
francois |
283 |
{ |
553 |
|
|
lstdetruire.ajouter(tri); |
554 |
|
|
} |
555 |
|
|
} |
556 |
|
|
for (MG_ELEMENT_MAILLAGE* ele=lstdetruire.get_premier(it);ele!=NULL;ele=lstdetruire.get_suivant(it)) |
557 |
|
|
{ |
558 |
|
|
detruit_noeud(ele,-1,3); |
559 |
|
|
} |
560 |
|
|
// etape 11 Creation des blocs de mailles 3D |
561 |
couturad |
966 |
if (etape<11) return OK; |
562 |
francois |
283 |
affiche((char*)" Creation des blocs de maille 3D"); |
563 |
|
|
int nbvolume=geoorigine->get_nb_mg_volume(); |
564 |
|
|
for (int i=0;i<nbvolume;i++) |
565 |
|
|
{ |
566 |
couturad |
951 |
std::multimap<unsigned long,MG_TETRA*,std::less <unsigned long> > lsttet; |
567 |
francois |
283 |
MG_VOLUME* vol=geoorigine->get_mg_volume(i); |
568 |
|
|
int nblien=vol->get_lien_maillage()->get_nb(); |
569 |
|
|
TPL_SET<MG_ELEMENT_MAILLAGE*>::ITERATEUR ittet; |
570 |
|
|
for (MG_ELEMENT_MAILLAGE* ele=vol->get_lien_maillage()->get_premier(ittet);ele!=NULL;ele=vol->get_lien_maillage()->get_suivant(ittet)) |
571 |
|
|
{ |
572 |
|
|
MG_TETRA* tet=(MG_TETRA*)ele; |
573 |
|
|
if ((maiorigine->get_mg_tetraid(tet->get_id())!=NULL)) |
574 |
|
|
{ |
575 |
|
|
MG_NOEUD* n1=tet->get_noeud1(); |
576 |
|
|
MG_NOEUD* n2=tet->get_noeud2(); |
577 |
|
|
MG_NOEUD* n3=tet->get_noeud3(); |
578 |
|
|
MG_NOEUD* n4=tet->get_noeud4(); |
579 |
|
|
if (n1->get_nouveau_numero()==CONSERVE) |
580 |
|
|
if (n2->get_nouveau_numero()==CONSERVE) |
581 |
|
|
if (n3->get_nouveau_numero()==CONSERVE) |
582 |
|
|
if (n4->get_nouveau_numero()==CONSERVE) |
583 |
|
|
{ |
584 |
|
|
tet->change_nouveau_numero(NONTRAITE); |
585 |
couturad |
951 |
std::pair<unsigned long,MG_TETRA*> tmp(n1->get_id(),tet); |
586 |
francois |
283 |
lsttet.insert(tmp); |
587 |
couturad |
951 |
std::pair<unsigned long,MG_TETRA*> tmp2(n2->get_id(),tet); |
588 |
francois |
283 |
lsttet.insert(tmp2); |
589 |
couturad |
951 |
std::pair<unsigned long,MG_TETRA*> tmp3(n3->get_id(),tet); |
590 |
francois |
283 |
lsttet.insert(tmp3); |
591 |
couturad |
951 |
std::pair<unsigned long,MG_TETRA*> tmp4(n4->get_id(),tet); |
592 |
francois |
283 |
lsttet.insert(tmp4); |
593 |
|
|
} |
594 |
|
|
} |
595 |
|
|
|
596 |
|
|
} |
597 |
|
|
cree_bloc_maille(lsttet,vol); |
598 |
|
|
} |
599 |
|
|
// etape 12 Maillage 3D |
600 |
couturad |
966 |
if (etape<12) return OK; |
601 |
francois |
283 |
affiche((char*)" MAILLEUR 3D"); |
602 |
|
|
nbvolume=geomodifie->get_nb_mg_volume(); |
603 |
|
|
for (int i=0;i<nbvolume;i++) |
604 |
|
|
{ |
605 |
|
|
TPL_LISTE_ENTITE<MG_TETRA*> lsttetcontraint; |
606 |
|
|
MG_VOLUME* vol=geomodifie->get_mg_volume(i); |
607 |
couturad |
951 |
std::multimap<unsigned long,BLOC_MAILLE_3D*,std::less <unsigned long> >::iterator it=lstb3d.begin(); |
608 |
francois |
283 |
while (it!=lstb3d.end()) |
609 |
|
|
{ |
610 |
|
|
BLOC_MAILLE_3D *b3d=(*it).second; |
611 |
|
|
if (b3d->etat==NONATTACHE) |
612 |
|
|
{ |
613 |
|
|
MG_NOEUD* no1=b3d->lst[0]->get_noeud1(); |
614 |
|
|
MG_NOEUD* no2=b3d->lst[0]->get_noeud2(); |
615 |
|
|
MG_NOEUD* no3=b3d->lst[0]->get_noeud3(); |
616 |
|
|
MG_NOEUD* no4=b3d->lst[0]->get_noeud4(); |
617 |
|
|
double xyz1[3],xyz2[3],xyz3[3],xyz4[3],xyz[3]; |
618 |
|
|
transfert_coord(no1->get_coord(),xyz1); |
619 |
|
|
transfert_coord(no2->get_coord(),xyz2); |
620 |
|
|
transfert_coord(no3->get_coord(),xyz3); |
621 |
|
|
transfert_coord(no4->get_coord(),xyz4); |
622 |
|
|
xyz[0]=0.25*(xyz1[0]+xyz2[0]+xyz3[0]+xyz4[0]); |
623 |
|
|
xyz[1]=0.25*(xyz1[1]+xyz2[1]+xyz3[1]+xyz4[1]); |
624 |
|
|
xyz[2]=0.25*(xyz1[2]+xyz2[2]+xyz3[2]+xyz4[2]); |
625 |
|
|
int res=point_appartient_volume(xyz,i); |
626 |
|
|
if (res==1) |
627 |
|
|
{ |
628 |
|
|
int nbtet=b3d->lst.size(); |
629 |
|
|
b3d->etat=ATTACHE; |
630 |
|
|
//cout << "bloc recupere " << b3d->get_id() << endl; |
631 |
|
|
for (int j=0;j<nbtet;j++) |
632 |
|
|
{ |
633 |
|
|
MG_TETRA *tet=b3d->lst[j]; |
634 |
|
|
MG_NOEUD* no1=tet->get_noeud1(); |
635 |
|
|
MG_NOEUD* no2=tet->get_noeud2(); |
636 |
|
|
MG_NOEUD* no3=tet->get_noeud3(); |
637 |
|
|
MG_NOEUD* no4=tet->get_noeud4(); |
638 |
|
|
double xyz1[3],xy2[3],xyz3[3],xyz4[3]; |
639 |
|
|
transfert_coord(no1->get_coord(),xyz1); |
640 |
|
|
transfert_coord(no2->get_coord(),xyz2); |
641 |
|
|
transfert_coord(no3->get_coord(),xyz3); |
642 |
|
|
transfert_coord(no4->get_coord(),xyz4); |
643 |
francois |
791 |
MG_NOEUD* nvno1=new MG_NOEUD(NULL,xyz1[0],xyz1[1],xyz1[2],MAGIC::ORIGINE::IMPOSE); |
644 |
|
|
MG_NOEUD* nvno2=new MG_NOEUD(NULL,xyz2[0],xyz2[1],xyz2[2],MAGIC::ORIGINE::IMPOSE); |
645 |
|
|
MG_NOEUD* nvno3=new MG_NOEUD(NULL,xyz3[0],xyz3[1],xyz3[2],MAGIC::ORIGINE::IMPOSE); |
646 |
|
|
MG_NOEUD* nvno4=new MG_NOEUD(NULL,xyz4[0],xyz4[1],xyz4[2],MAGIC::ORIGINE::IMPOSE); |
647 |
|
|
MG_TETRA* nvtet=new MG_TETRA(NULL,nvno1,nvno2,nvno3,nvno4,NULL,NULL,NULL,NULL,MAGIC::ORIGINE::IMPOSE); |
648 |
francois |
283 |
lsttetcontraint.ajouter(nvtet); |
649 |
|
|
nvno1->change_nouveau_numero(no1->get_id()); |
650 |
|
|
nvno2->change_nouveau_numero(no2->get_id()); |
651 |
|
|
nvno3->change_nouveau_numero(no3->get_id()); |
652 |
|
|
nvno4->change_nouveau_numero(no4->get_id()); |
653 |
|
|
nvtet->change_nouveau_numero(tet->get_id()); |
654 |
|
|
} |
655 |
|
|
} |
656 |
|
|
} |
657 |
|
|
it++; |
658 |
|
|
} |
659 |
francois |
446 |
MAILLEUR3D m3d(maimodifie,geomodifie,cartemod,vol); |
660 |
francois |
283 |
char mess[50]; |
661 |
|
|
sprintf(mess," Volume %i identificateur %lu",i,vol->get_id()); |
662 |
|
|
affiche(mess); |
663 |
francois |
425 |
m3d.active_affichage(affiche2); |
664 |
francois |
283 |
m3d.maille(vol,NULL,&(lsttetcontraint)); |
665 |
|
|
int nbtetcon=lsttetcontraint.get_nb(); |
666 |
|
|
for (int i=0;i<nbtetcon;i++) |
667 |
|
|
{ |
668 |
|
|
MG_TETRA* tet=lsttetcontraint.get(0); |
669 |
|
|
MG_NOEUD* noeud1=tet->get_noeud1(); |
670 |
|
|
MG_NOEUD* noeud2=tet->get_noeud2(); |
671 |
|
|
MG_NOEUD* noeud3=tet->get_noeud3(); |
672 |
|
|
MG_NOEUD* noeud4=tet->get_noeud4(); |
673 |
|
|
lsttetcontraint.supprimer(tet); |
674 |
|
|
delete tet; |
675 |
|
|
delete noeud1; |
676 |
|
|
delete noeud2; |
677 |
|
|
delete noeud3; |
678 |
|
|
delete noeud4; |
679 |
|
|
} |
680 |
|
|
} |
681 |
couturad |
951 |
std::multimap<unsigned long,BLOC_MAILLE_3D*,std::less <unsigned long> >::iterator itfin3=lstb3d.begin(); |
682 |
francois |
283 |
while (itfin3!=lstb3d.end()) |
683 |
|
|
{ |
684 |
|
|
delete (*itfin3).second; |
685 |
|
|
itfin3++; |
686 |
|
|
} |
687 |
|
|
// etape 13 Recuperation des correspondances |
688 |
couturad |
966 |
if (etape<13) return OK; |
689 |
francois |
283 |
affiche((char*)" Sauvegarde des correspondances"); |
690 |
|
|
LISTE_MG_NOEUD::iterator itnoeud; |
691 |
|
|
for (MG_NOEUD* noeud=maimodifie->get_premier_noeud(itnoeud);noeud!=NULL;noeud=maimodifie->get_suivant_noeud(itnoeud)) |
692 |
|
|
{ |
693 |
francois |
791 |
if (noeud->get_origine()==MAGIC::ORIGINE::IMPOSE) |
694 |
francois |
283 |
rescmp.ajouter_correspondance(noeud->get_nouveau_numero(),noeud->get_id()); |
695 |
|
|
} |
696 |
|
|
LISTE_MG_TETRA::iterator ittet; |
697 |
|
|
for (MG_TETRA* tet=maimodifie->get_premier_tetra(ittet);tet!=NULL;tet=maimodifie->get_suivant_tetra(ittet)) |
698 |
|
|
{ |
699 |
francois |
791 |
if (tet->get_origine()==MAGIC::ORIGINE::IMPOSE) |
700 |
francois |
283 |
rescmp.ajouter_correspondance(tet->get_nouveau_numero(),tet->get_id()); |
701 |
|
|
} |
702 |
couturad |
966 |
return OK; |
703 |
francois |
283 |
|
704 |
|
|
} |
705 |
|
|
|
706 |
|
|
|
707 |
|
|
void REMAILLEUR::initialise_octree(void) |
708 |
|
|
{ |
709 |
francois |
467 |
BOITE_3D boite=carteori->get_boite_3D(); |
710 |
|
|
double xmin=boite.get_xmin(); |
711 |
|
|
double ymin=boite.get_ymin(); |
712 |
|
|
double zmin=boite.get_zmin(); |
713 |
|
|
double xmax=boite.get_xmax(); |
714 |
|
|
double ymax=boite.get_ymax(); |
715 |
|
|
double zmax=boite.get_zmax(); |
716 |
|
|
octree=new TPL_OCTREE_FCT<MG_NOEUD*,FCT_TAILLE >; |
717 |
|
|
octree->initialiser(*carteori,xmin,ymin,zmin,xmax,ymax,zmax); |
718 |
francois |
283 |
LISTE_MG_NOEUD::iterator it; |
719 |
|
|
for (MG_NOEUD* noeud=maiorigine->get_premier_noeud(it);noeud!=NULL;noeud=maiorigine->get_suivant_noeud(it)) |
720 |
|
|
{ |
721 |
|
|
noeud->change_nouveau_numero(CONSERVE); |
722 |
|
|
octree->inserer(noeud); |
723 |
|
|
} |
724 |
|
|
|
725 |
|
|
} |
726 |
|
|
|
727 |
|
|
void REMAILLEUR::detruit_noeud(MG_ELEMENT_MAILLAGE* elebase,double distance,int type) |
728 |
|
|
{ |
729 |
francois |
791 |
if (elebase->get_origine()!=MAGIC::ORIGINE::MAILLEUR_AUTO) return; |
730 |
francois |
283 |
double xyz[3]; |
731 |
|
|
double distmin; |
732 |
|
|
OT_VECTEUR_3D direction; |
733 |
|
|
if (type==0) |
734 |
|
|
{ |
735 |
|
|
MG_NOEUD* no=(MG_NOEUD*)elebase; |
736 |
|
|
OT_VECTEUR_3D vecnoeud(no->get_coord()); |
737 |
|
|
//OT_VECTEUR_3D vecnoeud2=rescmp.change_coord_mod_ori(vecnoeud); |
738 |
|
|
OT_VECTEUR_3D vecnoeud2=vecnoeud; |
739 |
|
|
xyz[0]=vecnoeud2.get_x(); |
740 |
|
|
xyz[1]=vecnoeud2.get_y(); |
741 |
|
|
xyz[2]=vecnoeud2.get_z(); |
742 |
|
|
} |
743 |
|
|
if (type==1) |
744 |
|
|
{ |
745 |
|
|
MG_NOEUD* no=(MG_NOEUD*)elebase; |
746 |
|
|
OT_VECTEUR_3D vecnoeud(no->get_coord()); |
747 |
|
|
OT_VECTEUR_3D vecnoeud2=rescmp.change_coord_mod_ori(vecnoeud); |
748 |
|
|
xyz[0]=vecnoeud2.get_x(); |
749 |
|
|
xyz[1]=vecnoeud2.get_y(); |
750 |
|
|
xyz[2]=vecnoeud2.get_z(); |
751 |
|
|
} |
752 |
|
|
if (type==2) |
753 |
|
|
{ |
754 |
|
|
MG_SEGMENT* seg=(MG_SEGMENT*)elebase; |
755 |
|
|
OT_VECTEUR_3D vecnoeud1(seg->get_noeud1()->get_coord()); |
756 |
|
|
OT_VECTEUR_3D vecnoeud2(seg->get_noeud2()->get_coord()); |
757 |
|
|
OT_VECTEUR_3D vecnoeud=0.5*(vecnoeud1+vecnoeud2); |
758 |
|
|
OT_VECTEUR_3D vecnoeud3=rescmp.change_coord_mod_ori(vecnoeud); |
759 |
|
|
xyz[0]=vecnoeud3.get_x(); |
760 |
|
|
xyz[1]=vecnoeud3.get_y(); |
761 |
|
|
xyz[2]=vecnoeud3.get_z(); |
762 |
|
|
direction=vecnoeud2-vecnoeud1; |
763 |
|
|
distmin=direction.get_longueur()/2.; |
764 |
|
|
direction.norme(); |
765 |
|
|
} |
766 |
|
|
if (type==3) |
767 |
|
|
{ |
768 |
|
|
MG_TRIANGLE* tri=(MG_TRIANGLE*)elebase; |
769 |
|
|
OT_VECTEUR_3D vecnoeud1(tri->get_noeud1()->get_coord()); |
770 |
|
|
OT_VECTEUR_3D vecnoeud2(tri->get_noeud2()->get_coord()); |
771 |
|
|
OT_VECTEUR_3D vecnoeud3(tri->get_noeud3()->get_coord()); |
772 |
|
|
OT_VECTEUR_3D vecnoeud=0.3333333333333333*(vecnoeud1+vecnoeud2+vecnoeud3); |
773 |
|
|
OT_VECTEUR_3D vecnoeud4=rescmp.change_coord_mod_ori(vecnoeud); |
774 |
|
|
xyz[0]=vecnoeud4.get_x(); |
775 |
|
|
xyz[1]=vecnoeud4.get_y(); |
776 |
|
|
xyz[2]=vecnoeud4.get_z(); |
777 |
|
|
distmin=std::max((vecnoeud-vecnoeud1).get_longueur(),(vecnoeud-vecnoeud2).get_longueur()); |
778 |
|
|
distmin=std::max((vecnoeud-vecnoeud3).get_longueur(),distmin); |
779 |
|
|
direction=(vecnoeud3-vecnoeud1)&(vecnoeud2-vecnoeud1); |
780 |
|
|
direction.norme(); |
781 |
|
|
} |
782 |
|
|
TPL_MAP_ENTITE<MG_NOEUD*> lst; |
783 |
|
|
double Ea,Eb; |
784 |
|
|
if (type!=0) |
785 |
|
|
{ |
786 |
|
|
double m[9]; |
787 |
|
|
carteori->evaluer(xyz,m); |
788 |
|
|
Ea=1./sqrt(m[0]); |
789 |
|
|
} |
790 |
|
|
octree->rechercher(xyz[0],xyz[1],xyz[2],2*Ea,lst); |
791 |
|
|
double alpha=1.05; |
792 |
|
|
distmin=distmin*alpha; |
793 |
|
|
LISTE_MG_NOEUD::iterator it; |
794 |
|
|
for (MG_NOEUD* noeud=lst.get_premier(it);noeud!=NULL;noeud=lst.get_suivant(it)) |
795 |
|
|
{ |
796 |
|
|
double *xyztmp=noeud->get_coord(); |
797 |
|
|
OT_VECTEUR_3D vec(xyz,xyztmp); |
798 |
|
|
if (type!=0) |
799 |
|
|
{ |
800 |
|
|
double m[9]; |
801 |
|
|
carteori->evaluer(xyztmp,m); |
802 |
|
|
Eb=1./sqrt(m[0]); |
803 |
|
|
distance=std::max(1.5*Ea,1.5*Eb); |
804 |
|
|
distance=std::max(distance,2.6*fabs(Ea-Eb)); |
805 |
|
|
} |
806 |
|
|
if (type==2) |
807 |
|
|
{ |
808 |
|
|
double cosinus=vec*direction/vec.get_longueur(); |
809 |
|
|
double sinus=sqrt(1-cosinus*cosinus); |
810 |
|
|
double facteur; |
811 |
|
|
if (OPERATEUR::egal(cosinus,0.,0.000001)) facteur=distance; |
812 |
|
|
else |
813 |
|
|
{ |
814 |
|
|
double delta=sinus*sinus+4.*distance*distance/distmin/distmin*cosinus*cosinus; |
815 |
|
|
facteur=(-sinus+sqrt(delta))/2./distance/cosinus/cosinus*distmin*distmin; |
816 |
|
|
distance=facteur; |
817 |
|
|
} |
818 |
|
|
} |
819 |
|
|
if (type==3) |
820 |
|
|
{ |
821 |
|
|
double sinus=vec*direction/vec.get_longueur(); |
822 |
|
|
if (sinus>-0.0000001) |
823 |
|
|
{ |
824 |
|
|
double cosinus=sqrt(1-sinus*sinus); |
825 |
|
|
double facteur; |
826 |
|
|
if (OPERATEUR::egal(cosinus,0.,0.000001)) facteur=distance; |
827 |
|
|
else |
828 |
|
|
{ |
829 |
|
|
double delta=sinus*sinus+4*distance*distance/distmin/distmin*cosinus*cosinus; |
830 |
|
|
facteur=(-sinus+sqrt(delta))/2./distance/cosinus/cosinus*distmin*distmin; |
831 |
|
|
distance=facteur; |
832 |
|
|
} |
833 |
|
|
} |
834 |
|
|
|
835 |
|
|
} |
836 |
|
|
if (vec.get_longueur()<distance) |
837 |
|
|
{ |
838 |
|
|
noeud->change_nouveau_numero(DETRUIT); |
839 |
|
|
} |
840 |
|
|
|
841 |
|
|
} |
842 |
|
|
|
843 |
|
|
} |
844 |
|
|
|
845 |
|
|
|
846 |
|
|
/*void REMAILLEUR::cree_quadtree(MG_MAILLAGE* mai,TPL_QUADTREE<MG_SEGMENT_FRONTIERE*,MG_NOEUD*> **quad,TPL_MAP_ENTITE<MG_SEGMENT_FRONTIERE*> *lstsegfront) |
847 |
|
|
{ |
848 |
|
|
int nbface=mai->get_mg_geometrie()->get_nb_mg_face(); |
849 |
|
|
for (int i=0;i<nbface;i++) |
850 |
|
|
{ |
851 |
|
|
((quad[i]))=new TPL_QUADTREE<MG_SEGMENT_FRONTIERE*,MG_NOEUD*>; |
852 |
|
|
TPL_LISTE_ENTITE<MG_NOEUD*> lstn; |
853 |
|
|
double umax=-1e300; |
854 |
|
|
double vmax=-1e300; |
855 |
|
|
double umin=1e300; |
856 |
|
|
double vmin=1e300; |
857 |
|
|
MG_FACE* face=mai->get_mg_geometrie()->get_mg_face(i); |
858 |
|
|
int nbboucle=face->get_nb_mg_boucle(); |
859 |
|
|
int nbsegfravant=lstsegfront->get_nb(); |
860 |
|
|
for (int j=0;j<nbboucle;j++) |
861 |
|
|
{ |
862 |
|
|
MG_BOUCLE* bou=face->get_mg_boucle(j); |
863 |
|
|
int nbarete=bou->get_nb_mg_coarete(); |
864 |
|
|
for (int k=0;k<nbarete;k++) |
865 |
|
|
{ |
866 |
|
|
MG_ARETE* are=bou->get_mg_coarete(k)->get_arete(); |
867 |
|
|
int nbseg=are->get_lien_maillage()->get_nb(); |
868 |
|
|
for (int l=0;l<nbseg;l++) |
869 |
|
|
{ |
870 |
|
|
MG_SEGMENT* seg=(MG_SEGMENT*)are->get_lien_maillage()->get(l); |
871 |
|
|
if (mai->get_mg_segmentid(seg->get_id())==NULL) continue; |
872 |
|
|
double *xyz=seg->get_noeud1()->get_coord(); |
873 |
|
|
double uv[2]; |
874 |
|
|
face->inverser(uv,xyz); |
875 |
|
|
seg->get_noeud1()->change_u(uv[0]); |
876 |
|
|
seg->get_noeud1()->change_v(uv[1]); |
877 |
|
|
xyz=seg->get_noeud2()->get_coord(); |
878 |
|
|
face->inverser(uv,xyz); |
879 |
|
|
seg->get_noeud2()->change_u(uv[0]); |
880 |
|
|
seg->get_noeud2()->change_v(uv[1]); |
881 |
|
|
lstn.ajouter(seg->get_noeud2()); |
882 |
|
|
if (uv[0]<umin) umin=uv[0]; |
883 |
|
|
if (uv[0]>umax) umax=uv[0]; |
884 |
|
|
if (uv[1]<vmin) vmin=uv[1]; |
885 |
|
|
if (uv[1]>vmax) vmax=uv[1]; |
886 |
|
|
MG_SEGMENT_FRONTIERE* segfr=new MG_SEGMENT_FRONTIERE(seg); |
887 |
|
|
lstsegfront->ajouter(segfr); |
888 |
|
|
} |
889 |
|
|
} |
890 |
|
|
} |
891 |
|
|
double periodeenu=face->get_surface()->get_periode_u(); |
892 |
|
|
double periodeenv=face->get_surface()->get_periode_v(); |
893 |
|
|
if (periodeenu!=0.0) |
894 |
|
|
{ |
895 |
|
|
umin=0.; |
896 |
|
|
umax=periodeenu; |
897 |
|
|
} |
898 |
|
|
else |
899 |
|
|
{ |
900 |
|
|
double diff=umax-umin; |
901 |
|
|
umin=umin-0.125*diff; |
902 |
|
|
umax=umax+0.125*diff; |
903 |
|
|
} |
904 |
|
|
if (periodeenv!=0.0) |
905 |
|
|
{ |
906 |
|
|
vmin=0.; |
907 |
|
|
vmax=periodeenv; |
908 |
|
|
} |
909 |
|
|
else |
910 |
|
|
{ |
911 |
|
|
double diff=vmax-vmin; |
912 |
|
|
vmin=vmin-0.125*diff; |
913 |
|
|
vmax=vmax+0.125*diff; |
914 |
|
|
} |
915 |
|
|
(quad[i])->initialiser(&lstn,1,umin,vmin,umax,vmax,face->get_surface()->get_periode_u(),face->get_surface()->get_periode_v()); |
916 |
|
|
int nbsegfr=lstsegfront->get_nb(); |
917 |
|
|
for (int j=nbsegfravant;j<nbsegfr;j++) |
918 |
|
|
{ |
919 |
|
|
double *uv=lstsegfront->get(j)->get_uv1(); |
920 |
|
|
uv[0]=lstsegfront->get(j)->get_segment()->get_noeud1()->get_u(); |
921 |
|
|
uv[1]=lstsegfront->get(j)->get_segment()->get_noeud1()->get_v(); |
922 |
|
|
uv=lstsegfront->get(j)->get_uv2(); |
923 |
|
|
uv[0]=lstsegfront->get(j)->get_segment()->get_noeud2()->get_u(); |
924 |
|
|
uv[1]=lstsegfront->get(j)->get_segment()->get_noeud2()->get_v(); |
925 |
|
|
(quad[i])->inserer( lstsegfront->get(j)); |
926 |
|
|
} |
927 |
|
|
} |
928 |
|
|
|
929 |
|
|
} |
930 |
|
|
*/ |
931 |
|
|
void REMAILLEUR::cree_liste_frontiere(MG_MAILLAGE* mai) |
932 |
|
|
{ |
933 |
|
|
int nbvolume=mai->get_mg_geometrie()->get_nb_mg_volume(); |
934 |
|
|
for (int i=0;i<nbvolume;i++) |
935 |
|
|
{ |
936 |
|
|
MG_VOLUME* vol=mai->get_mg_geometrie()->get_mg_volume(i); |
937 |
|
|
int nbco=vol->get_nb_mg_coquille(); |
938 |
|
|
for (int j=0;j<nbco;j++) |
939 |
|
|
{ |
940 |
|
|
MG_COQUILLE* coq=vol->get_mg_coquille(j); |
941 |
|
|
int nbface=coq->get_nb_mg_coface(); |
942 |
|
|
for (int k=0;k<nbface;k++) |
943 |
|
|
{ |
944 |
|
|
MG_FACE* face=coq->get_mg_coface(k)->get_face(); |
945 |
|
|
int nbseg=face->get_lien_maillage()->get_nb(); |
946 |
|
|
for (int l=0;l<nbseg;l++) |
947 |
|
|
{ |
948 |
|
|
MG_TRIANGLE* tri=(MG_TRIANGLE*)face->get_lien_maillage()->get(l); |
949 |
|
|
if (mai->get_mg_triangleid(tri->get_id())==NULL) continue; |
950 |
|
|
lsttrifront[i].ajouter(tri); |
951 |
|
|
} |
952 |
|
|
} |
953 |
|
|
} |
954 |
|
|
|
955 |
|
|
|
956 |
|
|
} |
957 |
|
|
} |
958 |
|
|
|
959 |
|
|
|
960 |
|
|
|
961 |
|
|
void REMAILLEUR::ajouter_liste_correspondance_noeud(MG_NOEUD* n1,MG_NOEUD* n2) |
962 |
|
|
{ |
963 |
|
|
CORRESPONDANCENOEUD corr(n1,n2); |
964 |
couturad |
951 |
std::pair<unsigned long,CORRESPONDANCENOEUD> tmp(n1->get_id(),corr); |
965 |
francois |
283 |
lstcorrnoeud.insert(tmp); |
966 |
|
|
} |
967 |
|
|
|
968 |
|
|
MG_NOEUD* REMAILLEUR::get_liste_correspondance(MG_NOEUD* n1) |
969 |
|
|
{ |
970 |
|
|
MG_NOEUD *n2=NULL; |
971 |
|
|
std::map<unsigned long,CORRESPONDANCENOEUD,std::less<unsigned long> >::iterator j=lstcorrnoeud.find(n1->get_id()); |
972 |
|
|
if (j!=lstcorrnoeud.end()) |
973 |
|
|
n2=(*j).second.noeudmod; |
974 |
|
|
return n2; |
975 |
|
|
} |
976 |
|
|
|
977 |
|
|
|
978 |
|
|
MG_NOEUD* REMAILLEUR::transfert_noeud(MG_NOEUD* no,MG_ELEMENT_TOPOLOGIQUE* ele) |
979 |
|
|
{ |
980 |
|
|
double *xyz=no->get_coord(); |
981 |
|
|
OT_VECTEUR_3D pt(xyz); |
982 |
|
|
OT_VECTEUR_3D nvpt=rescmp.change_coord_ori_mod(pt); |
983 |
francois |
791 |
MG_NOEUD* noeud=new MG_NOEUD(ele,nvpt.get_x(),nvpt.get_y(),nvpt.get_z(),MAGIC::ORIGINE::IMPOSE); |
984 |
francois |
283 |
maimodifie->ajouter_mg_noeud(noeud); |
985 |
|
|
ajouter_liste_correspondance_noeud(no,noeud); |
986 |
|
|
noeud->change_nouveau_numero(no->get_id()); |
987 |
|
|
return noeud; |
988 |
|
|
} |
989 |
|
|
|
990 |
|
|
void REMAILLEUR::transfert_coord(double *xyz,double *xyz2) |
991 |
|
|
{ |
992 |
|
|
OT_VECTEUR_3D pt(xyz); |
993 |
|
|
OT_VECTEUR_3D nvpt=rescmp.change_coord_ori_mod(pt); |
994 |
|
|
xyz2[0]=nvpt.get_x(); |
995 |
|
|
xyz2[1]=nvpt.get_y(); |
996 |
|
|
xyz2[2]=nvpt.get_z(); |
997 |
|
|
return; |
998 |
|
|
} |
999 |
|
|
|
1000 |
couturad |
951 |
void REMAILLEUR::cree_bloc_maille(std::multimap<unsigned long,MG_SEGMENT*,std::less <unsigned long> > &lst,MG_ARETE* arete) |
1001 |
francois |
283 |
{ |
1002 |
|
|
while (lst.size()>0) |
1003 |
|
|
{ |
1004 |
couturad |
951 |
std::multimap<unsigned long,MG_SEGMENT*,std::less <unsigned long> >::iterator it=lst.begin(); |
1005 |
francois |
283 |
MG_SEGMENT* seg=(*it).second; |
1006 |
|
|
lst.erase(it); |
1007 |
|
|
TPL_LISTE_ENTITE<double> param; |
1008 |
|
|
BLOC_MAILLE_1D *b1d=new BLOC_MAILLE_1D(arete,arete->get_courbe()->get_type_geometrique(param)); |
1009 |
couturad |
951 |
std::pair<unsigned long,BLOC_MAILLE_1D*> tmp(b1d->get_id(),b1d); |
1010 |
francois |
283 |
lstb1d.insert(tmp); |
1011 |
|
|
b1d->lst.push_back(seg); |
1012 |
|
|
seg->change_nouveau_numero(TRAITE); |
1013 |
|
|
char mess[255]; |
1014 |
francois |
479 |
sprintf(mess," Arete %lu , Bloc %d",arete->get_id(),(int)lstb1d.size()); |
1015 |
francois |
283 |
//affiche(mess); |
1016 |
|
|
int num=0; |
1017 |
|
|
while (num!=b1d->lst.size()) |
1018 |
|
|
{ |
1019 |
|
|
MG_SEGMENT* itseg=b1d->lst[num++]; |
1020 |
|
|
MG_SEGMENT* seg=trouve_segment(lst,itseg->get_noeud1()); |
1021 |
|
|
while (seg!=NULL) |
1022 |
|
|
{ |
1023 |
|
|
if (seg->get_nouveau_numero()==NONTRAITE) |
1024 |
|
|
{ |
1025 |
|
|
b1d->lst.push_back(seg); |
1026 |
|
|
seg->change_nouveau_numero(TRAITE); |
1027 |
|
|
} |
1028 |
|
|
seg=trouve_segment(lst,itseg->get_noeud1()); |
1029 |
|
|
} |
1030 |
|
|
seg=trouve_segment(lst,itseg->get_noeud2()); |
1031 |
|
|
while (seg!=NULL) |
1032 |
|
|
{ |
1033 |
|
|
if (seg->get_nouveau_numero()==NONTRAITE) |
1034 |
|
|
{ |
1035 |
|
|
b1d->lst.push_back(seg); |
1036 |
|
|
seg->change_nouveau_numero(TRAITE); |
1037 |
|
|
} |
1038 |
|
|
seg=trouve_segment(lst,itseg->get_noeud2()); |
1039 |
|
|
} |
1040 |
|
|
} |
1041 |
|
|
|
1042 |
francois |
479 |
sprintf(mess," Segment %d ",(int)b1d->lst.size()); |
1043 |
francois |
283 |
//affiche(mess); |
1044 |
|
|
} |
1045 |
|
|
} |
1046 |
|
|
|
1047 |
couturad |
951 |
void REMAILLEUR::cree_bloc_maille(std::multimap<unsigned long,MG_TRIANGLE*,std::less <unsigned long> > &lst,MG_FACE* face) |
1048 |
francois |
283 |
{ |
1049 |
|
|
while (lst.size()>0) |
1050 |
|
|
{ |
1051 |
couturad |
951 |
std::multimap<unsigned long,MG_TRIANGLE*,std::less <unsigned long> >::iterator it=lst.begin(); |
1052 |
francois |
283 |
MG_TRIANGLE* tri=(*it).second; |
1053 |
|
|
lst.erase(it); |
1054 |
|
|
TPL_LISTE_ENTITE<double> param; |
1055 |
|
|
BLOC_MAILLE_2D *b2d=new BLOC_MAILLE_2D(geoorigine->get_mg_faceid(face->get_id()),face->get_surface()->get_type_geometrique(param)); |
1056 |
couturad |
951 |
std::pair<unsigned long,BLOC_MAILLE_2D*> tmp(b2d->get_id(),b2d); |
1057 |
francois |
283 |
lstb2d.insert(tmp); |
1058 |
|
|
b2d->lst.push_back(tri); |
1059 |
|
|
tri->change_nouveau_numero(TRAITE); |
1060 |
|
|
char mess[255]; |
1061 |
francois |
479 |
sprintf(mess," Face %lu , Bloc %d",face->get_id(),(int)lstb2d.size()); |
1062 |
francois |
283 |
//affiche(mess); |
1063 |
|
|
int num=0; |
1064 |
|
|
while (num!=b2d->lst.size()) |
1065 |
|
|
{ |
1066 |
|
|
MG_TRIANGLE* ittri=b2d->lst[num++]; |
1067 |
|
|
MG_TRIANGLE* tri=trouve_triangle(lst,ittri->get_noeud1()); |
1068 |
|
|
while (tri!=NULL) |
1069 |
|
|
{ |
1070 |
|
|
if (tri->get_nouveau_numero()==NONTRAITE) |
1071 |
|
|
{ |
1072 |
|
|
b2d->lst.push_back(tri); |
1073 |
|
|
tri->change_nouveau_numero(TRAITE); |
1074 |
|
|
} |
1075 |
|
|
tri=trouve_triangle(lst,ittri->get_noeud1()); |
1076 |
|
|
} |
1077 |
|
|
tri=trouve_triangle(lst,ittri->get_noeud2()); |
1078 |
|
|
while (tri!=NULL) |
1079 |
|
|
{ |
1080 |
|
|
if (tri->get_nouveau_numero()==NONTRAITE) |
1081 |
|
|
{ |
1082 |
|
|
b2d->lst.push_back(tri); |
1083 |
|
|
tri->change_nouveau_numero(TRAITE); |
1084 |
|
|
} |
1085 |
|
|
tri=trouve_triangle(lst,ittri->get_noeud2()); |
1086 |
|
|
} |
1087 |
|
|
tri=trouve_triangle(lst,ittri->get_noeud3()); |
1088 |
|
|
while (tri!=NULL) |
1089 |
|
|
{ |
1090 |
|
|
if (tri->get_nouveau_numero()==NONTRAITE) |
1091 |
|
|
{ |
1092 |
|
|
b2d->lst.push_back(tri); |
1093 |
|
|
tri->change_nouveau_numero(TRAITE); |
1094 |
|
|
} |
1095 |
|
|
tri=trouve_triangle(lst,ittri->get_noeud3()); |
1096 |
|
|
} |
1097 |
|
|
} |
1098 |
|
|
|
1099 |
francois |
479 |
sprintf(mess," Triangle %d ",(int)b2d->lst.size()); |
1100 |
francois |
283 |
//affiche(mess); |
1101 |
|
|
} |
1102 |
|
|
} |
1103 |
|
|
|
1104 |
couturad |
951 |
void REMAILLEUR::cree_bloc_maille(std::multimap<unsigned long,MG_TETRA*,std::less <unsigned long> > &lst,MG_VOLUME* vol) |
1105 |
francois |
283 |
{ |
1106 |
|
|
while (lst.size()>0) |
1107 |
|
|
{ |
1108 |
couturad |
951 |
std::multimap<unsigned long,MG_TETRA*,std::less <unsigned long> >::iterator it=lst.begin(); |
1109 |
francois |
283 |
MG_TETRA* tet=(*it).second; |
1110 |
|
|
lst.erase(it); |
1111 |
|
|
BLOC_MAILLE_3D *b3d=new BLOC_MAILLE_3D(geoorigine->get_mg_volumeid(vol->get_id())); |
1112 |
couturad |
951 |
std::pair<unsigned long,BLOC_MAILLE_3D*> tmp(b3d->get_id(),b3d); |
1113 |
francois |
283 |
lstb3d.insert(tmp); |
1114 |
|
|
b3d->lst.push_back(tet); |
1115 |
|
|
tet->change_nouveau_numero(TRAITE); |
1116 |
|
|
char mess[255]; |
1117 |
francois |
479 |
sprintf(mess," Volume %lu , Bloc %d",vol->get_id(),(int)lstb3d.size()); |
1118 |
francois |
283 |
//affiche(mess); |
1119 |
|
|
int num=0; |
1120 |
|
|
while (num!=b3d->lst.size()) |
1121 |
|
|
{ |
1122 |
|
|
MG_TETRA* ittet=b3d->lst[num++]; |
1123 |
|
|
MG_TETRA* tet=trouve_tetra(lst,ittet->get_noeud1()); |
1124 |
|
|
while (tet!=NULL) |
1125 |
|
|
{ |
1126 |
|
|
if (tet->get_nouveau_numero()==NONTRAITE) |
1127 |
|
|
{ |
1128 |
|
|
b3d->lst.push_back(tet); |
1129 |
|
|
tet->change_nouveau_numero(TRAITE); |
1130 |
|
|
} |
1131 |
|
|
tet=trouve_tetra(lst,ittet->get_noeud1()); |
1132 |
|
|
} |
1133 |
|
|
tet=trouve_tetra(lst,ittet->get_noeud2()); |
1134 |
|
|
while (tet!=NULL) |
1135 |
|
|
{ |
1136 |
|
|
if (tet->get_nouveau_numero()==NONTRAITE) |
1137 |
|
|
{ |
1138 |
|
|
b3d->lst.push_back(tet); |
1139 |
|
|
tet->change_nouveau_numero(TRAITE); |
1140 |
|
|
} |
1141 |
|
|
tet=trouve_tetra(lst,ittet->get_noeud2()); |
1142 |
|
|
} |
1143 |
|
|
tet=trouve_tetra(lst,ittet->get_noeud3()); |
1144 |
|
|
while (tet!=NULL) |
1145 |
|
|
{ |
1146 |
|
|
if (tet->get_nouveau_numero()==NONTRAITE) |
1147 |
|
|
{ |
1148 |
|
|
b3d->lst.push_back(tet); |
1149 |
|
|
tet->change_nouveau_numero(TRAITE); |
1150 |
|
|
} |
1151 |
|
|
tet=trouve_tetra(lst,ittet->get_noeud3()); |
1152 |
|
|
} |
1153 |
|
|
tet=trouve_tetra(lst,ittet->get_noeud4()); |
1154 |
|
|
while (tet!=NULL) |
1155 |
|
|
{ |
1156 |
|
|
if (tet->get_nouveau_numero()==NONTRAITE) |
1157 |
|
|
{ |
1158 |
|
|
b3d->lst.push_back(tet); |
1159 |
|
|
tet->change_nouveau_numero(TRAITE); |
1160 |
|
|
} |
1161 |
|
|
tet=trouve_tetra(lst,ittet->get_noeud4()); |
1162 |
|
|
} |
1163 |
|
|
} |
1164 |
|
|
|
1165 |
francois |
479 |
sprintf(mess," Tetra %d ",(int)b3d->lst.size()); |
1166 |
francois |
283 |
//affiche(mess); |
1167 |
|
|
} |
1168 |
|
|
} |
1169 |
|
|
|
1170 |
|
|
|
1171 |
couturad |
951 |
MG_SEGMENT* REMAILLEUR::trouve_segment(std::multimap<unsigned long,MG_SEGMENT*,std::less <unsigned long> > &lst,MG_NOEUD* no) |
1172 |
francois |
283 |
{ |
1173 |
|
|
MG_SEGMENT* seg=NULL; |
1174 |
|
|
unsigned long id=no->get_id(); |
1175 |
couturad |
951 |
std::multimap<unsigned long,MG_SEGMENT*,std::less <unsigned long> >::iterator it=lst.find(id); |
1176 |
francois |
283 |
if (it!=lst.end()) |
1177 |
|
|
{ |
1178 |
|
|
seg=(*it).second; |
1179 |
|
|
lst.erase(it); |
1180 |
|
|
} |
1181 |
|
|
return seg; |
1182 |
|
|
} |
1183 |
|
|
|
1184 |
couturad |
951 |
MG_TRIANGLE* REMAILLEUR::trouve_triangle(std::multimap<unsigned long,MG_TRIANGLE*,std::less <unsigned long> > &lst,MG_NOEUD* no) |
1185 |
francois |
283 |
{ |
1186 |
|
|
MG_TRIANGLE* tri=NULL; |
1187 |
|
|
unsigned long id=no->get_id(); |
1188 |
couturad |
951 |
std::multimap<unsigned long,MG_TRIANGLE*,std::less <unsigned long> >::iterator it=lst.find(id); |
1189 |
francois |
283 |
if (it!=lst.end()) |
1190 |
|
|
{ |
1191 |
|
|
tri=(*it).second; |
1192 |
|
|
lst.erase(it); |
1193 |
|
|
} |
1194 |
|
|
return tri; |
1195 |
|
|
} |
1196 |
|
|
|
1197 |
couturad |
951 |
MG_TETRA* REMAILLEUR::trouve_tetra(std::multimap<unsigned long,MG_TETRA*,std::less <unsigned long> > &lst,MG_NOEUD* no) |
1198 |
francois |
283 |
{ |
1199 |
|
|
MG_TETRA* tet=NULL; |
1200 |
|
|
unsigned long id=no->get_id(); |
1201 |
couturad |
951 |
std::multimap<unsigned long,MG_TETRA*,std::less <unsigned long> >::iterator it=lst.find(id); |
1202 |
francois |
283 |
if (it!=lst.end()) |
1203 |
|
|
{ |
1204 |
|
|
tet=(*it).second; |
1205 |
|
|
lst.erase(it); |
1206 |
|
|
} |
1207 |
|
|
return tet; |
1208 |
|
|
} |
1209 |
|
|
|
1210 |
|
|
int REMAILLEUR::point_appartient_volume(double *xyz,int numvol) |
1211 |
|
|
{ |
1212 |
|
|
int ok=0; |
1213 |
|
|
int i=0; |
1214 |
couturad |
951 |
std::multimap<double,double,std::less<double> > intersection; |
1215 |
francois |
283 |
OT_VECTEUR_3D vecteur_dir; |
1216 |
|
|
while (ok==0) |
1217 |
|
|
|
1218 |
|
|
{ |
1219 |
|
|
int ok2=0; |
1220 |
|
|
while (ok2==0) |
1221 |
|
|
{ |
1222 |
|
|
MG_TRIANGLE* tri=lsttrifront[numvol].get(i); |
1223 |
|
|
MG_NOEUD* no1=tri->get_noeud1(); |
1224 |
|
|
MG_NOEUD* no2=tri->get_noeud2(); |
1225 |
|
|
MG_NOEUD* no3=tri->get_noeud3(); |
1226 |
|
|
double xb=(no1->get_x()+no2->get_x()+no3->get_x())/3.; |
1227 |
|
|
double yb=(no1->get_y()+no2->get_y()+no3->get_y())/3.; |
1228 |
|
|
double zb=(no1->get_z()+no2->get_z()+no3->get_z())/3.; |
1229 |
|
|
OT_VECTEUR_3D directeur(xb-xyz[0],yb-xyz[1],zb-xyz[2]); |
1230 |
|
|
directeur.norme(); |
1231 |
|
|
vecteur_dir=directeur; |
1232 |
|
|
OT_VECTEUR_3D n1n3(no1->get_coord(),no3->get_coord()); |
1233 |
|
|
OT_VECTEUR_3D n1n2(no1->get_coord(),no2->get_coord()); |
1234 |
|
|
OT_VECTEUR_3D n=n1n3&n1n2; |
1235 |
|
|
n.norme(); |
1236 |
|
|
double ps1=n*directeur; |
1237 |
|
|
if (fabs(ps1)<1e-6) i++; |
1238 |
|
|
else ok2=1; |
1239 |
|
|
} |
1240 |
|
|
ok2=0; |
1241 |
|
|
intersection.clear(); |
1242 |
|
|
for (int j=0;j<lsttrifront[numvol].get_nb();j++) |
1243 |
|
|
{ |
1244 |
|
|
MG_TRIANGLE* tri=lsttrifront[numvol].get(j); |
1245 |
|
|
|
1246 |
|
|
double t; |
1247 |
|
|
int res=inter_droite_triangle(xyz,vecteur_dir,tri,&t); |
1248 |
|
|
if (res==2) { |
1249 |
|
|
ok2=1; |
1250 |
|
|
break; |
1251 |
|
|
} |
1252 |
|
|
if (res==1) |
1253 |
|
|
{ |
1254 |
couturad |
951 |
std::pair<double,double> tmp(t,t); |
1255 |
francois |
283 |
intersection.insert(tmp); |
1256 |
|
|
} |
1257 |
|
|
} |
1258 |
|
|
if (ok2==0) ok=1; |
1259 |
|
|
i++; |
1260 |
|
|
|
1261 |
|
|
} |
1262 |
couturad |
951 |
std::multimap<double,double,std::less <double> >::iterator it=intersection.begin(); |
1263 |
francois |
283 |
int nbinterneg=0; |
1264 |
|
|
double tavant=1e308; |
1265 |
|
|
while (it!=intersection.end()) |
1266 |
|
|
{ |
1267 |
|
|
if ((*it).second<0.) |
1268 |
|
|
{ |
1269 |
|
|
double t=(*it).second; |
1270 |
|
|
if (!(OPERATEUR::egal(t,tavant,1e-6))) |
1271 |
|
|
nbinterneg++; |
1272 |
|
|
tavant=t; |
1273 |
|
|
} |
1274 |
|
|
it++; |
1275 |
|
|
} |
1276 |
|
|
if (nbinterneg%2==1) return 1; |
1277 |
|
|
return 0; |
1278 |
|
|
} |
1279 |
|
|
|
1280 |
|
|
|
1281 |
|
|
int REMAILLEUR::inter_droite_triangle(double *xyz,double *dir,MG_TRIANGLE* tri,double *t) |
1282 |
|
|
{ |
1283 |
|
|
int inter=0; |
1284 |
|
|
MG_NOEUD *noeud1=tri->get_noeud1(); |
1285 |
|
|
MG_NOEUD *noeud2=tri->get_noeud2(); |
1286 |
|
|
MG_NOEUD *noeud3=tri->get_noeud3(); |
1287 |
|
|
OT_VECTEUR_3D g1(noeud2->get_x()-noeud1->get_x(),noeud2->get_y()-noeud1->get_y(),noeud2->get_z()-noeud1->get_z()); |
1288 |
|
|
OT_VECTEUR_3D g2(noeud3->get_x()-noeud1->get_x(),noeud3->get_y()-noeud1->get_y(),noeud3->get_z()-noeud1->get_z()); |
1289 |
|
|
OT_VECTEUR_3D g3(dir); |
1290 |
|
|
OT_MATRICE_3D systeme(g1,g2,g3); |
1291 |
|
|
double det=systeme.get_determinant(); |
1292 |
|
|
double eps=0.333333333333*(g1.diff()+g2.diff()+g3.diff()); |
1293 |
|
|
eps=eps*eps*0.0018; |
1294 |
|
|
if (OPERATEUR::egal(det,0.0,eps)==true) |
1295 |
|
|
{ |
1296 |
|
|
OT_VECTEUR_3D g3b(xyz[0]-noeud1->get_x(),xyz[1]-noeud1->get_y(),xyz[2]-noeud1->get_z()); |
1297 |
|
|
OT_MATRICE_3D systeme2(g1,g2,g3b); |
1298 |
|
|
double det2=systeme2.get_determinant(); |
1299 |
|
|
double eps2=0.333333333333*(g1.diff()+g2.diff()+g3b.diff()); |
1300 |
|
|
eps2=18.*eps2*eps2*eps2*1e-6; |
1301 |
|
|
if (OPERATEUR::egal(det2,0.0,eps)==true) // cas 2D |
1302 |
|
|
{ |
1303 |
|
|
return 2; |
1304 |
|
|
} |
1305 |
|
|
else return 0; |
1306 |
|
|
} |
1307 |
|
|
else |
1308 |
|
|
{ |
1309 |
|
|
double x,y,z; |
1310 |
|
|
x=1.0/det*(g2.get_y()*g3.get_z()-g2.get_z()*g3.get_y()); |
1311 |
|
|
y=1.0/det*(g3.get_x()*g2.get_z()-g2.get_x()*g3.get_z()); |
1312 |
|
|
z=1.0/det*(g2.get_x()*g3.get_y()-g2.get_y()*g3.get_x()); |
1313 |
|
|
OT_VECTEUR_3D g1b(x,y,z); |
1314 |
|
|
x=1.0/det*(g3.get_y()*g1.get_z()-g1.get_y()*g3.get_z()); |
1315 |
|
|
y=1.0/det*(g1.get_x()*g3.get_z()-g3.get_x()*g1.get_z()); |
1316 |
|
|
z=1.0/det*(g3.get_x()*g1.get_y()-g1.get_x()*g3.get_y()); |
1317 |
|
|
OT_VECTEUR_3D g2b(x,y,z); |
1318 |
|
|
x=1.0/det*(g1.get_y()*g2.get_z()-g1.get_z()*g2.get_y()); |
1319 |
|
|
y=1.0/det*(g2.get_x()*g1.get_z()-g1.get_x()*g2.get_z()); |
1320 |
|
|
z=1.0/det*(g1.get_x()*g2.get_y()-g1.get_y()*g2.get_x()); |
1321 |
|
|
OT_VECTEUR_3D g3b(x,y,z); |
1322 |
|
|
OT_VECTEUR_3D n1n4(xyz[0]-noeud1->get_x(),xyz[1]-noeud1->get_y(),xyz[2]-noeud1->get_z()); |
1323 |
|
|
double alpha1=n1n4*g1b; |
1324 |
|
|
double alpha2=n1n4*g2b; |
1325 |
|
|
double alpha3=-(n1n4*g3b); |
1326 |
|
|
double alpha4=1-alpha1-alpha2; |
1327 |
|
|
double eps=0.000001; |
1328 |
|
|
if ((alpha1>-eps) && (alpha1<1.+eps)) |
1329 |
|
|
if ((alpha2>-eps) && (alpha2<1.+eps)) |
1330 |
|
|
if ((alpha4>-eps) && (alpha4<1.+eps)) { |
1331 |
|
|
*t=alpha3; |
1332 |
|
|
return 1; |
1333 |
|
|
} |
1334 |
|
|
return 0; |
1335 |
|
|
} |
1336 |
|
|
|
1337 |
|
|
} |