ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mailleur/src/mailleur2d.cpp
Revision: 1189
Committed: Tue Feb 4 17:26:49 2025 UTC (3 months ago) by francois
File size: 83454 byte(s)
Log Message:
Version 5.0 de MAGIC. Integration de ALGLIB pour faire de l'optimisation. ALGLIB se download automatiquement en executant un script dans le repertoire config update_magic.bash


File Contents

# Content
1 //####//------------------------------------------------------------
2 //####//------------------------------------------------------------
3 //####// MAGiC
4 //####// Jean Christophe Cuilliere et Vincent FRANCOIS
5 //####// Departement de Genie Mecanique - UQTR
6 //####//------------------------------------------------------------
7 //####// MAGIC est un projet de recherche de l equipe ERICCA
8 //####// du departement de genie mecanique de l Universite du Quebec a Trois Rivieres
9 //####// http://www.uqtr.ca/ericca
10 //####// http://www.uqtr.ca/
11 //####//------------------------------------------------------------
12 //####//------------------------------------------------------------
13 //####//
14 //####// mailleur2d.cpp
15 //####//
16 //####//------------------------------------------------------------
17 //####//------------------------------------------------------------
18 //####// COPYRIGHT 2000-2024
19 //####// jeu 13 jun 2024 11:58:55 EDT
20 //####//------------------------------------------------------------
21 //####//------------------------------------------------------------
22
23
24 #include "gestionversion.h"
25 #include "mailleur2d.h"
26 #include "m3d_triangle.h"
27 #include "ot_mathematique.h"
28 #include "mg_gestionnaire.h"
29 #include <fstream>
30 #include <math.h>
31 #include "mailleur2d_optimisation.h"
32 #include "mg_export.h"
33
34
35
36 MAILLEUR2D::MAILLEUR2D(MG_MAILLAGE* mgmai,MG_GEOMETRIE *mggeo,FCT_TAILLE* fct_taille,MG_FACE* mgface):MAILLEUR(false),mg_maillage(mgmai),mg_geometrie(mggeo),mg_face(mgface),metrique(fct_taille),niveau_optimisation(2)
37 {
38 }
39
40
41
42 MAILLEUR2D::~MAILLEUR2D()
43 {
44 }
45
46
47
48
49 int MAILLEUR2D::maille(MG_GROUPE_TOPOLOGIQUE* mggt)
50 {
51 if (mg_face!=NULL)
52 {
53 if(maille(mg_face)==FAIL) return FAIL;
54 }
55 else
56 {
57 TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*> lst;
58 if (mggt!=NULL)
59 {
60 std::map<MG_ELEMENT_TOPOLOGIQUE*,MG_ELEMENT_TOPOLOGIQUE*>::iterator it;
61 for(MG_ELEMENT_TOPOLOGIQUE* ele=mggt->get_premier(it);ele!=NULL;ele=mggt->get_suivant(it))
62 {
63 lst.ajouter(ele);
64 ele->get_topologie_sousjacente(&lst);
65 }
66 }
67 int nb_face=mg_geometrie->get_nb_mg_face();
68 for (int i=0;i<nb_face;i++)
69 {
70 MG_FACE* mgface=mg_geometrie->get_mg_face(i);
71 if (mggt!=NULL)
72 if (lst.existe(mgface)==0) continue;
73 if(maille(mgface)==FAIL) return FAIL;
74 }
75 }
76 return OK;
77 }
78
79
80 int MAILLEUR2D::maille(MG_FACE* mgface,TPL_LISTE_ENTITE<MG_SEGMENT*> *lstseg,TPL_LISTE_ENTITE<MG_TRIANGLE*> *lsttri)
81 {
82 periode_u=mgface->get_surface()->get_periode_u();
83 periode_v=mgface->get_surface()->get_periode_v();
84 decalage=new OT_DECALAGE_PARAMETRE(periode_u,periode_v);
85 initialise_frontiere(mgface);
86 cree_ntree(mgface);
87 TPL_MAP_ENTITE<MG_SOMMET*> liste_pole_sommet;
88 initialise_front(mgface,liste_pole_sommet);
89 if (lstseg!=NULL) insere_contrainte_segment(mgface,lstseg);
90 if (lsttri!=NULL) insere_contrainte_triangle(mgface,lsttri);
91 if (mgface->get_nb_pole()>0) traite_pole(mgface,liste_pole_sommet);
92 if(progresse_front(mgface)==FAIL)
93 {
94 delete ntree_de_segment;
95 delete ntree_de_front;
96 delete decalage;
97 return FAIL;
98 }
99 int verif=param.get_valeur("Verification_coin_face_mailleur2D");
100 TPL_LISTE_ENTITE<MG_TRIANGLE*> lsttriaffectecoin;
101 if (verif==1)
102 verifie_coin_sommet(mgface,&lsttriaffectecoin);
103 MAILLEUR2D_OPTIMISATION opt(mg_maillage,niveau_optimisation);
104 if (affichageactif==1) opt.active_affichage(affiche2);
105 opt.optimise(mgface);
106 if (verif==1)
107 for (int i=0;i<lsttriaffectecoin.get_nb();i++)
108 lsttriaffectecoin.get(i)->change_origine(MAGIC::ORIGINE::MAILLEUR_AUTO);
109 delete ntree_de_segment;
110 delete ntree_de_front;
111 delete decalage;
112 segment_frontiere.vide();
113 noeud_frontiere.vide();
114 return OK;
115 }
116
117
118 void MAILLEUR2D::traite_pole(MG_FACE* mgface,TPL_MAP_ENTITE<MG_SOMMET*> &liste_pole_sommet)
119 {
120 int nbpolesursommet=liste_pole_sommet.get_nb();
121 char message[255];
122 sprintf(message," face comportant %d pole dont %d pole sur un sommet",mgface->get_nb_pole(),nbpolesursommet);
123 affiche(message);
124 std::vector<double> liste_pole;
125 mgface->get_liste_pole_uv(&liste_pole,mg_geometrie->get_valeur_precision());
126 for (int i=0;i<liste_pole.size();i=i+2)
127 {
128 double uv[3]={liste_pole[i],liste_pole[i+1],0.};
129 double xyz[3];
130 mgface->evaluer(uv,xyz);
131 double tenseur_metrique[9];
132 metrique->evaluer(xyz,tenseur_metrique);
133 double dcible=1./sqrt(tenseur_metrique[0]);
134 MG_SOMMET* som=NULL;
135 TPL_MAP_ENTITE<MG_SOMMET*>::ITERATEUR it;
136 for (MG_SOMMET* s=liste_pole_sommet.get_premier(it);s!=NULL;s=liste_pole_sommet.get_suivant(it))
137 {
138 double xyztmp[3];
139 s->get_point()->evaluer(xyztmp);
140 OT_VECTEUR_3D vec(xyz,xyztmp);
141 if (vec.get_longueur()<1e-10*dcible) som=s;
142
143 }
144 if (som!=NULL)
145 {
146 double xyz[3];
147 som->get_point()->evaluer(xyz);
148 TPL_MAP_ENTITE<MG_FRONT_2D*> liste_trouvee;
149 TPL_MAP_ENTITE<MG_FRONT_2D*> liste_supprimer;
150 ntree_de_front->rechercher(xyz[0],xyz[1],xyz[2],0.,liste_trouvee);
151 for (int j=0;j<liste_trouvee.get_nb();j++)
152 {
153 MG_FRONT_2D *ft=liste_trouvee.get(j);
154 if (liste_supprimer.existe(ft)) continue;
155 if (ft->get_noeud2()->get_lien_topologie()==som)
156 {
157 MG_FRONT_2D *fts=ft->get_front_suivant();
158 double pu=mgface->get_surface()->get_periode_u();
159 double pv=mgface->get_surface()->get_periode_v();
160 int num=0;
161 if (pv>0) num=1;
162 MG_NOEUD* no1=ft->get_noeud1();
163 MG_NOEUD* nopo=ft->get_noeud2();
164 MG_NOEUD* no2=fts->get_noeud2();
165 MG_FRONT_2D* ftpp=ft->get_front_precedent();
166 MG_FRONT_2D* ftss=fts->get_front_suivant();
167 OT_VECTEUR_3D n1n2(ft->get_noeud1()->get_coord(),ft->get_noeud2()->get_coord());
168 OT_VECTEUR_3D n2s(fts->get_noeud1()->get_coord(),fts->get_noeud2()->get_coord());
169 n1n2.norme();
170 n2s.norme();
171 double coo[3];
172 double uv[3];
173 double uvpole[3];
174 uv[0]=ft->get_noeud2()->get_u();
175 uv[1]=ft->get_noeud2()->get_v();
176 uvpole[0]=nopo->get_u();
177 uvpole[1]=nopo->get_v();
178 uvpole[2]=0.;
179 mgface->calcul_normale_unitaire(uv,coo);
180 OT_VECTEUR_3D nplan(coo);
181 OT_VECTEUR_3D n=nplan&n1n2;
182 n.norme();
183 double cs=(-1)*(n1n2*n2s);
184 if (cs>1.) cs=1.;
185 if (cs<-1.) cs=-1.;
186 double sn=(-1)*(n*n2s);
187 double angle=acos(cs);
188 if (sn<0) angle=-angle;
189 if (angle<1e-6) angle=angle+2*M_PI;
190 int nbtri=(int)(angle*1.01/M_PI*3.);
191 liste_supprimer.ajouter(ft);
192 liste_supprimer.ajouter(fts);
193 supprimer_front(ft);
194 supprimer_front(fts);
195 MG_SEGMENT** tabseg=new MG_SEGMENT*[nbtri];
196 for (int i=0;i<nbtri;i++)
197 tabseg[i]=NULL;
198 uv[0]=no1->get_u();
199 uv[1]=no2->get_v();
200 int ierr=1;
201 do
202 {
203 if (ierr==0) uv[(num+1)%2]=uv[(num+1)%2]-(uv[(num+1)%2]-uvpole[(num+1)%2])*0.5;
204 ierr=1;
205 MG_NOEUD* noc=no1;
206 for (int i=0;i<nbtri-1;i++)
207 {
208 uv[num]=(i+1)*1.0/nbtri*angle;
209 double xyzn[3];
210 mgface->evaluer(uv,xyzn);
211 MG_NOEUD* nn=mg_maillage->ajouter_mg_noeud(mgface,xyzn[0],xyzn[1],xyzn[2],MAGIC::ORIGINE::MAILLEUR_AUTO);
212 nn->change_u(uv[0]);
213 nn->change_v(uv[1]);
214 ierr=ierr*insere_segment(mgface,&(tabseg[i]),noc,nn,MAGIC::MAILLEURFRONTALETAT::TOUS_FRONT);
215 noc=nn;
216 }
217 ierr=ierr*insere_segment(mgface,&(tabseg[nbtri-1]),noc,no2,MAGIC::MAILLEURFRONTALETAT::TOUS_FRONT);
218 }
219 while (ierr==0);
220 OT_VECTEUR_3D w(0.,0.,1.);
221 double uvn1[3]={tabseg[0]->get_noeud1()->get_u(),tabseg[0]->get_noeud1()->get_v(),0.};
222 double uvn2[3]={tabseg[0]->get_noeud2()->get_u(),tabseg[0]->get_noeud2()->get_v(),0.};
223 OT_VECTEUR_3D uvn1n2(uvn1,uvn2);
224 uvn1n2.norme();
225 OT_VECTEUR_3D uvn1pole(uvn1,uvpole);
226 uvn1pole.norme();
227 double sens=(w&uvn1n2)*uvn1pole;
228 MG_FRONT_2D* ftppcourant=ftpp;
229 if (sens>0) ftppcourant=ftss;
230 for (int i=0;i<nbtri;i++)
231 {
232 if (sens<0)
233 insere_triangle(mgface,nopo,tabseg[i]->get_noeud1(),tabseg[i]->get_noeud2());
234 else
235 insere_triangle(mgface,nopo,tabseg[i]->get_noeud2(),tabseg[i]->get_noeud1());
236 if (sens<0)
237 {
238 MG_FRONT_2D *ft=ajouter_front(front_courant,tabseg[i]->get_noeud1(),tabseg[i]->get_noeud2(),tabseg[i]);
239 ft->changer_front_precedent(ftppcourant);
240 ftppcourant->changer_front_suivant(ft);
241 ftppcourant=ft;
242 }
243 else
244 {
245 MG_FRONT_2D *ft=ajouter_front(front_courant,tabseg[i]->get_noeud2(),tabseg[i]->get_noeud1(),tabseg[i]);
246 ft->changer_front_suivant(ftppcourant);
247 ftppcourant->changer_front_precedent(ft);
248 ftppcourant=ft;
249 }
250 }
251 if (sens<0)
252 {
253 ftppcourant->changer_front_suivant(ftss);
254 ftss->changer_front_precedent(ftppcourant);
255 }
256 else
257 {
258 ftppcourant->changer_front_precedent(ftpp);
259 ftpp->changer_front_suivant(ftppcourant);
260 }
261 delete [] tabseg;
262 }
263 }
264 }
265 else
266 {
267 double pu=mgface->get_surface()->get_periode_u();
268 double pv=mgface->get_surface()->get_periode_v();
269 if (pu>0.)
270 {
271 double u1=pu/2.;
272 double v1=uv[1];
273 double u2=pu/2.;
274 double v2=uv[1]+0.001*(vmax-vmin);
275 if (v2>vmax) v2=uv[1]-0.001*(vmax-vmin);
276 double u,v;
277 metrique->ajuste_distance_metrique(mgface,u1,v1,u2,v2,u,v,sqrt(3)/3.,0,0,pas);
278 double un1=0.;
279 double un2=pu/3;
280 double un3=2*pu/3;
281 double uvn1[3]={un1,v,0.};
282 double uvn2[3]={un2,v,0.};
283 double uvn3[3]={un3,v,0.};
284 double xyzn1[3],xyzn2[3],xyzn3[3];
285 mgface->evaluer(uvn1,xyzn1);
286 mgface->evaluer(uvn2,xyzn2);
287 mgface->evaluer(uvn3,xyzn3);
288 MG_NOEUD* nn1=mg_maillage->ajouter_mg_noeud(mgface,xyzn1[0],xyzn1[1],xyzn1[2],MAGIC::ORIGINE::MAILLEUR_AUTO);
289 MG_NOEUD* nn2=mg_maillage->ajouter_mg_noeud(mgface,xyzn2[0],xyzn2[1],xyzn2[2],MAGIC::ORIGINE::MAILLEUR_AUTO);
290 MG_NOEUD* nn3=mg_maillage->ajouter_mg_noeud(mgface,xyzn3[0],xyzn3[1],xyzn3[2],MAGIC::ORIGINE::MAILLEUR_AUTO);
291 MG_SEGMENT *seg1=NULL,*seg2=NULL,*seg3=NULL;
292 int ierr1=insere_segment(mgface,&seg1,nn1,nn2,MAGIC::MAILLEURFRONTALETAT::TOUS_FRONT);
293 int ierr2=insere_segment(mgface,&seg2,nn2,nn3,MAGIC::MAILLEURFRONTALETAT::TOUS_FRONT);
294 int ierr3=insere_segment(mgface,&seg3,nn3,nn1,MAGIC::MAILLEURFRONTALETAT::TOUS_FRONT);
295 while (ierr1*ierr2*ierr3==0)
296 {
297 v=v-(v-uv[1])*0.5;
298 uvn1[1]=v;
299 uvn2[1]=v;
300 uvn3[1]=v;
301 mgface->evaluer(uvn1,xyzn1);
302 mgface->evaluer(uvn2,xyzn2);
303 mgface->evaluer(uvn3,xyzn3);
304 if (seg1!=NULL) ntree_de_segment->supprimer(seg1);
305 if (seg2!=NULL) ntree_de_segment->supprimer(seg2);
306 if (seg3!=NULL) ntree_de_segment->supprimer(seg3);
307 nn1->change_coord(xyzn1);
308 nn2->change_coord(xyzn2);
309 nn3->change_coord(xyzn3);
310 ierr1=insere_segment(mgface,&seg1,nn1,nn2,MAGIC::MAILLEURFRONTALETAT::TOUS_FRONT);
311 ierr2=insere_segment(mgface,&seg2,nn2,nn3,MAGIC::MAILLEURFRONTALETAT::TOUS_FRONT);
312 ierr3=insere_segment(mgface,&seg3,nn3,nn1,MAGIC::MAILLEURFRONTALETAT::TOUS_FRONT);
313 }
314 OT_VECTEUR_3D w(0.,0.,1.);
315 OT_VECTEUR_3D n1n2(uvn1,uvn2);
316 n1n2.norme();
317 OT_VECTEUR_3D n1pole(uvn1,uv);
318 n1pole.norme();
319 double sens=(w&n1n2)*n1pole;
320 if (sens<0)
321 {
322 insere_triangle(mgface,nn1,nn2,nn3);
323 MG_FRONT_2D *ft1=ajouter_front(front_courant,nn1,nn2,seg1);
324 MG_FRONT_2D *ft2=ajouter_front(front_courant,nn2,nn3,seg2);
325 MG_FRONT_2D *ft3=ajouter_front(front_courant,nn3,nn1,seg3);
326 ft1->changer_front_suivant(ft2);
327 ft1->changer_front_precedent(ft3);
328 ft2->changer_front_suivant(ft3);
329 ft2->changer_front_precedent(ft1);
330 ft3->changer_front_suivant(ft1);
331 ft3->changer_front_precedent(ft2);
332 }
333 else
334 {
335 insere_triangle(mgface,nn2,nn1,nn3);
336 MG_FRONT_2D *ft1=ajouter_front(front_courant,nn2,nn1,seg1);
337 MG_FRONT_2D *ft2=ajouter_front(front_courant,nn3,nn2,seg2);
338 MG_FRONT_2D *ft3=ajouter_front(front_courant,nn1,nn3,seg3);
339 ft1->changer_front_suivant(ft3);
340 ft1->changer_front_precedent(ft2);
341 ft2->changer_front_suivant(ft1);
342 ft2->changer_front_precedent(ft3);
343 ft3->changer_front_suivant(ft2);
344 ft3->changer_front_precedent(ft1);
345 }
346
347 }
348 else if (pv>0.)
349 {
350 double u1=uv[0];
351 double v1=pv/2.;
352 double u2=uv[0]+0.001*(umax-umin);;
353 double v2=pv/2;
354 if (u2>umax) u2=uv[0]-0.001*(umax-umin);
355 double u,v;
356 metrique->ajuste_distance_metrique(mgface,u1,v1,u2,v2,u,v,sqrt(3)/3.,0,0,pas);
357 double vn1=0.;
358 double vn2=pu/3;
359 double vn3=2*pu/3;
360 double uvn1[3]={u,vn1,0.};
361 double uvn2[3]={u,vn2,0.};
362 double uvn3[3]={u,vn3,0.};
363 double xyzn1[3],xyzn2[3],xyzn3[3];
364 mgface->evaluer(uvn1,xyzn1);
365 mgface->evaluer(uvn2,xyzn2);
366 mgface->evaluer(uvn3,xyzn3);
367 MG_NOEUD* nn1=mg_maillage->ajouter_mg_noeud(mgface,xyzn1[0],xyzn1[1],xyzn1[2],MAGIC::ORIGINE::MAILLEUR_AUTO);
368 MG_NOEUD* nn2=mg_maillage->ajouter_mg_noeud(mgface,xyzn2[0],xyzn2[1],xyzn2[2],MAGIC::ORIGINE::MAILLEUR_AUTO);
369 MG_NOEUD* nn3=mg_maillage->ajouter_mg_noeud(mgface,xyzn3[0],xyzn3[1],xyzn3[2],MAGIC::ORIGINE::MAILLEUR_AUTO);
370 MG_SEGMENT *seg1=NULL,*seg2=NULL,*seg3=NULL;
371 int ierr1=insere_segment(mgface,&seg1,nn1,nn2,MAGIC::MAILLEURFRONTALETAT::TOUS_FRONT);
372 int ierr2=insere_segment(mgface,&seg2,nn2,nn3,MAGIC::MAILLEURFRONTALETAT::TOUS_FRONT);
373 int ierr3=insere_segment(mgface,&seg3,nn3,nn1,MAGIC::MAILLEURFRONTALETAT::TOUS_FRONT);
374 while (ierr1*ierr2*ierr3==0)
375 {
376 u=u-(u-uv[0])*0.5;
377 uvn1[0]=u;
378 uvn2[0]=u;
379 uvn3[0]=u;
380 mgface->evaluer(uvn1,xyzn1);
381 mgface->evaluer(uvn2,xyzn2);
382 mgface->evaluer(uvn3,xyzn3);
383 if (seg1!=NULL) ntree_de_segment->supprimer(seg1);
384 if (seg2!=NULL) ntree_de_segment->supprimer(seg2);
385 if (seg3!=NULL) ntree_de_segment->supprimer(seg3);
386 nn1->change_coord(xyzn1);
387 nn2->change_coord(xyzn2);
388 nn3->change_coord(xyzn3);
389 ierr1=insere_segment(mgface,&seg1,nn1,nn2,MAGIC::MAILLEURFRONTALETAT::TOUS_FRONT);
390 ierr2=insere_segment(mgface,&seg2,nn2,nn3,MAGIC::MAILLEURFRONTALETAT::TOUS_FRONT);
391 ierr3=insere_segment(mgface,&seg3,nn3,nn1,MAGIC::MAILLEURFRONTALETAT::TOUS_FRONT);
392 }
393 OT_VECTEUR_3D w(0.,0.,1.);
394 OT_VECTEUR_3D n1n2(uvn1,uvn2);
395 n1n2.norme();
396 OT_VECTEUR_3D n1pole(uvn1,uv);
397 n1pole.norme();
398 double sens=(w&n1n2)*n1pole;
399 if (sens<0)
400 {
401 MG_FRONT_2D *ft1=ajouter_front(front_courant,nn1,nn2,seg1);
402 MG_FRONT_2D *ft2=ajouter_front(front_courant,nn2,nn3,seg2);
403 MG_FRONT_2D *ft3=ajouter_front(front_courant,nn3,nn1,seg3);
404 ft1->changer_front_suivant(ft2);
405 ft1->changer_front_precedent(ft3);
406 ft2->changer_front_suivant(ft3);
407 ft2->changer_front_precedent(ft1);
408 ft3->changer_front_suivant(ft1);
409 ft3->changer_front_precedent(ft2);
410 }
411 else
412 {
413 MG_FRONT_2D *ft1=ajouter_front(front_courant,nn2,nn1,seg1);
414 MG_FRONT_2D *ft2=ajouter_front(front_courant,nn3,nn2,seg2);
415 MG_FRONT_2D *ft3=ajouter_front(front_courant,nn1,nn3,seg3);
416 ft1->changer_front_suivant(ft3);
417 ft1->changer_front_precedent(ft2);
418 ft2->changer_front_suivant(ft1);
419 ft2->changer_front_precedent(ft3);
420 ft3->changer_front_suivant(ft2);
421 ft3->changer_front_precedent(ft1);
422 }
423
424 }
425 }
426 }
427 }
428
429
430
431
432 void MAILLEUR2D::verifie_coin_sommet(MG_FACE* mgface,TPL_LISTE_ENTITE<MG_TRIANGLE*> *lstaffectecoin)
433 {
434 TPL_MAP_ENTITE<MG_SOMMET*> lstsom;
435 int nbboucle=mgface->get_nb_mg_boucle();
436 for (int i=0;i<nbboucle;i++)
437 {
438 MG_BOUCLE *bou=mgface->get_mg_boucle(i);
439 int nbare=bou->get_nb_mg_coarete();
440 for (int j=0;j<nbare;j++)
441 {
442 lstsom.ajouter(bou->get_mg_coarete(j)->get_arete()->get_cosommet1()->get_sommet());
443 lstsom.ajouter(bou->get_mg_coarete(j)->get_arete()->get_cosommet2()->get_sommet());
444 }
445 }
446 TPL_MAP_ENTITE<MG_SOMMET*>::ITERATEUR it;
447 for (MG_SOMMET* som=lstsom.get_premier(it);som!=NULL;som=lstsom.get_suivant(it))
448 {
449 MG_NOEUD* no;
450 int i=0;
451 do
452 {
453 no=(MG_NOEUD*)som->get_lien_maillage()->get(i);
454 i++;
455 }
456 while (mg_maillage->get_mg_noeudid(no->get_id())!=no);
457 int nbtri=no->get_lien_triangle()->get_nb();
458 int nbtrivoisin=0;
459 MG_TRIANGLE* trivoi;
460 for (int i=0;i<nbtri;i++)
461 {
462 MG_TRIANGLE* tri=no->get_lien_triangle()->get(i);
463 if (mg_maillage->get_mg_triangleid(tri->get_id())!=tri) continue;
464 if (tri->get_lien_topologie()==mgface)
465 nbtrivoisin++;
466 trivoi=tri;
467 }
468 if (nbtrivoisin>1)
469 for (int i=0;i<nbtri;i++)
470 {
471 MG_TRIANGLE* tri=no->get_lien_triangle()->get(i);
472 if (mg_maillage->get_mg_triangleid(tri->get_id())!=tri) continue;
473 if (tri->get_lien_topologie()==mgface)
474 tri->change_origine(MAGIC::ORIGINE::IMPOSE);
475 lstaffectecoin->ajouter(tri);
476 }
477 if ((nbtrivoisin==1) && (trivoi->get_origine()==MAGIC::ORIGINE::MAILLEUR_AUTO))
478 {
479 MG_NOEUD *no1,*no2;
480 if (no==trivoi->get_noeud1()) {no1=trivoi->get_noeud2();no2=trivoi->get_noeud3();}
481 if (no==trivoi->get_noeud2()) {no1=trivoi->get_noeud3();no2=trivoi->get_noeud1();}
482 if (no==trivoi->get_noeud3()) {no1=trivoi->get_noeud1();no2=trivoi->get_noeud2();}
483 MG_TRIANGLE* autretri=NULL;
484 for (int i=0;i<no1->get_lien_triangle()->get_nb();i++)
485 for (int j=0;j<no2->get_lien_triangle()->get_nb();j++)
486 {
487 MG_TRIANGLE* tri1=no1->get_lien_triangle()->get(i);
488 MG_TRIANGLE* tri2=no2->get_lien_triangle()->get(j);
489 if (tri1==tri2)
490 if (tri1!=trivoi) autretri=tri1;
491 }
492 if (autretri!=NULL)
493 {
494 MG_NOEUD* autrenoeud;
495 if ((autretri->get_noeud1()!=no1) && (autretri->get_noeud1()!=no2)) autrenoeud=autretri->get_noeud1();
496 if ((autretri->get_noeud2()!=no1) && (autretri->get_noeud2()!=no2)) autrenoeud=autretri->get_noeud2();
497 if ((autretri->get_noeud3()!=no1) && (autretri->get_noeud3()!=no2)) autrenoeud=autretri->get_noeud3();
498 double nqual1=OPERATEUR::qualite_triangle(no1->get_coord(),autrenoeud->get_coord(),no->get_coord());
499 double nqual2=OPERATEUR::qualite_triangle(no2->get_coord(),no->get_coord(),autrenoeud->get_coord());
500 OT_VECTEUR_3D n1n3(no1->get_coord(),no->get_coord());
501 OT_VECTEUR_3D n1n4(no1->get_coord(),autrenoeud->get_coord());
502 double xyznormal[3];
503 double uv[2]={no1->get_u(),no1->get_v()};
504 mgface->calcul_normale_unitaire(uv,xyznormal);
505 OT_VECTEUR_3D normalface(xyznormal);
506 OT_VECTEUR_3D normal=normalface&n1n3;
507 normal.norme();
508 n1n4.norme();
509 if (normal*n1n4<0.0001) nqual1=-nqual1;
510 OT_VECTEUR_3D n2n4(no2->get_coord(),autrenoeud->get_coord());
511 OT_VECTEUR_3D n2n3(no2->get_coord(),no->get_coord());
512 double uv2[2]={no2->get_u(),no2->get_v()};
513 mgface->calcul_normale_unitaire(uv2,xyznormal);
514 OT_VECTEUR_3D normalface2(xyznormal);
515 OT_VECTEUR_3D normal2=normalface&n2n4;
516 normal2.norme();
517 n2n3.norme();
518 if (normal2*n2n3<0.0001) nqual2=-nqual2;
519 if (nqual1<1e-4) continue;
520 if (nqual2<1e-4) continue;
521 MG_TRIANGLE* tri1=insere_triangle(mgface,no1,autrenoeud,no);
522 MG_TRIANGLE* tri2=insere_triangle(mgface,no2,no,autrenoeud);
523 tri1->change_origine(MAGIC::ORIGINE::IMPOSE);
524 tri2->change_origine(MAGIC::ORIGINE::IMPOSE);
525 lstaffectecoin->ajouter(tri1);
526 lstaffectecoin->ajouter(tri2);
527 mg_maillage->supprimer_mg_triangleid(trivoi->get_id());
528 mg_maillage->supprimer_mg_triangleid(autretri->get_id());
529 }
530 }
531
532 }
533
534 }
535
536
537 void MAILLEUR2D::initialise_frontiere(MG_FACE* mgface)
538 {
539 umin=1e308;vmin=1e308;
540 umax=-1e308;vmax=-1e308;
541 int nb_boucle=mgface->get_nb_mg_boucle();
542 for (int i=0;i<nb_boucle;i++)
543 {
544 MG_BOUCLE* mgboucle=mgface->get_mg_boucle(i);
545 int nb_coarete=mgboucle->get_nb_mg_coarete();
546 for (int j=0;j<nb_coarete;j++)
547 {
548 MG_COARETE* coarete=mgboucle->get_mg_coarete(j);
549 MG_ARETE* mgarete=coarete->get_arete();
550 int nb_segment=mgarete->get_lien_maillage()->get_nb();
551 for (int k=0;k<nb_segment;k++)
552 {
553 refresh();
554 MG_SEGMENT* mgsegment=(MG_SEGMENT*)mgarete->get_lien_maillage()->get(k);
555 MG_SEGMENT* mgsegtemp=mg_maillage->get_mg_segmentid(mgsegment->get_id());
556 if (mgsegtemp==NULL) continue;
557 MG_NOEUD* mgnoeud=mgsegment->get_noeud1();
558 segment_frontiere.ajouter(mgsegment);
559 if (!noeud_frontiere.est_dans_la_liste(mgnoeud))
560 {
561 double uv[2];
562 double *coo=mgnoeud->get_coord();
563 mgface->inverser(uv,coo,1e-4);
564 if (mgface->get_surface()->est_periodique_u()==1)
565 {
566 double eps=1e-10*mgface->get_surface()->get_periode_u();
567 if (uv[0]<-eps) uv[0]=uv[0]+mgface->get_surface()->get_periode_u();
568 if (uv[0]>=mgface->get_surface()->get_periode_u()-eps) uv[0]=uv[0]-mgface->get_surface()->get_periode_u();
569 }
570 if (mgface->get_surface()->est_periodique_v()==1)
571 {
572 double eps=1e-10*mgface->get_surface()->get_periode_v();
573 if (uv[1]<-eps) uv[1]=uv[1]+mgface->get_surface()->get_periode_v();
574 if (uv[1]>=mgface->get_surface()->get_periode_v()-eps) uv[1]=uv[1]-mgface->get_surface()->get_periode_v();
575 }
576 if (uv[0]<umin) umin=uv[0];
577 if (uv[1]<vmin) vmin=uv[1];
578 if (uv[0]>umax) umax=uv[0];
579 if (uv[1]>vmax) vmax=uv[1];
580 mgnoeud->change_u(uv[0]);
581 mgnoeud->change_v(uv[1]);
582 noeud_frontiere.ajouter(mgnoeud);
583 }
584 mgnoeud=mgsegment->get_noeud2();
585 if (!noeud_frontiere.est_dans_la_liste(mgnoeud))
586 {
587 double uv[2];
588 double *coo=mgnoeud->get_coord();
589 mgface->inverser(uv,coo,1e-4);
590 if (mgface->get_surface()->est_periodique_u()==1)
591 {
592 double eps=1e-10*mgface->get_surface()->get_periode_u();
593 if (uv[0]<-eps) uv[0]=uv[0]+mgface->get_surface()->get_periode_u();
594 if (uv[0]>=mgface->get_surface()->get_periode_u()-eps) uv[0]=uv[0]-mgface->get_surface()->get_periode_u();
595 }
596 if (mgface->get_surface()->est_periodique_v()==1)
597 {
598 double eps=1e-10*mgface->get_surface()->get_periode_v();
599 if (uv[1]<-eps) uv[1]=uv[1]+mgface->get_surface()->get_periode_v();
600 if (uv[1]>=mgface->get_surface()->get_periode_v()-eps) uv[1]=uv[1]-mgface->get_surface()->get_periode_v();
601 }
602 if (uv[0]<umin) umin=uv[0];
603 if (uv[1]<vmin) vmin=uv[1];
604 if (uv[0]>umax) umax=uv[0];
605 if (uv[1]>vmax) vmax=uv[1];
606 mgnoeud->change_u(uv[0]);
607 mgnoeud->change_v(uv[1]);
608 noeud_frontiere.ajouter(mgnoeud);
609 }
610 }
611
612 }
613 }
614
615 }
616
617 void MAILLEUR2D::cree_ntree(MG_FACE* mgface)
618 {
619 int nb_noeud=noeud_frontiere.get_nb();
620 BOITE_3D boiteface=mgface->get_boite_3D();
621 boiteface.change_grosseur(1.1);
622 BOITE_3D boitemetrique=metrique->get_boite_3D();
623 BOITE_3D boite=boiteface&boitemetrique;
624 double xmin=boite.get_xmin();
625 double ymin=boite.get_ymin();
626 double zmin=boite.get_zmin();
627 double xmax=boite.get_xmax();
628 double ymax=boite.get_ymax();
629 double zmax=boite.get_zmax();
630 ntree_de_segment=new TPL_NTREE_FCT<MG_SEGMENT*,FCT_TAILLE>;
631 ntree_de_front=new TPL_OCTREE<MG_FRONT_2D*,MG_NOEUD*>;
632 ntree_de_segment->initialiser(*metrique,xmin,ymin,zmin,xmax,ymax,zmax);
633 ntree_de_front->initialiser(ntree_de_segment);
634 int nb_segment=segment_frontiere.get_nb();
635 for (int j=0;j<nb_segment;j++)
636 {
637 MG_SEGMENT* seg=segment_frontiere.get(j);
638 ntree_de_segment->inserer(segment_frontiere.get(j));
639 }
640 }
641
642
643 void MAILLEUR2D::initialise_front(MG_FACE* mgface,TPL_MAP_ENTITE<MG_SOMMET*> &liste_pole)
644 {
645 MG_FRONT_2D::initialise_compteur_id();
646 int nb_boucle=mgface->get_nb_mg_boucle();
647 for (int iboucle=0;iboucle<nb_boucle;iboucle++)
648 {
649 unsigned int nb_front_avant_cette_boucle=get_nb_front(front_courant);
650 MG_BOUCLE* mgboucle=mgface->get_mg_boucle(iboucle);
651 unsigned int nbcoaretetotale=mgboucle->get_nb_mg_coarete();
652 MG_COARETE* mgcoarete=mgboucle->get_mg_coarete(0);
653 MG_NOEUD* noeud_de_depart;
654 int bon_noeud=0;
655 int numnoeud=0;
656 while (bon_noeud==0)
657 {
658 if (mgcoarete->get_orientation()==MEME_SENS) noeud_de_depart=(MG_NOEUD*)mgcoarete->get_arete()->get_cosommet1()->get_sommet()->get_lien_maillage()->get(numnoeud);
659 else noeud_de_depart=(MG_NOEUD*)mgcoarete->get_arete()->get_cosommet2()->get_sommet()->get_lien_maillage()->get(numnoeud);
660 MG_NOEUD* noeudtemp=mg_maillage->get_mg_noeudid(noeud_de_depart->get_id());
661 if (noeudtemp==NULL) numnoeud++; else bon_noeud=1;
662 }
663 MG_FRONT_2D* premier_front;
664 MG_NOEUD* noeud_courant=noeud_de_depart;
665 MG_FRONT_2D* front_precedent=NULL;
666 unsigned int nbcoaretetraite=0;
667 do
668 {
669 MG_SEGMENT* segment_courant=NULL;
670 nbcoaretetraite++;
671 MG_NOEUD* noeud_d_arrivee;
672 int bon_noeud=0;
673 int numnoeud=0;
674 while (bon_noeud==0)
675 {
676 if (mgcoarete->get_orientation()==MEME_SENS) noeud_d_arrivee=(MG_NOEUD*)mgcoarete->get_arete()->get_cosommet2()->get_sommet()->get_lien_maillage()->get(numnoeud);
677 else noeud_d_arrivee=(MG_NOEUD*)mgcoarete->get_arete()->get_cosommet1()->get_sommet()->get_lien_maillage()->get(numnoeud);
678 MG_NOEUD* noeudtemp=mg_maillage->get_mg_noeudid(noeud_d_arrivee->get_id());
679 if (noeudtemp==NULL) numnoeud++; else bon_noeud=1;
680 }
681 MG_ARETE* mgarete=mgcoarete->get_arete();
682 int passe_aretefermee=0;
683 do
684 {
685 int trouve=0;
686 int i;
687 if ((mgcoarete->get_arete()->get_cosommet1()->get_sommet()==mgcoarete->get_arete()->get_cosommet2()->get_sommet())&&(passe_aretefermee==0))
688 {
689 passe_aretefermee=1;
690 MG_SEGMENT* mgsegment_depart1=NULL;
691 MG_SEGMENT* mgsegment_depart2=NULL;
692 TPL_SET<MG_ELEMENT_MAILLAGE*>::ITERATEUR it;
693 MG_SEGMENT* mgsegment=(MG_SEGMENT*)mgarete->get_lien_maillage()->get_premier(it);
694 do
695 {
696 if ((mgsegment->get_noeud1()==noeud_courant) || (mgsegment->get_noeud2()==noeud_courant)) mgsegment_depart1=mgsegment;
697 mgsegment=(MG_SEGMENT*)mgarete->get_lien_maillage()->get_suivant(it);
698 }
699 while (mgsegment_depart1==NULL);
700 do
701 {
702 if ((mgsegment->get_noeud1()==noeud_courant) || (mgsegment->get_noeud2()==noeud_courant)) mgsegment_depart2=mgsegment;
703 mgsegment=(MG_SEGMENT*)mgarete->get_lien_maillage()->get_suivant(it);
704 }
705 while (mgsegment_depart2==NULL);
706 MG_NOEUD* noeud1_2;
707 MG_NOEUD* noeud2_2;
708 if (mgsegment_depart1->get_noeud1()==noeud_courant) noeud1_2=mgsegment_depart1->get_noeud2(); else noeud1_2=mgsegment_depart1->get_noeud1();
709 if (mgsegment_depart2->get_noeud1()==noeud_courant) noeud2_2=mgsegment_depart2->get_noeud2(); else noeud2_2=mgsegment_depart2->get_noeud1();
710 OT_VECTEUR_3D vecteur1(noeud1_2->get_x()-noeud_courant->get_x(),noeud1_2->get_y()-noeud_courant->get_y(),noeud1_2->get_z()-noeud_courant->get_z());
711 double coo[3];
712 mgarete->deriver(mgarete->get_tmin(),coo);
713 OT_VECTEUR_3D tangeante(coo[0]*mgcoarete->get_orientation(),coo[1]*mgcoarete->get_orientation(),coo[2]*mgcoarete->get_orientation());
714 MG_NOEUD* noeud_suivant;
715 if (vecteur1*tangeante>0.)
716 {
717 mgsegment=mgsegment_depart1;
718 noeud_suivant=noeud1_2;
719 }
720 else
721 {
722 mgsegment=mgsegment_depart2;
723 noeud_suivant=noeud2_2;
724 }
725 MG_FRONT_2D* front=ajouter_front(front_courant,noeud_courant,noeud_suivant,mgsegment);
726 ntree_de_segment->inserer(mgsegment);
727 if (get_nb_front(front_courant)==nb_front_avant_cette_boucle+1) premier_front=front;
728 front->changer_front_precedent(front_precedent);
729 if (front_precedent!=NULL) front_precedent->changer_front_suivant(front);
730 front_precedent=front;
731 noeud_courant=noeud_suivant;
732 segment_courant=mgsegment;
733 }
734 else
735 {
736 trouve=0;
737 TPL_SET<MG_ELEMENT_MAILLAGE*>::ITERATEUR it;
738 MG_SEGMENT* mgsegment=(MG_SEGMENT*)mgarete->get_lien_maillage()->get_premier(it);
739 do
740 {
741 if ((mgsegment->get_noeud1()==noeud_courant) || (mgsegment->get_noeud2()==noeud_courant))
742 if (mgsegment!=segment_courant)
743 {
744 trouve=1;
745 MG_NOEUD* noeud_suivant;
746 if (mgsegment->get_noeud1()==noeud_courant) noeud_suivant=mgsegment->get_noeud2();
747 else if (mgsegment->get_noeud2()==noeud_courant) noeud_suivant=mgsegment->get_noeud1();
748 MG_FRONT_2D* front=ajouter_front(front_courant,noeud_courant,noeud_suivant,mgsegment);
749 ntree_de_segment->inserer(mgsegment);
750 if (get_nb_front(front_courant)==nb_front_avant_cette_boucle+1) premier_front=front;
751 else front_precedent->changer_front_suivant(front);
752 front->changer_front_precedent(front_precedent);
753 front_precedent=front;
754 noeud_courant=noeud_suivant;
755 segment_courant=mgsegment;
756 }
757 mgsegment=(MG_SEGMENT*)mgarete->get_lien_maillage()->get_suivant(it);
758 }
759 while (trouve==0);
760 }
761 }
762 while (noeud_courant!=noeud_d_arrivee);
763 int trouve=0;
764 MG_SOMMET* mgsommet;
765 if (mgcoarete->get_orientation()==MEME_SENS) mgsommet=mgcoarete->get_arete()->get_cosommet2()->get_sommet();
766 else mgsommet=mgcoarete->get_arete()->get_cosommet1()->get_sommet();
767 if (mgsommet->est_pole()) liste_pole.ajouter(mgsommet);
768 double xyz[3];
769 mgsommet->get_point()->evaluer(xyz);
770 int nbcoaretesuivante=mgboucle->get_nb_mg_coarete();
771 MG_COARETE* mgcoaretetmp=NULL;
772 double angleref=0.;
773 double angleref2=0.;
774 for (int i=0;i<nbcoaretesuivante;i++)
775 {
776 MG_COARETE* mgcoarete_suivante=mgboucle->get_mg_coarete(i);
777 MG_SOMMET* mgsommet_suivant;
778 if (mgcoarete_suivante->get_orientation()==MEME_SENS) mgsommet_suivant=mgcoarete_suivante->get_arete()->get_cosommet1()->get_sommet();
779 else mgsommet_suivant=mgcoarete_suivante->get_arete()->get_cosommet2()->get_sommet();
780 if (mgsommet==mgsommet_suivant)
781 {
782 if (trouve==0)
783 {
784 trouve=1;
785 mgcoaretetmp=mgcoarete_suivante;
786 }
787 else
788 {
789 //angleref
790 double uv[2];
791 mgface->inverser(uv,xyz);
792 double normal[3];
793 mgface->calcul_normale_unitaire(uv,normal);
794 double dir1[3];
795 double dir2[3];
796 MG_COSOMMET* mgcosommet;
797 if (mgcoarete->get_orientation()==MEME_SENS) mgcosommet=mgcoarete->get_arete()->get_cosommet2();
798 else mgcosommet=mgcoarete->get_arete()->get_cosommet1();
799 mgcoarete->get_arete()->deriver(mgcosommet->get_t(),dir1);
800 if (mgcoaretetmp->get_orientation()==MEME_SENS) mgcosommet=mgcoaretetmp->get_arete()->get_cosommet1();
801 else mgcosommet=mgcoaretetmp->get_arete()->get_cosommet2();
802 mgcoaretetmp->get_arete()->deriver(mgcosommet->get_t(),dir2);
803 int sens1=mgcoarete->get_orientation();
804 int sens2=mgcoaretetmp->get_orientation();
805 OT_VECTEUR_3D vec1(-dir1[0]*sens1,-dir1[1]*sens1,-dir1[2]*sens1);
806 OT_VECTEUR_3D vec2(dir2[0]*sens2,dir2[1]*sens2,dir2[2]*sens2);
807 vec1.norme();
808 vec2.norme();
809 OT_VECTEUR_3D nor=normal&vec1;
810 double cs=vec1*vec2;
811 double sn=-1*(vec2*nor);
812 angleref=acos(cs);
813 if (sn<0) angleref=-angleref;
814 if (angleref<0) angleref=angleref+2.*M_PI;
815 if (mgcoarete->get_arete()==mgcoaretetmp->get_arete()) angleref=2*M_PI;
816 if (angleref<1e-10)
817 {
818 double dt=1e-3*(mgcoaretetmp->get_arete()->get_tmax()-mgcoaretetmp->get_arete()->get_tmax());
819 mgcoaretetmp->get_arete()->deriver(mgcosommet->get_t()+dt,dir2);
820 OT_VECTEUR_3D vec2(dir2[0]*sens2,dir2[1]*sens2,dir2[2]*sens2);
821 vec2.norme();
822 double cs=vec1*vec2;
823 double sn=-1*(vec2*nor);
824 angleref=acos(cs);
825 if (sn<0) angleref2=-angleref2;
826 if (angleref<0) angleref2=angleref2+2.*M_PI;
827 }
828 //angle
829 if (mgcoarete->get_orientation()==MEME_SENS) mgcosommet=mgcoarete->get_arete()->get_cosommet2();
830 else mgcosommet=mgcoarete->get_arete()->get_cosommet1();
831 mgcoarete->get_arete()->deriver(mgcosommet->get_t(),dir1);
832 if (mgcoarete_suivante->get_orientation()==MEME_SENS) mgcosommet=mgcoarete_suivante->get_arete()->get_cosommet1();
833 else mgcosommet=mgcoarete_suivante->get_arete()->get_cosommet2();
834 mgcoarete_suivante->get_arete()->deriver(mgcosommet->get_t(),dir2);
835 sens1=mgcoarete->get_orientation();
836 sens2=mgcoarete_suivante->get_orientation();
837 vec1.change_x(-dir1[0]*sens1);
838 vec1.change_y(-dir1[1]*sens1);
839 vec1.change_z(-dir1[2]*sens1);
840 vec2.change_x(dir2[0]*sens2);
841 vec2.change_y(dir2[1]*sens2);
842 vec2.change_z(dir2[2]*sens2);
843 vec1.norme();
844 vec2.norme();
845 nor=normal&vec1;
846 cs=vec1*vec2;
847 sn=-1*(vec2*nor);
848 double angle=acos(cs);
849 if (sn<0) angle=-angle;
850 if (angle<0) angle=angle+2.*M_PI;
851 if (mgcoarete->get_arete()==mgcoarete_suivante->get_arete()) angle=2*M_PI;
852 if (angle<angleref)
853 {
854 angleref=angle;
855 mgcoaretetmp=mgcoarete_suivante;
856 }
857 else if ((angle<1e-10) && (angleref<1e-10))
858 {
859 double dt=1e-3*(mgcoarete_suivante->get_arete()->get_tmax()-mgcoarete_suivante->get_arete()->get_tmax());
860 mgcoarete_suivante->get_arete()->deriver(mgcosommet->get_t()+dt,dir2);
861 OT_VECTEUR_3D vec2(dir2[0]*sens2,dir2[1]*sens2,dir2[2]*sens2);
862 vec2.norme();
863 double cs=vec1*vec2;
864 double sn=-1*(vec2*nor);
865 angle=acos(cs);
866 if (sn<0) angle=-angle;
867 if (angle<0) angle=angle+2.*M_PI;
868 if (angle<angleref2)
869 mgcoaretetmp=mgcoarete_suivante;
870
871 }
872
873 }
874 }
875
876 }
877 mgcoarete=mgcoaretetmp;
878 }
879 while ((noeud_courant!=noeud_de_depart) || (nbcoaretetraite!=nbcoaretetotale));
880 front_precedent->changer_front_suivant(premier_front);
881 premier_front->changer_front_precedent(front_precedent);
882 }
883 }
884
885 int MAILLEUR2D::progresse_front(MG_FACE* mgface)
886 {
887 int compteur=0;
888 long Nb_iteration_max_mailleur2d = (long)param.get_valeur((char*)"Nb_iteration_max_mailleur2d");
889 while (get_nb_front(front_courant)!=0)
890 {
891 if(compteur>Nb_iteration_max_mailleur2d)
892 {
893 std::cerr << "*** MAILLEUR2D::progresse_front : Nb_iteration_max_mailleur2d atteint ! ***" << std::endl;
894 mg_maillage->get_gestionnaire()->enregistrer("void.magic");
895 return FAIL;
896 }
897 compteur++;
898 /*if (mg_maillage->get_nb_mg_triangle()+558>=1160)
899 {int i=0;
900 LISTE_MG_NOEUD::iterator it;for (MG_NOEUD* noeud=mg_maillage->get_premier_noeud(it);noeud;noeud=mg_maillage->get_suivant_noeud(it))
901 {
902 noeud->change_nouveau_numero(i+1);
903 std::cout << i+1 << " " << noeud->get_u() << " " << noeud->get_v() << std::endl; ;
904 i++;
905 }
906 mg_maillage->get_gestionnaire()->enregistrer("toto.magic");
907 }*/
908
909 if ((mgface->get_id()==3854) && (compteur%100==0) && (compteur>0))
910 {
911 mg_maillage->get_gestionnaire()->enregistrer("toto.magic");
912 }
913 refresh();
914 MG_FRONT_2D* ft=get_front(front_courant,0);
915 MG_FRONT_2D* ftp=ft->get_front_precedent();
916 MG_FRONT_2D* fts=ft->get_front_suivant();
917 double eps=0.0001*ft->get_segment()->get_longueur();
918 MG_NOEUD* nop=ftp->get_noeud1();
919 MG_NOEUD* no1=ft->get_noeud1();
920 MG_NOEUD* no2=ft->get_noeud2();
921 MG_NOEUD* nos=fts->get_noeud2();
922 /* angle precedent et angle suivant */
923 OT_VECTEUR_3D n1n2(no1->get_coord(),no2->get_coord());
924 OT_VECTEUR_3D n2s(no2->get_coord(),nos->get_coord());
925 OT_VECTEUR_3D pn1(nop->get_coord(),no1->get_coord());
926 n1n2.norme();
927 n2s.norme();
928 pn1.norme();
929 double coo[3];
930 double uv[2];
931 uv[0]=no1->get_u();
932 uv[1]=no1->get_v();
933 mgface->calcul_normale_unitaire(uv,coo);
934 OT_VECTEUR_3D nplan(coo);
935 OT_VECTEUR_3D n=nplan&n1n2;
936 n.norme();
937 double pcp=(-1)*(n1n2*pn1);
938 double psp=(-1)*(n*pn1);
939 int anglep;
940 if ((pcp>=0.1786481777)&&(psp>eps)) anglep=1; else anglep=0;
941 uv[0]=no2->get_u();
942 uv[1]=no2->get_v();
943 mgface->calcul_normale_unitaire(uv,coo);
944 OT_VECTEUR_3D nplan2(coo);
945 n=nplan2&n1n2;
946 n.norme();
947 double pcs=(-1.)*(n1n2*n2s);
948 double pss=n*n2s;
949 int angles;
950 if ((pcs>=0.1786481777)&&(pss>eps)) angles=1; else angles=0;
951 int type_cas_front[7];
952 if ( (ftp==fts->get_front_suivant()) && (no1!=nos) && (no2!=nop) ) type_cas_front[MAGIC::MAILLEURFRONTALETAT::CAS_FRONT_3]=1; else type_cas_front[MAGIC::MAILLEURFRONTALETAT::CAS_FRONT_3]=0;
953 if (ftp->get_front_precedent()==fts->get_front_suivant()) type_cas_front[MAGIC::MAILLEURFRONTALETAT::CAS_FRONT_4]=1; else type_cas_front[MAGIC::MAILLEURFRONTALETAT::CAS_FRONT_4]=0;
954 if ( (anglep==1) && (angles==1) ) type_cas_front[MAGIC::MAILLEURFRONTALETAT::CAS_FERME_CAVITE]=1; else type_cas_front[MAGIC::MAILLEURFRONTALETAT::CAS_FERME_CAVITE]=0;
955 if ( anglep==1 ) type_cas_front[MAGIC::MAILLEURFRONTALETAT::CAS_FERME_CAVITE_P]=1; else type_cas_front[MAGIC::MAILLEURFRONTALETAT::CAS_FERME_CAVITE_P]=0;
956 if ( angles==1 ) type_cas_front[MAGIC::MAILLEURFRONTALETAT::CAS_FERME_CAVITE_S]=1; else type_cas_front[MAGIC::MAILLEURFRONTALETAT::CAS_FERME_CAVITE_S]=0;
957 type_cas_front[MAGIC::MAILLEURFRONTALETAT::CAS_GENERAL]=1;
958 int solution=MAGIC::MAILLEURFRONTALETAT::PASTROUVE;
959 if (type_cas_front[MAGIC::MAILLEURFRONTALETAT::CAS_FRONT_3]) solution=traite_front(MAGIC::MAILLEURFRONTALETAT::CAS_FRONT_3,mgface,ftp,ft,fts);
960 if ((solution==MAGIC::MAILLEURFRONTALETAT::PASTROUVE) && (type_cas_front[MAGIC::MAILLEURFRONTALETAT::CAS_FRONT_4])) solution=traite_front(MAGIC::MAILLEURFRONTALETAT::CAS_FRONT_4,mgface,ftp,ft,fts);
961 if ((solution==MAGIC::MAILLEURFRONTALETAT::PASTROUVE) && (type_cas_front[MAGIC::MAILLEURFRONTALETAT::CAS_FERME_CAVITE])) solution=traite_front(MAGIC::MAILLEURFRONTALETAT::CAS_FERME_CAVITE,mgface,ftp,ft,fts);
962 if ((solution==MAGIC::MAILLEURFRONTALETAT::PASTROUVE) && (type_cas_front[MAGIC::MAILLEURFRONTALETAT::CAS_FERME_CAVITE_P])) solution=traite_front(MAGIC::MAILLEURFRONTALETAT::CAS_FERME_CAVITE_P,mgface,ftp,ft,fts);
963 if ((solution==MAGIC::MAILLEURFRONTALETAT::PASTROUVE) && (type_cas_front[MAGIC::MAILLEURFRONTALETAT::CAS_FERME_CAVITE_S])) solution=traite_front(MAGIC::MAILLEURFRONTALETAT::CAS_FERME_CAVITE_S,mgface,ftp,ft,fts);
964 if ((solution==MAGIC::MAILLEURFRONTALETAT::PASTROUVE) && (type_cas_front[MAGIC::MAILLEURFRONTALETAT::CAS_GENERAL]))
965 {
966 solution=traite_front(MAGIC::MAILLEURFRONTALETAT::CAS_GENERAL,mgface,ftp,ft,fts);
967 if ((solution!=MAGIC::MAILLEURFRONTALETAT::PASTROUVE)&&(solution!=MAGIC::MAILLEURFRONTALETAT::TROUVE))
968 {if (!type_cas_front[solution]) solution=traite_front(solution,mgface,ftp,ft,fts); else solution=MAGIC::MAILLEURFRONTALETAT::PASTROUVE;}
969 if (solution==MAGIC::MAILLEURFRONTALETAT::PASTROUVE)
970 {
971 echange_de_front(front_courant,front_attente,ft);
972 ft->incremente_ifail();
973 solution=MAGIC::MAILLEURFRONTALETAT::TROUVE;
974 }
975 }
976 if (get_nb_front(front_courant)==0) front_courant.swap(front_attente);
977 }
978 return OK;
979 }
980
981
982
983
984 void MAILLEUR2D::insere_contrainte_segment(MG_FACE* mgface,TPL_LISTE_ENTITE<MG_SEGMENT*> *lstseg)
985 {
986 int nbseg=lstseg->get_nb();
987 for (int i=0;i<nbseg;i++)
988 {
989 MG_SEGMENT* segori=lstseg->get(i);
990 MG_NOEUD* noeudori1=segori->get_noeud1();
991 MG_NOEUD* noeudori2=segori->get_noeud2();
992 double uv1[2];
993 double uv2[2];
994 double *coo=noeudori1->get_coord();
995 mgface->inverser(uv1,coo,1e-10);
996 if (mgface->get_surface()->est_periodique_u()==1)
997 {
998 if (uv1[0]<0.0) uv1[0]=uv1[0]+mgface->get_surface()->get_periode_u();
999 if (uv1[0]>=mgface->get_surface()->get_periode_u()) uv1[0]=uv1[0]-mgface->get_surface()->get_periode_u();
1000 }
1001 if (mgface->get_surface()->est_periodique_v()==1)
1002 {
1003 if (uv1[1]<0.0) uv1[1]=uv1[1]+mgface->get_surface()->get_periode_v();
1004 if (uv1[1]>=mgface->get_surface()->get_periode_v()) uv1[1]=uv1[1]-mgface->get_surface()->get_periode_v();
1005 }
1006 coo=noeudori2->get_coord();
1007 mgface->inverser(uv2,coo,1e-10);
1008 if (mgface->get_surface()->est_periodique_u()==1)
1009 {
1010 if (uv2[0]<0.0) uv2[0]=uv2[0]+mgface->get_surface()->get_periode_u();
1011 if (uv2[0]>=mgface->get_surface()->get_periode_u()) uv2[0]=uv2[0]-mgface->get_surface()->get_periode_u();
1012 }
1013 if (mgface->get_surface()->est_periodique_v()==1)
1014 {
1015 if (uv2[1]<0.0) uv2[1]=uv2[1]+mgface->get_surface()->get_periode_v();
1016 if (uv2[1]>=mgface->get_surface()->get_periode_v()) uv2[1]=uv2[1]-mgface->get_surface()->get_periode_v();
1017 }
1018
1019 TPL_MAP_ENTITE<MG_FRONT_2D*> liste_trouvee;
1020 double *xyz1=noeudori1->get_coord();
1021 double *xyz2=noeudori2->get_coord();
1022 double xyz[3];
1023 xyz[0]=0.5*(xyz1[0]+xyz2[0]);
1024 xyz[1]=0.5*(xyz1[1]+xyz2[1]);
1025 xyz[2]=0.5*(xyz1[2]+xyz2[2]);
1026 OT_VECTEUR_3D vec(xyz1,xyz);
1027 //double rayonrecherche=sqrt((u-uv1[0])*(u-uv1[0])+(v-uv1[1])*(v-uv1[1]))*1.1;
1028 double rayonrecherche=vec.get_longueur()*1.1;
1029 ntree_de_front->rechercher(xyz[0],xyz[1],xyz[2],rayonrecherche,liste_trouvee);
1030
1031 double u=0.5*(uv1[0]+uv2[0]);
1032 double v=0.5*(uv1[1]+uv2[1]);
1033 int nb_entite=liste_trouvee.get_nb();
1034 double du=decalage->calcul_decalage_parametre_u(u);
1035 double dv=decalage->calcul_decalage_parametre_v(v);
1036 double u1=decalage->decalage_parametre_u(uv1[0],du);
1037 double v1=decalage->decalage_parametre_v(uv1[1],dv);
1038 double u2=decalage->decalage_parametre_u(uv2[0],du);
1039 double v2=decalage->decalage_parametre_v(uv2[1],dv);
1040 MG_FRONT_2D *ref1=NULL,*ref2=NULL;
1041 double angle1,angle2;
1042 for(int j=0;j<nb_entite;j++)
1043 {
1044 MG_FRONT_2D *ft=liste_trouvee.get(j);
1045 MG_NOEUD* noeudfront=ft->get_noeud2();
1046 double uvfront[2];
1047 uvfront[0]=noeudfront->get_u();
1048 uvfront[1]=noeudfront->get_v();
1049 double ufront=decalage->decalage_parametre_u(uvfront[0],du);
1050 double vfront=decalage->decalage_parametre_v(uvfront[1],dv);
1051 //noeud 1 du segment a inserer
1052 double *xyzfront=noeudfront->get_coord();
1053 //mgface->evaluer(uvfront,xyzfront);
1054 OT_VECTEUR_3D vec(xyz1,xyzfront);
1055 double dist=vec.get_longueur();
1056 //double dist=sqrt((ufront-u1)*(ufront-u1)+(vfront-v1)*(vfront-v1));
1057 if (dist<1e-5*rayonrecherche)
1058 {
1059 if (ref1==NULL)
1060 {
1061 ref1=ft;
1062 OT_VECTEUR_3D vecteur_baseu(u2-u1,v2-v1,0.);
1063 MG_NOEUD* noeudfrontautre=ft->get_noeud1();
1064 double uvfrontautre[2];
1065 uvfrontautre[0]=noeudfrontautre->get_u();
1066 uvfrontautre[1]=noeudfrontautre->get_v();
1067 double ufrontautre=decalage->decalage_parametre_u(uvfrontautre[0],du);
1068 double vfrontautre=decalage->decalage_parametre_v(uvfrontautre[1],dv);
1069 OT_VECTEUR_3D vecteur_front(ufrontautre-ufront,vfrontautre-vfront,0.);
1070 vecteur_baseu.norme();
1071 vecteur_front.norme();
1072 double cosangle=vecteur_baseu*vecteur_front;
1073 if (cosangle>1.) cosangle=1.;
1074 if (cosangle<-1.) cosangle=(-1.);
1075 angle1=acos(cosangle);
1076 }
1077 else
1078 {
1079 OT_VECTEUR_3D vecteur_baseu(u2-u1,v2-v1,0.);
1080 MG_NOEUD* noeudfrontautre=ft->get_noeud1();
1081 double uvfrontautre[2];
1082 uvfrontautre[0]=noeudfrontautre->get_u();
1083 uvfrontautre[1]=noeudfrontautre->get_v();
1084 double ufrontautre=decalage->decalage_parametre_u(uvfrontautre[0],du);
1085 double vfrontautre=decalage->decalage_parametre_v(uvfrontautre[1],dv);
1086 OT_VECTEUR_3D vecteur_front(ufrontautre-ufront,vfrontautre-vfront,0.);
1087 vecteur_baseu.norme();
1088 vecteur_front.norme();
1089 double cosangle=vecteur_baseu*vecteur_front;
1090 if (cosangle>1.) cosangle=1.;
1091 if (cosangle<-1.) cosangle=(-1.);
1092 double angle=acos(cosangle);
1093 if (angle<angle1) {angle1=angle;ref1=ft;}
1094 }
1095 }
1096 //noeud 2 du segment a inserer
1097 OT_VECTEUR_3D vec2(xyz2,xyzfront);
1098 dist=vec2.get_longueur();
1099 //dist=sqrt((ufront-u2)*(ufront-u2)+(vfront-v2)*(vfront-v2));
1100 if (dist<1e-5*rayonrecherche)
1101 {
1102 if (ref2==NULL)
1103 {
1104 ref2=ft;
1105 OT_VECTEUR_3D vecteur_baseu(u1-u2,v1-v2,0.);
1106 MG_NOEUD* noeudfrontautre=ft->get_noeud1();
1107 double uvfrontautre[2];
1108 uvfrontautre[0]=noeudfrontautre->get_u();
1109 uvfrontautre[1]=noeudfrontautre->get_v();
1110 double ufrontautre=decalage->decalage_parametre_u(uvfrontautre[0],du);
1111 double vfrontautre=decalage->decalage_parametre_v(uvfrontautre[1],dv);
1112 OT_VECTEUR_3D vecteur_front(ufrontautre-ufront,vfrontautre-vfront,0.);
1113 vecteur_baseu.norme();
1114 vecteur_front.norme();
1115 double cosangle=vecteur_baseu*vecteur_front;
1116 if (cosangle>1.) cosangle=1.;
1117 if (cosangle<-1.) cosangle=(-1.);
1118 angle2=acos(cosangle);
1119 }
1120 else
1121 {
1122 OT_VECTEUR_3D vecteur_baseu(u1-u2,v1-v2,0.);
1123 MG_NOEUD* noeudfrontautre=ft->get_noeud1();
1124 double uvfrontautre[2];
1125 uvfrontautre[0]=noeudfrontautre->get_u();
1126 uvfrontautre[1]=noeudfrontautre->get_v();
1127 double ufrontautre=decalage->decalage_parametre_u(uvfrontautre[0],du);
1128 double vfrontautre=decalage->decalage_parametre_v(uvfrontautre[1],dv);
1129 OT_VECTEUR_3D vecteur_front(ufrontautre-ufront,vfrontautre-vfront,0.);
1130 vecteur_baseu.norme();
1131 vecteur_front.norme();
1132 double cosangle=vecteur_baseu*vecteur_front;
1133 if (cosangle>1.) cosangle=1.;
1134 if (cosangle<-1.) cosangle=(-1.);
1135 double angle=acos(cosangle);
1136 if (angle<angle2) {angle1=angle;ref2=ft;}
1137 }
1138 }
1139
1140 }
1141 // creation du segemnt
1142 MG_NOEUD* noeud1;
1143 MG_NOEUD* noeud2;
1144 if (ref1!=NULL) noeud1=ref1->get_noeud2();
1145 else
1146 {
1147 double *coord=noeudori1->get_coord();
1148 noeud1=mg_maillage->ajouter_mg_noeud(mgface,coord[0],coord[1],coord[2],MAGIC::ORIGINE::IMPOSE);
1149 noeud1->change_u(uv1[0]);
1150 noeud1->change_v(uv1[1]);
1151 noeud1->change_nouveau_numero(noeudori1->get_nouveau_numero());
1152 }
1153 if (ref2!=NULL) noeud2=ref2->get_noeud2();
1154 else
1155 {
1156 double *coord=noeudori2->get_coord();
1157 noeud2=mg_maillage->ajouter_mg_noeud(mgface,coord[0],coord[1],coord[2],MAGIC::ORIGINE::IMPOSE);
1158 noeud2->change_u(uv2[0]);
1159 noeud2->change_v(uv2[1]);
1160 noeud2->change_nouveau_numero(noeudori2->get_nouveau_numero());
1161 }
1162 MG_SEGMENT* mgsegment=mg_maillage->ajouter_mg_segment(mgface,noeud1,noeud2,MAGIC::ORIGINE::IMPOSE);
1163 MG_FRONT_2D *nv_ft=ajouter_front(front_courant,noeud1,noeud2,mgsegment);
1164 MG_FRONT_2D *nv_ft2=ajouter_front(front_courant,noeud2,noeud1,mgsegment);
1165 if (ref1==NULL)
1166 {
1167 nv_ft->changer_front_precedent(nv_ft2);
1168 nv_ft2->changer_front_suivant(nv_ft);
1169 }
1170 else
1171 {
1172 MG_FRONT_2D *tmp=ref1->get_front_suivant();
1173 ref1->changer_front_suivant(nv_ft);
1174 nv_ft->changer_front_precedent(ref1);
1175 nv_ft2->changer_front_suivant(tmp);
1176 tmp->changer_front_precedent(nv_ft2);
1177 }
1178 if (ref2==NULL)
1179 {
1180 nv_ft->changer_front_suivant(nv_ft2);
1181 nv_ft2->changer_front_precedent(nv_ft);
1182 }
1183 else
1184 {
1185 MG_FRONT_2D *tmp=ref2->get_front_suivant();
1186 ref2->changer_front_suivant(nv_ft2);
1187 nv_ft2->changer_front_precedent(ref2);
1188 nv_ft->changer_front_suivant(tmp);
1189 tmp->changer_front_precedent(nv_ft);
1190 }
1191
1192 }
1193 }
1194
1195 void MAILLEUR2D::insere_contrainte_triangle(MG_FACE* mgface,TPL_LISTE_ENTITE<MG_TRIANGLE*> *lsttri)
1196 {
1197 int nbtri=lsttri->get_nb();
1198 for (int i=0;i<nbtri;i++)
1199 {
1200 MG_TRIANGLE* triori=lsttri->get(i);
1201 MG_NOEUD* noeudori1=triori->get_noeud1();
1202 MG_NOEUD* noeudori2=triori->get_noeud2();
1203 MG_NOEUD* noeudori3=triori->get_noeud3();
1204 double uv1[2];
1205 double uv2[2];
1206 double uv3[2];
1207 double *coo=noeudori1->get_coord();
1208 mgface->inverser(uv1,coo,1e-10);
1209 if (mgface->get_surface()->est_periodique_u()==1)
1210 {
1211 if (uv1[0]<0.0) uv1[0]=uv1[0]+mgface->get_surface()->get_periode_u();
1212 if (uv1[0]>=mgface->get_surface()->get_periode_u()) uv1[0]=uv1[0]-mgface->get_surface()->get_periode_u();
1213 }
1214 if (mgface->get_surface()->est_periodique_v()==1)
1215 {
1216 if (uv1[1]<0.0) uv1[1]=uv1[1]+mgface->get_surface()->get_periode_v();
1217 if (uv1[1]>=mgface->get_surface()->get_periode_v()) uv1[1]=uv1[1]-mgface->get_surface()->get_periode_v();
1218 }
1219 coo=noeudori2->get_coord();
1220 mgface->inverser(uv2,coo,1e-10);
1221 if (mgface->get_surface()->est_periodique_u()==1)
1222 {
1223 if (uv2[0]<0.0) uv2[0]=uv2[0]+mgface->get_surface()->get_periode_u();
1224 if (uv2[0]>=mgface->get_surface()->get_periode_u()) uv2[0]=uv2[0]-mgface->get_surface()->get_periode_u();
1225 }
1226 if (mgface->get_surface()->est_periodique_v()==1)
1227 {
1228 if (uv2[1]<0.0) uv2[1]=uv2[1]+mgface->get_surface()->get_periode_v();
1229 if (uv2[1]>=mgface->get_surface()->get_periode_v()) uv2[1]=uv2[1]-mgface->get_surface()->get_periode_v();
1230 }
1231 coo=noeudori3->get_coord();
1232 mgface->inverser(uv3,coo,1e-10);
1233 if (mgface->get_surface()->est_periodique_u()==1)
1234 {
1235 if (uv3[0]<0.0) uv3[0]=uv3[0]+mgface->get_surface()->get_periode_u();
1236 if (uv3[0]>=mgface->get_surface()->get_periode_u()) uv3[0]=uv3[0]-mgface->get_surface()->get_periode_u();
1237 }
1238 if (mgface->get_surface()->est_periodique_v()==1)
1239 {
1240 if (uv3[1]<0.0) uv3[1]=uv3[1]+mgface->get_surface()->get_periode_v();
1241 if (uv3[1]>=mgface->get_surface()->get_periode_v()) uv3[1]=uv3[1]-mgface->get_surface()->get_periode_v();
1242 }
1243 TPL_MAP_ENTITE<MG_FRONT_2D*> liste_trouvee;
1244 double u=0.3333333333333333*(uv1[0]+uv2[0]+uv3[0]);
1245 double v=0.3333333333333333*(uv1[1]+uv2[1]+uv3[1]);
1246 double rayonrecherche1=sqrt((u-uv1[0])*(u-uv1[0])+(v-uv1[1])*(v-uv1[1]))*2.;
1247 double rayonrecherche2=sqrt((u-uv2[0])*(u-uv2[0])+(v-uv2[1])*(v-uv2[1]))*2.;
1248 double rayonrecherche3=sqrt((u-uv3[0])*(u-uv3[0])+(v-uv3[1])*(v-uv3[1]))*2.;
1249 double rayonrecherche=rayonrecherche1;
1250 if (rayonrecherche2>rayonrecherche) rayonrecherche=rayonrecherche2;
1251 if (rayonrecherche3>rayonrecherche) rayonrecherche=rayonrecherche3;
1252 double *xyz1=noeudori1->get_coord();
1253 double *xyz2=noeudori2->get_coord();
1254 double *xyz3=noeudori3->get_coord();
1255 double xyz[3];
1256 xyz[0]=0.333333333333333333333*(xyz1[0]+xyz2[0]+xyz3[0]);
1257 xyz[1]=0.333333333333333333333*(xyz1[1]+xyz2[1]+xyz3[1]);
1258 xyz[2]=0.333333333333333333333*(xyz1[2]+xyz2[2]+xyz3[2]);
1259 OT_VECTEUR_3D vec1(xyz1,xyz);
1260 OT_VECTEUR_3D vec2(xyz2,xyz);
1261 OT_VECTEUR_3D vec3(xyz3,xyz);
1262 rayonrecherche=std::max(vec1.get_longueur(),vec2.get_longueur());
1263 rayonrecherche=std::max(rayonrecherche,vec3.get_longueur())*1.1;
1264 //double rayonrecherche=sqrt((u-uv1[0])*(u-uv1[0])+(v-uv1[1])*(v-uv1[1]))*1.1;
1265 ntree_de_front->rechercher(xyz[0],xyz[1],xyz[2],rayonrecherche,liste_trouvee);
1266 int nb_entite=liste_trouvee.get_nb();
1267 double du=decalage->calcul_decalage_parametre_u(u);
1268 double dv=decalage->calcul_decalage_parametre_v(v);
1269 double u1=decalage->decalage_parametre_u(uv1[0],du);
1270 double v1=decalage->decalage_parametre_v(uv1[1],dv);
1271 double u2=decalage->decalage_parametre_u(uv2[0],du);
1272 double v2=decalage->decalage_parametre_v(uv2[1],dv);
1273 double u3=decalage->decalage_parametre_u(uv3[0],du);
1274 double v3=decalage->decalage_parametre_v(uv3[1],dv);
1275 MG_FRONT_2D *ref1=NULL,*ref2=NULL,*ref3=NULL;
1276 double angle1,angle2,angle3;
1277 for(int j=0;j<nb_entite;j++)
1278 {
1279 MG_FRONT_2D *ft=liste_trouvee.get(j);
1280 MG_NOEUD* noeudfront=ft->get_noeud2();
1281 double uvfront[2];
1282 uvfront[0]=noeudfront->get_u();
1283 uvfront[1]=noeudfront->get_v();
1284 double ufront=decalage->decalage_parametre_u(uvfront[0],du);
1285 double vfront=decalage->decalage_parametre_v(uvfront[1],dv);
1286 //noeud 1 du triangle a inserer
1287 //double dist=sqrt((ufront-u1)*(ufront-u1)+(vfront-v1)*(vfront-v1));
1288 double *xyzfront=noeudfront->get_coord();
1289 //mgface->evaluer(uvfront,xyzfront);
1290 OT_VECTEUR_3D vec(xyz1,xyzfront);
1291 double dist=vec.get_longueur();
1292 if (dist<1e-5*rayonrecherche)
1293 {
1294 if (ref1==NULL)
1295 {
1296 ref1=ft;
1297 OT_VECTEUR_3D vecteur_baseu(u2-u1,v2-v1,0.);
1298 MG_NOEUD* noeudfrontautre=ft->get_noeud1();
1299 double uvfrontautre[2];
1300 uvfrontautre[0]=noeudfrontautre->get_u();
1301 uvfrontautre[1]=noeudfrontautre->get_v();
1302 double ufrontautre=decalage->decalage_parametre_u(uvfrontautre[0],du);
1303 double vfrontautre=decalage->decalage_parametre_v(uvfrontautre[1],dv);
1304 OT_VECTEUR_3D vecteur_front(ufrontautre-ufront,vfrontautre-vfront,0.);
1305 vecteur_baseu.norme();
1306 vecteur_front.norme();
1307 double cosangle=vecteur_baseu*vecteur_front;
1308 if (cosangle>1.) cosangle=1.;
1309 if (cosangle<-1.) cosangle=(-1.);
1310 angle1=acos(cosangle);
1311 OT_VECTEUR_3D w(0.,0.,1.);
1312 OT_VECTEUR_3D vecteur_basev=w&vecteur_baseu;
1313 double sangle=vecteur_basev*vecteur_front;
1314 if (sangle<0.) angle1=2*M_PI-angle1;
1315 }
1316 else
1317 {
1318 OT_VECTEUR_3D vecteur_baseu(u2-u1,v2-v1,0.);
1319 MG_NOEUD* noeudfrontautre=ft->get_noeud1();
1320 double uvfrontautre[2];
1321 uvfrontautre[0]=noeudfrontautre->get_u();
1322 uvfrontautre[1]=noeudfrontautre->get_v();
1323 double ufrontautre=decalage->decalage_parametre_u(uvfrontautre[0],du);
1324 double vfrontautre=decalage->decalage_parametre_v(uvfrontautre[1],dv);
1325 OT_VECTEUR_3D vecteur_front(ufrontautre-ufront,vfrontautre-vfront,0.);
1326 vecteur_baseu.norme();
1327 vecteur_front.norme();
1328 double cosangle=vecteur_baseu*vecteur_front;
1329 if (cosangle>1.) cosangle=1.;
1330 if (cosangle<-1.) cosangle=(-1.);
1331 double angle=acos(cosangle);
1332 OT_VECTEUR_3D w(0.,0.,1.);
1333 OT_VECTEUR_3D vecteur_basev=w&vecteur_baseu;
1334 double sangle=vecteur_basev*vecteur_front;
1335 if (sangle<0.) angle=2*M_PI-angle;
1336 if (angle<angle1) {angle1=angle;ref1=ft;}
1337 }
1338 }
1339 //noeud 2 du triangle a inserer
1340 //mgface->evaluer(uvfront,xyzfront);
1341 OT_VECTEUR_3D vec2(xyz2,xyzfront);
1342 dist=vec2.get_longueur();
1343 //dist=sqrt((ufront-u2)*(ufront-u2)+(vfront-v2)*(vfront-v2));
1344 if (dist<1e-5*rayonrecherche)
1345 {
1346 if (ref2==NULL)
1347 {
1348 ref2=ft;
1349 OT_VECTEUR_3D vecteur_baseu(u3-u2,v3-v2,0.);
1350 MG_NOEUD* noeudfrontautre=ft->get_noeud1();
1351 double uvfrontautre[2];
1352 uvfrontautre[0]=noeudfrontautre->get_u();
1353 uvfrontautre[1]=noeudfrontautre->get_v();
1354 double ufrontautre=decalage->decalage_parametre_u(uvfrontautre[0],du);
1355 double vfrontautre=decalage->decalage_parametre_v(uvfrontautre[1],dv);
1356 OT_VECTEUR_3D vecteur_front(ufrontautre-ufront,vfrontautre-vfront,0.);
1357 vecteur_baseu.norme();
1358 vecteur_front.norme();
1359 double cosangle=vecteur_baseu*vecteur_front;
1360 if (cosangle>1.) cosangle=1.;
1361 if (cosangle<-1.) cosangle=(-1.);
1362 angle2=acos(cosangle);
1363 OT_VECTEUR_3D w(0.,0.,1.);
1364 OT_VECTEUR_3D vecteur_basev=w&vecteur_baseu;
1365 double sangle=vecteur_basev*vecteur_front;
1366 if (sangle<0.) angle2=2*M_PI-angle2;
1367 }
1368 else
1369 {
1370 OT_VECTEUR_3D vecteur_baseu(u3-u2,v3-v2,0.);
1371 MG_NOEUD* noeudfrontautre=ft->get_noeud1();
1372 double uvfrontautre[2];
1373 uvfrontautre[0]=noeudfrontautre->get_u();
1374 uvfrontautre[1]=noeudfrontautre->get_v();
1375 double ufrontautre=decalage->decalage_parametre_u(uvfrontautre[0],du);
1376 double vfrontautre=decalage->decalage_parametre_v(uvfrontautre[1],dv);
1377 OT_VECTEUR_3D vecteur_front(ufrontautre-ufront,vfrontautre-vfront,0.);
1378 vecteur_baseu.norme();
1379 vecteur_front.norme();
1380 double cosangle=vecteur_baseu*vecteur_front;
1381 if (cosangle>1.) cosangle=1.;
1382 if (cosangle<-1.) cosangle=(-1.);
1383 double angle=acos(cosangle);
1384 OT_VECTEUR_3D w(0.,0.,1.);
1385 OT_VECTEUR_3D vecteur_basev=w&vecteur_baseu;
1386 double sangle=vecteur_basev*vecteur_front;
1387 if (sangle<0.) angle=2*M_PI-angle;
1388 if (angle<angle2) {angle2=angle;ref2=ft;}
1389 }
1390 }
1391 //noeud 3 du triangle a inserer
1392 //dist=sqrt((ufront-u3)*(ufront-u3)+(vfront-v3)*(vfront-v3));
1393 //mgface->evaluer(uvfront,xyzfront);
1394 OT_VECTEUR_3D vec3(xyz3,xyzfront);
1395 dist=vec3.get_longueur();
1396 if (dist<1e-5*rayonrecherche)
1397 {
1398 if (ref3==NULL)
1399 {
1400 ref3=ft;
1401 OT_VECTEUR_3D vecteur_baseu(u1-u3,v1-v3,0.);
1402 MG_NOEUD* noeudfrontautre=ft->get_noeud1();
1403 double uvfrontautre[2];
1404 uvfrontautre[0]=noeudfrontautre->get_u();
1405 uvfrontautre[1]=noeudfrontautre->get_v();
1406 double ufrontautre=decalage->decalage_parametre_u(uvfrontautre[0],du);
1407 double vfrontautre=decalage->decalage_parametre_v(uvfrontautre[1],dv);
1408 OT_VECTEUR_3D vecteur_front(ufrontautre-ufront,vfrontautre-vfront,0.);
1409 vecteur_baseu.norme();
1410 vecteur_front.norme();
1411 double cosangle=vecteur_baseu*vecteur_front;
1412 if (cosangle>1.) cosangle=1.;
1413 if (cosangle<-1.) cosangle=(-1.);
1414 angle3=acos(cosangle);
1415 OT_VECTEUR_3D w(0.,0.,1.);
1416 OT_VECTEUR_3D vecteur_basev=w&vecteur_baseu;
1417 double sangle=vecteur_basev*vecteur_front;
1418 if (sangle<0.) angle3=2*M_PI-angle3;
1419 }
1420 else
1421 {
1422 OT_VECTEUR_3D vecteur_baseu(u1-u3,v1-v3,0.);
1423 MG_NOEUD* noeudfrontautre=ft->get_noeud1();
1424 double uvfrontautre[2];
1425 uvfrontautre[0]=noeudfrontautre->get_u();
1426 uvfrontautre[1]=noeudfrontautre->get_v();
1427 double ufrontautre=decalage->decalage_parametre_u(uvfrontautre[0],du);
1428 double vfrontautre=decalage->decalage_parametre_v(uvfrontautre[1],dv);
1429 OT_VECTEUR_3D vecteur_front(ufrontautre-ufront,vfrontautre-vfront,0.);
1430 vecteur_baseu.norme();
1431 vecteur_front.norme();
1432 double cosangle=vecteur_baseu*vecteur_front;
1433 if (cosangle>1.) cosangle=1.;
1434 if (cosangle<-1.) cosangle=(-1.);
1435 double angle=acos(cosangle);
1436 OT_VECTEUR_3D w(0.,0.,1.);
1437 OT_VECTEUR_3D vecteur_basev=w&vecteur_baseu;
1438 double sangle=vecteur_basev*vecteur_front;
1439 if (sangle<0.) angle=2*M_PI-angle;
1440 if (angle<angle3) {angle3=angle;ref3=ft;}
1441
1442 }
1443 }
1444 }
1445 // creation du triangle
1446 MG_NOEUD* noeud1;
1447 MG_NOEUD* noeud2;
1448 MG_NOEUD* noeud3;
1449 if (ref1!=NULL) noeud1=ref1->get_noeud2();
1450 else
1451 {
1452 double *coord=noeudori1->get_coord();
1453 noeud1=mg_maillage->ajouter_mg_noeud(mgface,coord[0],coord[1],coord[2],MAGIC::ORIGINE::IMPOSE);
1454 noeud1->change_u(uv1[0]);
1455 noeud1->change_v(uv1[1]);
1456 noeud1->change_nouveau_numero(noeudori1->get_nouveau_numero());
1457 }
1458 if (ref2!=NULL) noeud2=ref2->get_noeud2();
1459 else
1460 {
1461 double *coord=noeudori2->get_coord();
1462 noeud2=mg_maillage->ajouter_mg_noeud(mgface,coord[0],coord[1],coord[2],MAGIC::ORIGINE::IMPOSE);
1463 noeud2->change_u(uv2[0]);
1464 noeud2->change_v(uv2[1]);
1465 noeud2->change_nouveau_numero(noeudori2->get_nouveau_numero());
1466 }
1467 if (ref3!=NULL) noeud3=ref3->get_noeud2();
1468 else
1469 {
1470 double *coord=noeudori3->get_coord();
1471 noeud3=mg_maillage->ajouter_mg_noeud(mgface,coord[0],coord[1],coord[2],MAGIC::ORIGINE::IMPOSE);
1472 noeud3->change_u(uv3[0]);
1473 noeud3->change_v(uv3[1]);
1474 noeud3->change_nouveau_numero(noeudori3->get_nouveau_numero());
1475 }
1476 MG_SEGMENT* mgsegment1=mg_maillage->get_mg_segment(noeud1->get_id(),noeud2->get_id());
1477 MG_SEGMENT* mgsegment2=mg_maillage->get_mg_segment(noeud2->get_id(),noeud3->get_id());
1478 MG_SEGMENT* mgsegment3=mg_maillage->get_mg_segment(noeud3->get_id(),noeud1->get_id());
1479 int seg1=1,seg2=1,seg3=1;
1480 if (mgsegment1==NULL) mgsegment1=mg_maillage->ajouter_mg_segment(mgface,noeud1,noeud2,MAGIC::ORIGINE::IMPOSE); else seg1=0;
1481 if (mgsegment2==NULL) mgsegment2=mg_maillage->ajouter_mg_segment(mgface,noeud2,noeud3,MAGIC::ORIGINE::IMPOSE); else seg2=0;
1482 if (mgsegment3==NULL) mgsegment3=mg_maillage->ajouter_mg_segment(mgface,noeud3,noeud1,MAGIC::ORIGINE::IMPOSE); else seg3=0;
1483 M3D_TRIANGLE* mtriangle=new M3D_TRIANGLE(mgface,noeud1,noeud2,noeud3,mgsegment1,mgsegment2,mgsegment3,MAGIC::ORIGINE::IMPOSE);
1484 mg_maillage->ajouter_mg_triangle(mtriangle);
1485 int segtotal=seg1+seg2+seg3;
1486 if (segtotal==3)
1487 {
1488 MG_FRONT_2D* ft1=ajouter_front(front_courant,noeud1,noeud2,mgsegment1);
1489 MG_FRONT_2D* ft2=ajouter_front(front_courant,noeud2,noeud3,mgsegment2);
1490 MG_FRONT_2D* ft3=ajouter_front(front_courant,noeud3,noeud1,mgsegment3);
1491 if (ref1==NULL)
1492 {
1493 ft1->changer_front_precedent(ft3);
1494 ft3->changer_front_suivant(ft1);
1495 }
1496 else
1497 {
1498 MG_FRONT_2D* tmp=ref1->get_front_suivant();
1499 ft1->changer_front_precedent(ref1);
1500 ref1->changer_front_suivant(ft1);
1501 ft3->changer_front_suivant(tmp);
1502 tmp->changer_front_precedent(ft3);
1503 }
1504 if (ref2==NULL)
1505 {
1506 ft1->changer_front_suivant(ft2);
1507 ft2->changer_front_precedent(ft1);
1508 }
1509 else
1510 {
1511 MG_FRONT_2D* tmp=ref2->get_front_suivant();
1512 ft2->changer_front_precedent(ref2);
1513 ref2->changer_front_suivant(ft2);
1514 ft1->changer_front_suivant(tmp);
1515 tmp->changer_front_precedent(ft1);
1516 }
1517 if (ref3==NULL)
1518 {
1519 ft2->changer_front_suivant(ft3);
1520 ft3->changer_front_precedent(ft2);
1521 }
1522 else
1523 {
1524 MG_FRONT_2D* tmp=ref3->get_front_suivant();
1525 ft3->changer_front_precedent(ref3);
1526 ref3->changer_front_suivant(ft3);
1527 ft2->changer_front_suivant(tmp);
1528 tmp->changer_front_precedent(ft2);
1529 }
1530 }
1531 if (segtotal==2)
1532 {
1533 MG_FRONT_2D *front1,*front2,*front3;
1534 MG_SEGMENT *segcre1,*segcre2;
1535 if (seg3==0)
1536 {
1537 front1=ref1;front2=ref3;front3=ref2;
1538 segcre1=mgsegment1;segcre2=mgsegment2;
1539 }
1540 if (seg1==0)
1541 {
1542 front1=ref2;front2=ref1;front3=ref3;
1543 segcre1=mgsegment2;segcre2=mgsegment3;
1544 }
1545 if (seg2==0)
1546 {
1547 front1=ref3;front2=ref2;front3=ref1;
1548 segcre1=mgsegment3;segcre2=mgsegment1;
1549 }
1550 MG_FRONT_2D* ft1=ajouter_front(front_courant,segcre1->get_noeud1(),segcre1->get_noeud2(),segcre1);
1551 MG_FRONT_2D* ft2=ajouter_front(front_courant,segcre2->get_noeud1(),segcre2->get_noeud2(),segcre2);
1552 front1->changer_front_suivant(ft1);
1553 ft1->changer_front_precedent(front1);
1554 if (front3==NULL)
1555 {
1556 ft1->changer_front_suivant(ft2);
1557 ft2->changer_front_precedent(ft1);
1558 }
1559 else
1560 {
1561 MG_FRONT_2D* tmp=front3->get_front_suivant();
1562 ft1->changer_front_suivant(tmp);
1563 tmp->changer_front_precedent(ft1);
1564 ft2->changer_front_precedent(front3);
1565 front3->changer_front_suivant(ft2);
1566 }
1567 ft2->changer_front_suivant(front2->get_front_suivant());
1568 front2->get_front_suivant()->changer_front_precedent(ft2);
1569 supprimer_front(front2);
1570 }
1571 if (segtotal==1)
1572 {
1573 MG_FRONT_2D *front1,*front2,*front3;
1574 MG_SEGMENT *segcre1;
1575 if (seg1==1)
1576 {
1577 front1=ref1;front2=ref3;front3=ref2;
1578 segcre1=mgsegment1;
1579 }
1580 if (seg2==1)
1581 {
1582 front1=ref2;front2=ref1;front3=ref3;
1583 segcre1=mgsegment2;
1584 }
1585 if (seg3==1)
1586 {
1587 front1=ref3;front2=ref2;front3=ref1;
1588 segcre1=mgsegment3;
1589 }
1590 MG_FRONT_2D* ft1=ajouter_front(front_courant,segcre1->get_noeud1(),segcre1->get_noeud2(),segcre1);
1591 front1->changer_front_suivant(ft1);
1592 ft1->changer_front_precedent(front1);
1593 ft1->changer_front_suivant(front3->get_front_suivant());
1594 front3->get_front_suivant()->changer_front_precedent(ft1);
1595 supprimer_front(front2);
1596 supprimer_front(front3);
1597 }
1598 if (segtotal==0)
1599 {
1600 supprimer_front(ref1);
1601 supprimer_front(ref2);
1602 supprimer_front(ref3);
1603 }
1604
1605
1606 }
1607 }
1608
1609 void MAILLEUR2D::change_niveau_optimisation(int num)
1610 {
1611 niveau_optimisation=num;
1612 }
1613
1614 int MAILLEUR2D::get_niveau_optimisation(void)
1615 {
1616 return niveau_optimisation;
1617 }
1618
1619
1620 MG_FRONT_2D* MAILLEUR2D::ajouter_front(FRONT& front,MG_NOEUD* noeud1,MG_NOEUD* noeud2,MG_SEGMENT* segment)
1621 {
1622 MG_FRONT_2D* ft=new MG_FRONT_2D(noeud1,noeud2,segment);
1623 ajouter_front(front,ft);
1624 ntree_de_front->inserer(ft);
1625 return ft;
1626 }
1627
1628 void MAILLEUR2D::ajouter_front(FRONT& front,MG_FRONT_2D *ft)
1629 {
1630 std::pair<const double,MG_FRONT_2D*> tmp(ft->get_segment()->get_longueur(),ft);
1631 front.insert(tmp);
1632 }
1633
1634 MG_FRONT_2D* MAILLEUR2D::get_front(FRONT& front,unsigned int num)
1635 {
1636 FRONT::iterator i=front.begin();
1637 for (unsigned long j=0;j<num;j++) i++;
1638 return ((*i).second);
1639 }
1640
1641
1642 unsigned int MAILLEUR2D::get_nb_front(FRONT& front)
1643 {
1644 return front.size();
1645 }
1646
1647
1648 void MAILLEUR2D::supprimer_front(MG_FRONT_2D* ft)
1649 {
1650 ntree_de_front->supprimer(ft);
1651
1652 FRONT::iterator j=front_courant.lower_bound(ft->get_segment()->get_longueur());
1653 int ok=0;
1654 if (j==front_courant.end()) ok=2;
1655 while (ok==0)
1656 {
1657 MG_FRONT_2D* fttmp=(*j).second;
1658 if (ft==fttmp) {ok=1;front_courant.erase(j);}
1659 if (fttmp->get_segment()->get_longueur()>ft->get_segment()->get_longueur()) ok=2;
1660 if (ok==0) j++;
1661 }
1662 if (ok!=1)
1663 {
1664 j=front_attente.lower_bound(ft->get_segment()->get_longueur());
1665 while (ft!=(*j).second) j++;
1666 front_attente.erase(j);
1667 }
1668
1669 delete ft;
1670 }
1671
1672 void MAILLEUR2D::echange_de_front(FRONT& front_original,FRONT& front_destination,MG_FRONT_2D* ft)
1673 {
1674 FRONT::iterator j=front_original.lower_bound(ft->get_segment()->get_longueur());
1675 while (ft!=(*j).second) j++;
1676 front_original.erase(j);
1677 ajouter_front(front_destination,ft);
1678 }
1679
1680 void MAILLEUR2D::enregistre_front(char *nom,int dimension)
1681 {
1682 TPL_MAP_ENTITE<MG_NOEUD*> lstno;
1683 TPL_LISTE_ENTITE<MG_FRONT_2D*> lstseg;
1684 for (FRONT::iterator j=front_courant.begin();j!=front_courant.end();j++)
1685 {
1686 MG_FRONT_2D* ft=j->second;
1687 lstno.ajouter(ft->get_noeud1());
1688 lstno.ajouter(ft->get_noeud2());
1689 lstseg.ajouter(ft);
1690 }
1691 for (FRONT::iterator j=front_attente.begin();j!=front_attente.end();j++)
1692 {
1693 MG_FRONT_2D* ft=j->second;
1694 lstno.ajouter(ft->get_noeud1());
1695 lstno.ajouter(ft->get_noeud2());
1696 lstseg.ajouter(ft);
1697 }
1698 MG_GESTIONNAIRE gestfront;
1699 MG_MAILLAGE* maift=new MG_MAILLAGE(NULL);
1700 gestfront.ajouter_mg_maillage(maift);
1701 TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR itn;
1702 int i=0;
1703 for (MG_NOEUD* no=lstno.get_premier(itn);no!=NULL;no=lstno.get_suivant(itn))
1704 {
1705 double x,y,z;
1706 i++;
1707 if (dimension==3)
1708 {
1709 x=no->get_x();
1710 y=no->get_y();
1711 z=no->get_z();
1712 }
1713 if (dimension==2)
1714 {
1715 x=no->get_u();
1716 y=no->get_v();
1717 z=0.;
1718 }
1719 MG_NOEUD* nno=new MG_NOEUD(NULL,x,y,z,MAGIC::ORIGINE::TRIANGULATION);
1720 maift->ajouter_mg_noeud(nno);
1721 no->change_nouveau_numero(nno->get_id());
1722 no->change_solution(i);
1723 }
1724 for (int i=0;i<lstseg.get_nb();i++)
1725 {
1726 MG_FRONT_2D* seg=lstseg.get(i);
1727 MG_NOEUD* no1=seg->get_noeud1();
1728 MG_NOEUD* no2=seg->get_noeud2();
1729 MG_NOEUD* nno1=maift->get_mg_noeudid(no1->get_nouveau_numero());
1730 MG_NOEUD* nno2=maift->get_mg_noeudid(no2->get_nouveau_numero());
1731 MG_SEGMENT* nseg=new MG_SEGMENT(NULL,nno1,nno2,MAGIC::ORIGINE::TRIANGULATION);
1732 maift->ajouter_mg_segment(nseg);
1733 MG_NOEUD* nop=seg->get_front_precedent()->get_noeud1();
1734 MG_NOEUD* nos=seg->get_front_suivant()->get_noeud2();
1735 printf("%d : %d %d %d %d \n",i+1,(int)nop->get_solution(),(int)no1->get_solution(),(int)no2->get_solution(),(int)nos->get_solution());
1736 }
1737 printf("----------------------------------\n");
1738 gestfront.enregistrer(nom);
1739 MG_EXPORT exp;
1740 exp.gmsh_avec_correspondance(maift,nom);
1741 }