ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mailleur_auto/src/mailleur2d.cpp
Revision: 1158
Committed: Thu Jun 13 22:18:49 2024 UTC (11 months, 1 week ago) by francois
File size: 83256 byte(s)
Log Message:
compatibilité Ubuntu 22.04
Suppression des refeences à Windows
Ajout d'une banière

File Contents

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