ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mailleur_auto/src/mailleur2d.cpp
Revision: 1150
Committed: Tue May 28 12:57:28 2024 UTC (11 months, 3 weeks ago) by francois
File size: 84088 byte(s)
Log Message:
deplacement des contantes dans le namespace MAGIC

File Contents

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