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

# User Rev Content
1 francois 1188 //####//------------------------------------------------------------
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 5
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 francois 447 #include "mailleur2d_optimisation.h"
32 francois 1095 #include "mg_export.h"
33 5
34    
35 francois 315
36 francois 494 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 5 {
38     }
39    
40    
41    
42     MAILLEUR2D::~MAILLEUR2D()
43     {
44     }
45    
46    
47    
48    
49 couturad 966 int MAILLEUR2D::maille(MG_GROUPE_TOPOLOGIQUE* mggt)
50 5 {
51 couturad 966 if (mg_face!=NULL)
52     {
53     if(maille(mg_face)==FAIL) return FAIL;
54     }
55 5 else
56     {
57 francois 210 TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*> lst;
58     if (mggt!=NULL)
59     {
60 couturad 906 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 francois 210 }
67 5 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 francois 210 if (mggt!=NULL)
72     if (lst.existe(mgface)==0) continue;
73 couturad 967 if(maille(mgface)==FAIL) return FAIL;
74 5 }
75     }
76 couturad 966 return OK;
77 5 }
78    
79    
80 couturad 966 int MAILLEUR2D::maille(MG_FACE* mgface,TPL_LISTE_ENTITE<MG_SEGMENT*> *lstseg,TPL_LISTE_ENTITE<MG_TRIANGLE*> *lsttri)
81 5 {
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 francois 632 cree_ntree(mgface);
87 francois 820 TPL_MAP_ENTITE<MG_SOMMET*> liste_pole_sommet;
88     initialise_front(mgface,liste_pole_sommet);
89 5 if (lstseg!=NULL) insere_contrainte_segment(mgface,lstseg);
90     if (lsttri!=NULL) insere_contrainte_triangle(mgface,lsttri);
91 francois 820 if (mgface->get_nb_pole()>0) traite_pole(mgface,liste_pole_sommet);
92 couturad 966 if(progresse_front(mgface)==FAIL)
93     {
94     delete ntree_de_segment;
95     delete ntree_de_front;
96     delete decalage;
97     return FAIL;
98     }
99 francois 645 int verif=param.get_valeur("Verification_coin_face_mailleur2D");
100 francois 696 TPL_LISTE_ENTITE<MG_TRIANGLE*> lsttriaffectecoin;
101 francois 645 if (verif==1)
102 francois 696 verifie_coin_sommet(mgface,&lsttriaffectecoin);
103 francois 447 MAILLEUR2D_OPTIMISATION opt(mg_maillage,niveau_optimisation);
104 francois 696 if (affichageactif==1) opt.active_affichage(affiche2);
105 francois 447 opt.optimise(mgface);
106 francois 696 if (verif==1)
107     for (int i=0;i<lsttriaffectecoin.get_nb();i++)
108 francois 791 lsttriaffectecoin.get(i)->change_origine(MAGIC::ORIGINE::MAILLEUR_AUTO);
109 francois 632 delete ntree_de_segment;
110     delete ntree_de_front;
111 5 delete decalage;
112     segment_frontiere.vide();
113     noeud_frontiere.vide();
114 couturad 966 return OK;
115 5 }
116    
117    
118 francois 820 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 francois 1188 TPL_MAP_ENTITE<MG_FRONT_2D*> liste_supprimer;
150 francois 820 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 francois 1188 if (liste_supprimer.existe(ft)) continue;
155 francois 820 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 francois 1188 liste_supprimer.ajouter(ft);
192     liste_supprimer.ajouter(fts);
193 francois 820 supprimer_front(ft);
194     supprimer_front(fts);
195 francois 1188 MG_SEGMENT** tabseg=new MG_SEGMENT*[nbtri];
196 francois 820 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 francois 1150 ierr=ierr*insere_segment(mgface,&(tabseg[i]),noc,nn,MAGIC::MAILLEURFRONTALETAT::TOUS_FRONT);
215 francois 820 noc=nn;
216     }
217 francois 1150 ierr=ierr*insere_segment(mgface,&(tabseg[nbtri-1]),noc,no2,MAGIC::MAILLEURFRONTALETAT::TOUS_FRONT);
218 francois 820 }
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 francois 1150 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 francois 820 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 francois 1150 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 francois 820 }
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 francois 1150 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 francois 820 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 francois 1150 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 francois 820 }
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 francois 696 void MAILLEUR2D::verifie_coin_sommet(MG_FACE* mgface,TPL_LISTE_ENTITE<MG_TRIANGLE*> *lstaffectecoin)
433 francois 645 {
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 francois 696 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 francois 791 tri->change_origine(MAGIC::ORIGINE::IMPOSE);
475 francois 696 lstaffectecoin->ajouter(tri);
476     }
477 francois 791 if ((nbtrivoisin==1) && (trivoi->get_origine()==MAGIC::ORIGINE::MAILLEUR_AUTO))
478 francois 645 {
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 francois 700 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 francois 791 tri1->change_origine(MAGIC::ORIGINE::IMPOSE);
524     tri2->change_origine(MAGIC::ORIGINE::IMPOSE);
525 francois 696 lstaffectecoin->ajouter(tri1);
526     lstaffectecoin->ajouter(tri2);
527 francois 645 mg_maillage->supprimer_mg_triangleid(trivoi->get_id());
528     mg_maillage->supprimer_mg_triangleid(autretri->get_id());
529     }
530     }
531    
532     }
533 5
534 francois 645 }
535 5
536    
537     void MAILLEUR2D::initialise_frontiere(MG_FACE* mgface)
538     {
539 francois 1095 umin=1e308;vmin=1e308;
540     umax=-1e308;vmax=-1e308;
541 5 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 francois 61 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 francois 315 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 francois 61 }
570     if (mgface->get_surface()->est_periodique_v()==1)
571     {
572 francois 315 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 francois 61 }
576 francois 632 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 francois 61 mgnoeud->change_u(uv[0]);
581     mgnoeud->change_v(uv[1]);
582     noeud_frontiere.ajouter(mgnoeud);
583     }
584 5 mgnoeud=mgsegment->get_noeud2();
585 francois 61 if (!noeud_frontiere.est_dans_la_liste(mgnoeud))
586 5 {
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 francois 315 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 5 }
596     if (mgface->get_surface()->est_periodique_v()==1)
597     {
598 francois 315 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 5 }
602 francois 632 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 5 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 francois 632 void MAILLEUR2D::cree_ntree(MG_FACE* mgface)
618 5 {
619     int nb_noeud=noeud_frontiere.get_nb();
620 francois 1095 BOITE_3D boiteface=mgface->get_boite_3D();
621 francois 632 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 5 int nb_segment=segment_frontiere.get_nb();
635     for (int j=0;j<nb_segment;j++)
636     {
637 francois 632 MG_SEGMENT* seg=segment_frontiere.get(j);
638     ntree_de_segment->inserer(segment_frontiere.get(j));
639 5 }
640     }
641    
642    
643 francois 820 void MAILLEUR2D::initialise_front(MG_FACE* mgface,TPL_MAP_ENTITE<MG_SOMMET*> &liste_pole)
644 5 {
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 francois 820 MG_SEGMENT* segment_courant=NULL;
670 5 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 francois 632 ntree_de_segment->inserer(mgsegment);
727 5 if (get_nb_front(front_courant)==nb_front_avant_cette_boucle+1) premier_front=front;
728     front->changer_front_precedent(front_precedent);
729 couturad 683 if (front_precedent!=NULL) front_precedent->changer_front_suivant(front);
730 5 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 francois 632 ntree_de_segment->inserer(mgsegment);
750 5 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 francois 820 if (mgsommet->est_pole()) liste_pole.ajouter(mgsommet);
768 5 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 francois 820
876 5 }
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 couturad 919 int MAILLEUR2D::progresse_front(MG_FACE* mgface)
886 5 {
887     int compteur=0;
888 couturad 919 long Nb_iteration_max_mailleur2d = (long)param.get_valeur((char*)"Nb_iteration_max_mailleur2d");
889 5 while (get_nb_front(front_courant)!=0)
890     {
891 couturad 919 if(compteur>Nb_iteration_max_mailleur2d)
892     {
893     std::cerr << "*** MAILLEUR2D::progresse_front : Nb_iteration_max_mailleur2d atteint ! ***" << std::endl;
894 couturad 951 mg_maillage->get_gestionnaire()->enregistrer("void.magic");
895 couturad 919 return FAIL;
896     }
897 5 compteur++;
898 francois 315 /*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 couturad 919
909 francois 1106 if ((mgface->get_id()==3854) && (compteur%100==0) && (compteur>0))
910 francois 1037 {
911     mg_maillage->get_gestionnaire()->enregistrer("toto.magic");
912 francois 1106 }
913 5 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 francois 1150 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 5 {
966 francois 1150 solution=traite_front(MAGIC::MAILLEURFRONTALETAT::CAS_GENERAL,mgface,ftp,ft,fts);
967     if ((solution!=MAGIC::MAILLEURFRONTALETAT::PASTROUVE)&&(solution!=MAGIC::MAILLEURFRONTALETAT::TROUVE))
968 francois 1158 {if (!type_cas_front[solution]) solution=traite_front(solution,mgface,ftp,ft,fts); else solution=MAGIC::MAILLEURFRONTALETAT::PASTROUVE;}
969 francois 1150 if (solution==MAGIC::MAILLEURFRONTALETAT::PASTROUVE)
970 5 {
971     echange_de_front(front_courant,front_attente,ft);
972     ft->incremente_ifail();
973 francois 1150 solution=MAGIC::MAILLEURFRONTALETAT::TROUVE;
974 5 }
975     }
976     if (get_nb_front(front_courant)==0) front_courant.swap(front_attente);
977     }
978 couturad 919 return OK;
979 5 }
980    
981    
982    
983 francois 447
984 5 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 francois 632 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 5 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 francois 632 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 francois 61 if (dist<1e-5*rayonrecherche)
1058 5 {
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 francois 632 OT_VECTEUR_3D vec2(xyz2,xyzfront);
1098     dist=vec2.get_longueur();
1099     //dist=sqrt((ufront-u2)*(ufront-u2)+(vfront-v2)*(vfront-v2));
1100 francois 61 if (dist<1e-5*rayonrecherche)
1101 5 {
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 francois 791 noeud1=mg_maillage->ajouter_mg_noeud(mgface,coord[0],coord[1],coord[2],MAGIC::ORIGINE::IMPOSE);
1149 5 noeud1->change_u(uv1[0]);
1150     noeud1->change_v(uv1[1]);
1151 francois 447 noeud1->change_nouveau_numero(noeudori1->get_nouveau_numero());
1152 francois 155 }
1153 5 if (ref2!=NULL) noeud2=ref2->get_noeud2();
1154     else
1155     {
1156     double *coord=noeudori2->get_coord();
1157 francois 791 noeud2=mg_maillage->ajouter_mg_noeud(mgface,coord[0],coord[1],coord[2],MAGIC::ORIGINE::IMPOSE);
1158 5 noeud2->change_u(uv2[0]);
1159     noeud2->change_v(uv2[1]);
1160 francois 155 noeud2->change_nouveau_numero(noeudori2->get_nouveau_numero());
1161     }
1162 francois 791 MG_SEGMENT* mgsegment=mg_maillage->ajouter_mg_segment(mgface,noeud1,noeud2,MAGIC::ORIGINE::IMPOSE);
1163 5 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 francois 33 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 5 }
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 francois 33 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 francois 632 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 5 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 francois 632 //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 francois 54 if (dist<1e-5*rayonrecherche)
1293 5 {
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 francois 632 //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 francois 54 if (dist<1e-5*rayonrecherche)
1345 5 {
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 francois 632 //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 francois 54 if (dist<1e-5*rayonrecherche)
1397 5 {
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 francois 791 noeud1=mg_maillage->ajouter_mg_noeud(mgface,coord[0],coord[1],coord[2],MAGIC::ORIGINE::IMPOSE);
1454 5 noeud1->change_u(uv1[0]);
1455     noeud1->change_v(uv1[1]);
1456 francois 447 noeud1->change_nouveau_numero(noeudori1->get_nouveau_numero());
1457 5 }
1458     if (ref2!=NULL) noeud2=ref2->get_noeud2();
1459     else
1460     {
1461     double *coord=noeudori2->get_coord();
1462 francois 791 noeud2=mg_maillage->ajouter_mg_noeud(mgface,coord[0],coord[1],coord[2],MAGIC::ORIGINE::IMPOSE);
1463 5 noeud2->change_u(uv2[0]);
1464     noeud2->change_v(uv2[1]);
1465 francois 155 noeud2->change_nouveau_numero(noeudori2->get_nouveau_numero());
1466 5 }
1467     if (ref3!=NULL) noeud3=ref3->get_noeud2();
1468     else
1469     {
1470     double *coord=noeudori3->get_coord();
1471 francois 791 noeud3=mg_maillage->ajouter_mg_noeud(mgface,coord[0],coord[1],coord[2],MAGIC::ORIGINE::IMPOSE);
1472 5 noeud3->change_u(uv3[0]);
1473     noeud3->change_v(uv3[1]);
1474 francois 447 noeud3->change_nouveau_numero(noeudori3->get_nouveau_numero());
1475 5 }
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 francois 791 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 5 mg_maillage->ajouter_mg_triangle(mtriangle);
1485 francois 632 int segtotal=seg1+seg2+seg3;
1486 5 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 francois 447 void MAILLEUR2D::change_niveau_optimisation(int num)
1610     {
1611     niveau_optimisation=num;
1612     }
1613 5
1614 francois 447 int MAILLEUR2D::get_niveau_optimisation(void)
1615     {
1616     return niveau_optimisation;
1617     }
1618    
1619    
1620 5 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 francois 632 ntree_de_front->inserer(ft);
1625 5 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 francois 632 ntree_de_front->supprimer(ft);
1651 5
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 francois 1158 if (ok==0) j++;
1661 5 }
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 francois 632
1680 francois 1095 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     }