ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mailleur_auto/src/mailleur2d.cpp
Revision: 700
Committed: Thu Jul 30 20:36:15 2015 UTC (9 years, 9 months ago) by francois
File size: 67516 byte(s)
Log Message:
bug dans l'inversion de diagonale presque resolu pour l'optimisation 2D

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 5
36    
37 francois 315
38 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)
39 5 {
40     }
41    
42    
43    
44     MAILLEUR2D::~MAILLEUR2D()
45     {
46     }
47    
48    
49    
50    
51 francois 210 void MAILLEUR2D::maille(MG_GROUPE_TOPOLOGIQUE* mggt)
52 5 {
53     if (mg_face!=NULL) maille(mg_face);
54     else
55     {
56 francois 210 TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*> lst;
57     if (mggt!=NULL)
58     {
59     int nb=mggt->get_nb();
60     for (int i=0;i<nb;i++)
61     {
62     lst.ajouter(mggt->get(i));
63     mggt->get(i)->get_topologie_sousjacente(&lst);
64     }
65     }
66 5 int nb_face=mg_geometrie->get_nb_mg_face();
67     for (int i=0;i<nb_face;i++)
68     {
69     MG_FACE* mgface=mg_geometrie->get_mg_face(i);
70 francois 210 if (mggt!=NULL)
71     if (lst.existe(mgface)==0) continue;
72 5 maille(mgface);
73     }
74     }
75     }
76    
77    
78     void MAILLEUR2D::maille(MG_FACE* mgface,TPL_LISTE_ENTITE<MG_SEGMENT*> *lstseg,TPL_LISTE_ENTITE<MG_TRIANGLE*> *lsttri)
79     {
80     periode_u=mgface->get_surface()->get_periode_u();
81     periode_v=mgface->get_surface()->get_periode_v();
82     decalage=new OT_DECALAGE_PARAMETRE(periode_u,periode_v);
83     //afficheur << MAILLAGEFACE << mgface->get_id() << endaff;
84     initialise_frontiere(mgface);
85 francois 632 cree_ntree(mgface);
86 5 initialise_front(mgface);
87     if (lstseg!=NULL) insere_contrainte_segment(mgface,lstseg);
88     if (lsttri!=NULL) insere_contrainte_triangle(mgface,lsttri);
89     progresse_front(mgface);
90 francois 645 int verif=param.get_valeur("Verification_coin_face_mailleur2D");
91 francois 696 TPL_LISTE_ENTITE<MG_TRIANGLE*> lsttriaffectecoin;
92 francois 645 if (verif==1)
93 francois 696 verifie_coin_sommet(mgface,&lsttriaffectecoin);
94 francois 447 MAILLEUR2D_OPTIMISATION opt(mg_maillage,niveau_optimisation);
95 francois 696 if (affichageactif==1) opt.active_affichage(affiche2);
96 francois 447 opt.optimise(mgface);
97 francois 696 if (verif==1)
98     for (int i=0;i<lsttriaffectecoin.get_nb();i++)
99     lsttriaffectecoin.get(i)->change_origine(MAILLEUR_AUTO);
100 francois 632 delete ntree_de_segment;
101     //delete quadtree_de_frontiere;
102     delete ntree_de_front;
103 5 delete decalage;
104     segment_frontiere.vide();
105     noeud_frontiere.vide();
106     //ofstream o3("test_2D.mai",ios::out|ios::trunc);
107     //o3.precision(16);
108     //o3.setf(ios::showpoint);
109     //mg_maillage->enregistrer_sous_mesh_2D(o3);
110     }
111    
112    
113 francois 696 void MAILLEUR2D::verifie_coin_sommet(MG_FACE* mgface,TPL_LISTE_ENTITE<MG_TRIANGLE*> *lstaffectecoin)
114 francois 645 {
115     TPL_MAP_ENTITE<MG_SOMMET*> lstsom;
116     int nbboucle=mgface->get_nb_mg_boucle();
117     for (int i=0;i<nbboucle;i++)
118     {
119     MG_BOUCLE *bou=mgface->get_mg_boucle(i);
120     int nbare=bou->get_nb_mg_coarete();
121     for (int j=0;j<nbare;j++)
122     {
123     lstsom.ajouter(bou->get_mg_coarete(j)->get_arete()->get_cosommet1()->get_sommet());
124     lstsom.ajouter(bou->get_mg_coarete(j)->get_arete()->get_cosommet2()->get_sommet());
125     }
126     }
127     TPL_MAP_ENTITE<MG_SOMMET*>::ITERATEUR it;
128     for (MG_SOMMET* som=lstsom.get_premier(it);som!=NULL;som=lstsom.get_suivant(it))
129     {
130     MG_NOEUD* no;
131     int i=0;
132     do
133     {
134     no=(MG_NOEUD*)som->get_lien_maillage()->get(i);
135     i++;
136     }
137     while (mg_maillage->get_mg_noeudid(no->get_id())!=no);
138     int nbtri=no->get_lien_triangle()->get_nb();
139     int nbtrivoisin=0;
140     MG_TRIANGLE* trivoi;
141     for (int i=0;i<nbtri;i++)
142     {
143     MG_TRIANGLE* tri=no->get_lien_triangle()->get(i);
144     if (mg_maillage->get_mg_triangleid(tri->get_id())!=tri) continue;
145     if (tri->get_lien_topologie()==mgface)
146     nbtrivoisin++;
147     trivoi=tri;
148     }
149 francois 696 if (nbtrivoisin>1)
150     for (int i=0;i<nbtri;i++)
151     {
152     MG_TRIANGLE* tri=no->get_lien_triangle()->get(i);
153     if (mg_maillage->get_mg_triangleid(tri->get_id())!=tri) continue;
154     if (tri->get_lien_topologie()==mgface)
155     tri->change_origine(IMPOSE);
156     lstaffectecoin->ajouter(tri);
157     }
158 francois 663 if ((nbtrivoisin==1) && (trivoi->get_origine()==MAILLEUR_AUTO))
159 francois 645 {
160     MG_NOEUD *no1,*no2;
161     if (no==trivoi->get_noeud1()) {no1=trivoi->get_noeud2();no2=trivoi->get_noeud3();}
162     if (no==trivoi->get_noeud2()) {no1=trivoi->get_noeud3();no2=trivoi->get_noeud1();}
163     if (no==trivoi->get_noeud3()) {no1=trivoi->get_noeud1();no2=trivoi->get_noeud2();}
164     MG_TRIANGLE* autretri=NULL;
165     for (int i=0;i<no1->get_lien_triangle()->get_nb();i++)
166     for (int j=0;j<no2->get_lien_triangle()->get_nb();j++)
167     {
168     MG_TRIANGLE* tri1=no1->get_lien_triangle()->get(i);
169     MG_TRIANGLE* tri2=no2->get_lien_triangle()->get(j);
170     if (tri1==tri2)
171     if (tri1!=trivoi) autretri=tri1;
172     }
173     if (autretri!=NULL)
174     {
175     MG_NOEUD* autrenoeud;
176     if ((autretri->get_noeud1()!=no1) && (autretri->get_noeud1()!=no2)) autrenoeud=autretri->get_noeud1();
177     if ((autretri->get_noeud2()!=no1) && (autretri->get_noeud2()!=no2)) autrenoeud=autretri->get_noeud2();
178     if ((autretri->get_noeud3()!=no1) && (autretri->get_noeud3()!=no2)) autrenoeud=autretri->get_noeud3();
179 francois 700 double nqual1=OPERATEUR::qualite_triangle(no1->get_coord(),autrenoeud->get_coord(),no->get_coord());
180     double nqual2=OPERATEUR::qualite_triangle(no2->get_coord(),no->get_coord(),autrenoeud->get_coord());
181     OT_VECTEUR_3D n1n3(no1->get_coord(),no->get_coord());
182     OT_VECTEUR_3D n1n4(no1->get_coord(),autrenoeud->get_coord());
183     double xyznormal[3];
184     double uv[2]={no1->get_u(),no1->get_v()};
185     mgface->calcul_normale_unitaire(uv,xyznormal);
186     OT_VECTEUR_3D normalface(xyznormal);
187     OT_VECTEUR_3D normal=normalface&n1n3;
188     normal.norme();
189     n1n4.norme();
190     if (normal*n1n4<0.0001) nqual1=-nqual1;
191     OT_VECTEUR_3D n2n4(no2->get_coord(),autrenoeud->get_coord());
192     OT_VECTEUR_3D n2n3(no2->get_coord(),no->get_coord());
193     double uv2[2]={no2->get_u(),no2->get_v()};
194     mgface->calcul_normale_unitaire(uv2,xyznormal);
195     OT_VECTEUR_3D normalface2(xyznormal);
196     OT_VECTEUR_3D normal2=normalface&n2n4;
197     normal2.norme();
198     n2n3.norme();
199     if (normal2*n2n3<0.0001) nqual2=-nqual2;
200     if (nqual1<1e-4) continue;
201     if (nqual2<1e-4) continue;
202     MG_TRIANGLE* tri1=insere_triangle(mgface,no1,autrenoeud,no);
203     MG_TRIANGLE* tri2=insere_triangle(mgface,no2,no,autrenoeud);
204 francois 696 tri1->change_origine(IMPOSE);
205     tri2->change_origine(IMPOSE);
206     lstaffectecoin->ajouter(tri1);
207     lstaffectecoin->ajouter(tri2);
208 francois 645 mg_maillage->supprimer_mg_triangleid(trivoi->get_id());
209     mg_maillage->supprimer_mg_triangleid(autretri->get_id());
210     }
211     }
212    
213     }
214 5
215 francois 645 }
216 5
217    
218     void MAILLEUR2D::initialise_frontiere(MG_FACE* mgface)
219     {
220 francois 632 umin=1e308;vmin=1e-308;
221     umax=-1e308;vmax=-1e-308;
222 5 int nb_boucle=mgface->get_nb_mg_boucle();
223     for (int i=0;i<nb_boucle;i++)
224     {
225     MG_BOUCLE* mgboucle=mgface->get_mg_boucle(i);
226     int nb_coarete=mgboucle->get_nb_mg_coarete();
227     for (int j=0;j<nb_coarete;j++)
228     {
229     MG_COARETE* coarete=mgboucle->get_mg_coarete(j);
230     MG_ARETE* mgarete=coarete->get_arete();
231     int nb_segment=mgarete->get_lien_maillage()->get_nb();
232     for (int k=0;k<nb_segment;k++)
233     {
234     refresh();
235     MG_SEGMENT* mgsegment=(MG_SEGMENT*)mgarete->get_lien_maillage()->get(k);
236     MG_SEGMENT* mgsegtemp=mg_maillage->get_mg_segmentid(mgsegment->get_id());
237     if (mgsegtemp==NULL) continue;
238     MG_NOEUD* mgnoeud=mgsegment->get_noeud1();
239     segment_frontiere.ajouter(mgsegment);
240 francois 61 if (!noeud_frontiere.est_dans_la_liste(mgnoeud))
241     {
242     double uv[2];
243     double *coo=mgnoeud->get_coord();
244     mgface->inverser(uv,coo,1e-4);
245     if (mgface->get_surface()->est_periodique_u()==1)
246     {
247 francois 315 double eps=1e-10*mgface->get_surface()->get_periode_u();
248     if (uv[0]<-eps) uv[0]=uv[0]+mgface->get_surface()->get_periode_u();
249     if (uv[0]>=mgface->get_surface()->get_periode_u()-eps) uv[0]=uv[0]-mgface->get_surface()->get_periode_u();
250 francois 61 }
251     if (mgface->get_surface()->est_periodique_v()==1)
252     {
253 francois 315 double eps=1e-10*mgface->get_surface()->get_periode_v();
254     if (uv[1]<-eps) uv[1]=uv[1]+mgface->get_surface()->get_periode_v();
255     if (uv[1]>=mgface->get_surface()->get_periode_v()-eps) uv[1]=uv[1]-mgface->get_surface()->get_periode_v();
256 francois 61 }
257 francois 632 if (uv[0]<umin) umin=uv[0];
258     if (uv[1]<vmin) vmin=uv[1];
259     if (uv[0]>umax) umax=uv[0];
260     if (uv[1]>vmax) vmax=uv[1];
261 francois 61 mgnoeud->change_u(uv[0]);
262     mgnoeud->change_v(uv[1]);
263     noeud_frontiere.ajouter(mgnoeud);
264     }
265 5 mgnoeud=mgsegment->get_noeud2();
266 francois 61 if (!noeud_frontiere.est_dans_la_liste(mgnoeud))
267 5 {
268     double uv[2];
269     double *coo=mgnoeud->get_coord();
270     mgface->inverser(uv,coo,1e-4);
271     if (mgface->get_surface()->est_periodique_u()==1)
272     {
273 francois 315 double eps=1e-10*mgface->get_surface()->get_periode_u();
274     if (uv[0]<-eps) uv[0]=uv[0]+mgface->get_surface()->get_periode_u();
275     if (uv[0]>=mgface->get_surface()->get_periode_u()-eps) uv[0]=uv[0]-mgface->get_surface()->get_periode_u();
276 5 }
277     if (mgface->get_surface()->est_periodique_v()==1)
278     {
279 francois 315 double eps=1e-10*mgface->get_surface()->get_periode_v();
280     if (uv[1]<-eps) uv[1]=uv[1]+mgface->get_surface()->get_periode_v();
281     if (uv[1]>=mgface->get_surface()->get_periode_v()-eps) uv[1]=uv[1]-mgface->get_surface()->get_periode_v();
282 5 }
283 francois 632 if (uv[0]<umin) umin=uv[0];
284     if (uv[1]<vmin) vmin=uv[1];
285     if (uv[0]>umax) umax=uv[0];
286     if (uv[1]>vmax) vmax=uv[1];
287 5 mgnoeud->change_u(uv[0]);
288     mgnoeud->change_v(uv[1]);
289     noeud_frontiere.ajouter(mgnoeud);
290     }
291     }
292    
293     }
294     }
295    
296     }
297    
298 francois 632 void MAILLEUR2D::cree_ntree(MG_FACE* mgface)
299 5 {
300     int nb_noeud=noeud_frontiere.get_nb();
301 francois 632 int nb_echan=(int)param.get_valeur((char*)"Echantillon_face");
302     BOITE_3D boiteface=mgface->get_boite_3D(nb_echan);
303     boiteface.change_grosseur(1.1);
304     BOITE_3D boitemetrique=metrique->get_boite_3D();
305     BOITE_3D boite=boiteface&boitemetrique;
306     boite=boitemetrique;
307     double xmin=boite.get_xmin();
308     double ymin=boite.get_ymin();
309     double zmin=boite.get_zmin();
310     double xmax=boite.get_xmax();
311     double ymax=boite.get_ymax();
312     double zmax=boite.get_zmax();
313     ntree_de_segment=new TPL_NTREE_FCT<MG_SEGMENT*,FCT_TAILLE>;
314     ntree_de_front=new TPL_OCTREE<MG_FRONT_2D*,MG_NOEUD*>;
315     ntree_de_segment->initialiser(*metrique,xmin,ymin,zmin,xmax,ymax,zmax);
316     ntree_de_front->initialiser(ntree_de_segment);
317 5 int nb_segment=segment_frontiere.get_nb();
318     for (int j=0;j<nb_segment;j++)
319     {
320 francois 632 MG_SEGMENT* seg=segment_frontiere.get(j);
321     ntree_de_segment->inserer(segment_frontiere.get(j));
322 5 }
323     }
324    
325    
326     void MAILLEUR2D::initialise_front(MG_FACE* mgface)
327     {
328     MG_FRONT_2D::initialise_compteur_id();
329     int nb_boucle=mgface->get_nb_mg_boucle();
330     for (int iboucle=0;iboucle<nb_boucle;iboucle++)
331     {
332     unsigned int nb_front_avant_cette_boucle=get_nb_front(front_courant);
333     MG_BOUCLE* mgboucle=mgface->get_mg_boucle(iboucle);
334     unsigned int nbcoaretetotale=mgboucle->get_nb_mg_coarete();
335     MG_COARETE* mgcoarete=mgboucle->get_mg_coarete(0);
336     MG_NOEUD* noeud_de_depart;
337     int bon_noeud=0;
338     int numnoeud=0;
339     while (bon_noeud==0)
340     {
341     if (mgcoarete->get_orientation()==MEME_SENS) noeud_de_depart=(MG_NOEUD*)mgcoarete->get_arete()->get_cosommet1()->get_sommet()->get_lien_maillage()->get(numnoeud);
342     else noeud_de_depart=(MG_NOEUD*)mgcoarete->get_arete()->get_cosommet2()->get_sommet()->get_lien_maillage()->get(numnoeud);
343     MG_NOEUD* noeudtemp=mg_maillage->get_mg_noeudid(noeud_de_depart->get_id());
344     if (noeudtemp==NULL) numnoeud++; else bon_noeud=1;
345     }
346     MG_FRONT_2D* premier_front;
347     MG_NOEUD* noeud_courant=noeud_de_depart;
348     MG_SEGMENT* segment_courant=NULL;
349     MG_FRONT_2D* front_precedent=NULL;
350     unsigned int nbcoaretetraite=0;
351     do
352     {
353     nbcoaretetraite++;
354     MG_NOEUD* noeud_d_arrivee;
355     int bon_noeud=0;
356     int numnoeud=0;
357     while (bon_noeud==0)
358     {
359     if (mgcoarete->get_orientation()==MEME_SENS) noeud_d_arrivee=(MG_NOEUD*)mgcoarete->get_arete()->get_cosommet2()->get_sommet()->get_lien_maillage()->get(numnoeud);
360     else noeud_d_arrivee=(MG_NOEUD*)mgcoarete->get_arete()->get_cosommet1()->get_sommet()->get_lien_maillage()->get(numnoeud);
361     MG_NOEUD* noeudtemp=mg_maillage->get_mg_noeudid(noeud_d_arrivee->get_id());
362     if (noeudtemp==NULL) numnoeud++; else bon_noeud=1;
363     }
364     MG_ARETE* mgarete=mgcoarete->get_arete();
365     int passe_aretefermee=0;
366     do
367     {
368     int trouve=0;
369     int i;
370     if ((mgcoarete->get_arete()->get_cosommet1()->get_sommet()==mgcoarete->get_arete()->get_cosommet2()->get_sommet())&&(passe_aretefermee==0))
371     {
372     passe_aretefermee=1;
373     MG_SEGMENT* mgsegment_depart1=NULL;
374     MG_SEGMENT* mgsegment_depart2=NULL;
375     TPL_SET<MG_ELEMENT_MAILLAGE*>::ITERATEUR it;
376     MG_SEGMENT* mgsegment=(MG_SEGMENT*)mgarete->get_lien_maillage()->get_premier(it);
377     do
378     {
379     if ((mgsegment->get_noeud1()==noeud_courant) || (mgsegment->get_noeud2()==noeud_courant)) mgsegment_depart1=mgsegment;
380     mgsegment=(MG_SEGMENT*)mgarete->get_lien_maillage()->get_suivant(it);
381     }
382     while (mgsegment_depart1==NULL);
383     do
384     {
385     if ((mgsegment->get_noeud1()==noeud_courant) || (mgsegment->get_noeud2()==noeud_courant)) mgsegment_depart2=mgsegment;
386     mgsegment=(MG_SEGMENT*)mgarete->get_lien_maillage()->get_suivant(it);
387     }
388     while (mgsegment_depart2==NULL);
389     MG_NOEUD* noeud1_2;
390     MG_NOEUD* noeud2_2;
391     if (mgsegment_depart1->get_noeud1()==noeud_courant) noeud1_2=mgsegment_depart1->get_noeud2(); else noeud1_2=mgsegment_depart1->get_noeud1();
392     if (mgsegment_depart2->get_noeud1()==noeud_courant) noeud2_2=mgsegment_depart2->get_noeud2(); else noeud2_2=mgsegment_depart2->get_noeud1();
393     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());
394     double coo[3];
395     mgarete->deriver(mgarete->get_tmin(),coo);
396     OT_VECTEUR_3D tangeante(coo[0]*mgcoarete->get_orientation(),coo[1]*mgcoarete->get_orientation(),coo[2]*mgcoarete->get_orientation());
397     MG_NOEUD* noeud_suivant;
398     if (vecteur1*tangeante>0.)
399     {
400     mgsegment=mgsegment_depart1;
401     noeud_suivant=noeud1_2;
402     }
403     else
404     {
405     mgsegment=mgsegment_depart2;
406     noeud_suivant=noeud2_2;
407     }
408     MG_FRONT_2D* front=ajouter_front(front_courant,noeud_courant,noeud_suivant,mgsegment);
409 francois 632 ntree_de_segment->inserer(mgsegment);
410 5 if (get_nb_front(front_courant)==nb_front_avant_cette_boucle+1) premier_front=front;
411     front->changer_front_precedent(front_precedent);
412 couturad 683 if (front_precedent!=NULL) front_precedent->changer_front_suivant(front);
413 5 front_precedent=front;
414     noeud_courant=noeud_suivant;
415     segment_courant=mgsegment;
416     }
417     else
418     {
419     trouve=0;
420     TPL_SET<MG_ELEMENT_MAILLAGE*>::ITERATEUR it;
421     MG_SEGMENT* mgsegment=(MG_SEGMENT*)mgarete->get_lien_maillage()->get_premier(it);
422     do
423     {
424     if ((mgsegment->get_noeud1()==noeud_courant) || (mgsegment->get_noeud2()==noeud_courant))
425     if (mgsegment!=segment_courant)
426     {
427     trouve=1;
428     MG_NOEUD* noeud_suivant;
429     if (mgsegment->get_noeud1()==noeud_courant) noeud_suivant=mgsegment->get_noeud2();
430     else if (mgsegment->get_noeud2()==noeud_courant) noeud_suivant=mgsegment->get_noeud1();
431     MG_FRONT_2D* front=ajouter_front(front_courant,noeud_courant,noeud_suivant,mgsegment);
432 francois 632 ntree_de_segment->inserer(mgsegment);
433 5 if (get_nb_front(front_courant)==nb_front_avant_cette_boucle+1) premier_front=front;
434     else front_precedent->changer_front_suivant(front);
435     front->changer_front_precedent(front_precedent);
436     front_precedent=front;
437     noeud_courant=noeud_suivant;
438     segment_courant=mgsegment;
439     }
440     mgsegment=(MG_SEGMENT*)mgarete->get_lien_maillage()->get_suivant(it);
441     }
442     while (trouve==0);
443     }
444     }
445     while (noeud_courant!=noeud_d_arrivee);
446     int trouve=0;
447     MG_SOMMET* mgsommet;
448     if (mgcoarete->get_orientation()==MEME_SENS) mgsommet=mgcoarete->get_arete()->get_cosommet2()->get_sommet();
449     else mgsommet=mgcoarete->get_arete()->get_cosommet1()->get_sommet();
450     double xyz[3];
451     mgsommet->get_point()->evaluer(xyz);
452     int nbcoaretesuivante=mgboucle->get_nb_mg_coarete();
453     MG_COARETE* mgcoaretetmp=NULL;
454     double angleref=0.;
455     double angleref2=0.;
456     for (int i=0;i<nbcoaretesuivante;i++)
457     {
458     MG_COARETE* mgcoarete_suivante=mgboucle->get_mg_coarete(i);
459     MG_SOMMET* mgsommet_suivant;
460     if (mgcoarete_suivante->get_orientation()==MEME_SENS) mgsommet_suivant=mgcoarete_suivante->get_arete()->get_cosommet1()->get_sommet();
461     else mgsommet_suivant=mgcoarete_suivante->get_arete()->get_cosommet2()->get_sommet();
462     if (mgsommet==mgsommet_suivant)
463     {
464     if (trouve==0)
465     {
466     trouve=1;
467     mgcoaretetmp=mgcoarete_suivante;
468     }
469     else
470     {
471     //angleref
472     double uv[2];
473     mgface->inverser(uv,xyz);
474     double normal[3];
475     mgface->calcul_normale_unitaire(uv,normal);
476     double dir1[3];
477     double dir2[3];
478     MG_COSOMMET* mgcosommet;
479     if (mgcoarete->get_orientation()==MEME_SENS) mgcosommet=mgcoarete->get_arete()->get_cosommet2();
480     else mgcosommet=mgcoarete->get_arete()->get_cosommet1();
481     mgcoarete->get_arete()->deriver(mgcosommet->get_t(),dir1);
482     if (mgcoaretetmp->get_orientation()==MEME_SENS) mgcosommet=mgcoaretetmp->get_arete()->get_cosommet1();
483     else mgcosommet=mgcoaretetmp->get_arete()->get_cosommet2();
484     mgcoaretetmp->get_arete()->deriver(mgcosommet->get_t(),dir2);
485     int sens1=mgcoarete->get_orientation();
486     int sens2=mgcoaretetmp->get_orientation();
487     OT_VECTEUR_3D vec1(-dir1[0]*sens1,-dir1[1]*sens1,-dir1[2]*sens1);
488     OT_VECTEUR_3D vec2(dir2[0]*sens2,dir2[1]*sens2,dir2[2]*sens2);
489     vec1.norme();
490     vec2.norme();
491     OT_VECTEUR_3D nor=normal&vec1;
492     double cs=vec1*vec2;
493     double sn=-1*(vec2*nor);
494     angleref=acos(cs);
495     if (sn<0) angleref=-angleref;
496     if (angleref<0) angleref=angleref+2.*M_PI;
497     if (mgcoarete->get_arete()==mgcoaretetmp->get_arete()) angleref=2*M_PI;
498     if (angleref<1e-10)
499     {
500     double dt=1e-3*(mgcoaretetmp->get_arete()->get_tmax()-mgcoaretetmp->get_arete()->get_tmax());
501     mgcoaretetmp->get_arete()->deriver(mgcosommet->get_t()+dt,dir2);
502     OT_VECTEUR_3D vec2(dir2[0]*sens2,dir2[1]*sens2,dir2[2]*sens2);
503     vec2.norme();
504     double cs=vec1*vec2;
505     double sn=-1*(vec2*nor);
506     angleref=acos(cs);
507     if (sn<0) angleref2=-angleref2;
508     if (angleref<0) angleref2=angleref2+2.*M_PI;
509     }
510     //angle
511     if (mgcoarete->get_orientation()==MEME_SENS) mgcosommet=mgcoarete->get_arete()->get_cosommet2();
512     else mgcosommet=mgcoarete->get_arete()->get_cosommet1();
513     mgcoarete->get_arete()->deriver(mgcosommet->get_t(),dir1);
514     if (mgcoarete_suivante->get_orientation()==MEME_SENS) mgcosommet=mgcoarete_suivante->get_arete()->get_cosommet1();
515     else mgcosommet=mgcoarete_suivante->get_arete()->get_cosommet2();
516     mgcoarete_suivante->get_arete()->deriver(mgcosommet->get_t(),dir2);
517     sens1=mgcoarete->get_orientation();
518     sens2=mgcoarete_suivante->get_orientation();
519     vec1.change_x(-dir1[0]*sens1);
520     vec1.change_y(-dir1[1]*sens1);
521     vec1.change_z(-dir1[2]*sens1);
522     vec2.change_x(dir2[0]*sens2);
523     vec2.change_y(dir2[1]*sens2);
524     vec2.change_z(dir2[2]*sens2);
525     vec1.norme();
526     vec2.norme();
527     nor=normal&vec1;
528     cs=vec1*vec2;
529     sn=-1*(vec2*nor);
530     double angle=acos(cs);
531     if (sn<0) angle=-angle;
532     if (angle<0) angle=angle+2.*M_PI;
533     if (mgcoarete->get_arete()==mgcoarete_suivante->get_arete()) angle=2*M_PI;
534     if (angle<angleref)
535     {
536     angleref=angle;
537     mgcoaretetmp=mgcoarete_suivante;
538     }
539     else if ((angle<1e-10) && (angleref<1e-10))
540     {
541     double dt=1e-3*(mgcoarete_suivante->get_arete()->get_tmax()-mgcoarete_suivante->get_arete()->get_tmax());
542     mgcoarete_suivante->get_arete()->deriver(mgcosommet->get_t()+dt,dir2);
543     OT_VECTEUR_3D vec2(dir2[0]*sens2,dir2[1]*sens2,dir2[2]*sens2);
544     vec2.norme();
545     double cs=vec1*vec2;
546     double sn=-1*(vec2*nor);
547     angle=acos(cs);
548     if (sn<0) angle=-angle;
549     if (angle<0) angle=angle+2.*M_PI;
550     if (angle<angleref2)
551     mgcoaretetmp=mgcoarete_suivante;
552    
553     }
554    
555     }
556     }
557     }
558     mgcoarete=mgcoaretetmp;
559     }
560     while ((noeud_courant!=noeud_de_depart) || (nbcoaretetraite!=nbcoaretetotale));
561     front_precedent->changer_front_suivant(premier_front);
562     premier_front->changer_front_precedent(front_precedent);
563     }
564    
565     }
566    
567     void MAILLEUR2D::progresse_front(MG_FACE* mgface)
568     {
569     int compteur=0;
570     while (get_nb_front(front_courant)!=0)
571     {
572 francois 33 //ofstream o3("c:\\void_1D.mai",ios::out|ios::trunc);
573     //o3.precision(16);
574     //o3.setf(ios::showpoint);
575     //mg_maillage->enregistrer_sous_mesh_1D(o3);
576     //ofstream o4("c:\\void_2D.mai",ios::out|ios::trunc);
577     //o4.precision(16);
578     //o4.setf(ios::showpoint);
579     //mg_maillage->enregistrer_sous_mesh_2D(o4);
580 couturad 683 //mg_maillage->get_gestionnaire()->enregistrer("void.magic");
581 5 compteur++;
582 francois 315 /*if (mg_maillage->get_nb_mg_triangle()+558>=1160)
583     {int i=0;
584     LISTE_MG_NOEUD::iterator it;for (MG_NOEUD* noeud=mg_maillage->get_premier_noeud(it);noeud;noeud=mg_maillage->get_suivant_noeud(it))
585     {
586     noeud->change_nouveau_numero(i+1);
587     std::cout << i+1 << " " << noeud->get_u() << " " << noeud->get_v() << std::endl; ;
588     i++;
589     }
590     mg_maillage->get_gestionnaire()->enregistrer("toto.magic");
591     }*/
592 francois 632 //mg_maillage->get_gestionnaire()->enregistrer("toto.magic");
593 5 refresh();
594     MG_FRONT_2D* ft=get_front(front_courant,0);
595     MG_FRONT_2D* ftp=ft->get_front_precedent();
596     MG_FRONT_2D* fts=ft->get_front_suivant();
597     double eps=0.0001*ft->get_segment()->get_longueur();
598     MG_NOEUD* nop=ftp->get_noeud1();
599     MG_NOEUD* no1=ft->get_noeud1();
600     MG_NOEUD* no2=ft->get_noeud2();
601     MG_NOEUD* nos=fts->get_noeud2();
602     /* angle precedent et angle suivant */
603     OT_VECTEUR_3D n1n2(no1->get_coord(),no2->get_coord());
604     OT_VECTEUR_3D n2s(no2->get_coord(),nos->get_coord());
605     OT_VECTEUR_3D pn1(nop->get_coord(),no1->get_coord());
606     n1n2.norme();
607     n2s.norme();
608     pn1.norme();
609     double coo[3];
610     double uv[2];
611     uv[0]=no1->get_u();
612     uv[1]=no1->get_v();
613     mgface->calcul_normale_unitaire(uv,coo);
614     OT_VECTEUR_3D nplan(coo);
615     OT_VECTEUR_3D n=nplan&n1n2;
616     n.norme();
617     double pcp=(-1)*(n1n2*pn1);
618     double psp=(-1)*(n*pn1);
619     int anglep;
620     if ((pcp>=0.1786481777)&&(psp>eps)) anglep=1; else anglep=0;
621     uv[0]=no2->get_u();
622     uv[1]=no2->get_v();
623     mgface->calcul_normale_unitaire(uv,coo);
624     OT_VECTEUR_3D nplan2(coo);
625     n=nplan2&n1n2;
626     n.norme();
627     double pcs=(-1.)*(n1n2*n2s);
628     double pss=n*n2s;
629     int angles;
630     if ((pcs>=0.1786481777)&&(pss>eps)) angles=1; else angles=0;
631     int type_cas_front[7];
632     if ( (ftp==fts->get_front_suivant()) && (no1!=nos) && (no2!=nop) ) type_cas_front[CAS_FRONT_3]=1; else type_cas_front[CAS_FRONT_3]=0;
633     if (ftp->get_front_precedent()==fts->get_front_suivant()) type_cas_front[CAS_FRONT_4]=1; else type_cas_front[CAS_FRONT_4]=0;
634     if ( (anglep==1) && (angles==1) ) type_cas_front[CAS_FERME_CAVITE]=1; else type_cas_front[CAS_FERME_CAVITE]=0;
635     if ( anglep==1 ) type_cas_front[CAS_FERME_CAVITE_P]=1; else type_cas_front[CAS_FERME_CAVITE_P]=0;
636     if ( angles==1 ) type_cas_front[CAS_FERME_CAVITE_S]=1; else type_cas_front[CAS_FERME_CAVITE_S]=0;
637     type_cas_front[CAS_GENERAL]=1;
638     int solution=PASTROUVE;
639     if (type_cas_front[CAS_FRONT_3]) solution=traite_front(CAS_FRONT_3,mgface,ftp,ft,fts);
640     if ((solution==PASTROUVE) && (type_cas_front[CAS_FRONT_4])) solution=traite_front(CAS_FRONT_4,mgface,ftp,ft,fts);
641     if ((solution==PASTROUVE) && (type_cas_front[CAS_FERME_CAVITE])) solution=traite_front(CAS_FERME_CAVITE,mgface,ftp,ft,fts);
642     if ((solution==PASTROUVE) && (type_cas_front[CAS_FERME_CAVITE_P])) solution=traite_front(CAS_FERME_CAVITE_P,mgface,ftp,ft,fts);
643     if ((solution==PASTROUVE) && (type_cas_front[CAS_FERME_CAVITE_S])) solution=traite_front(CAS_FERME_CAVITE_S,mgface,ftp,ft,fts);
644     if ((solution==PASTROUVE) && (type_cas_front[CAS_GENERAL]))
645     {
646     solution=traite_front(CAS_GENERAL,mgface,ftp,ft,fts);
647     if ((solution!=PASTROUVE)&&(solution!=TROUVE))
648     if (!type_cas_front[solution]) solution=traite_front(solution,mgface,ftp,ft,fts); else solution=PASTROUVE;
649     if (solution==PASTROUVE)
650     {
651     echange_de_front(front_courant,front_attente,ft);
652     ft->incremente_ifail();
653     solution=TROUVE;
654     }
655     }
656     if (get_nb_front(front_courant)==0) front_courant.swap(front_attente);
657     }
658     }
659    
660    
661    
662 francois 447
663 5 void MAILLEUR2D::insere_contrainte_segment(MG_FACE* mgface,TPL_LISTE_ENTITE<MG_SEGMENT*> *lstseg)
664     {
665     int nbseg=lstseg->get_nb();
666     for (int i=0;i<nbseg;i++)
667     {
668     MG_SEGMENT* segori=lstseg->get(i);
669     MG_NOEUD* noeudori1=segori->get_noeud1();
670     MG_NOEUD* noeudori2=segori->get_noeud2();
671     double uv1[2];
672     double uv2[2];
673     double *coo=noeudori1->get_coord();
674     mgface->inverser(uv1,coo,1e-10);
675     if (mgface->get_surface()->est_periodique_u()==1)
676     {
677     if (uv1[0]<0.0) uv1[0]=uv1[0]+mgface->get_surface()->get_periode_u();
678     if (uv1[0]>=mgface->get_surface()->get_periode_u()) uv1[0]=uv1[0]-mgface->get_surface()->get_periode_u();
679     }
680     if (mgface->get_surface()->est_periodique_v()==1)
681     {
682     if (uv1[1]<0.0) uv1[1]=uv1[1]+mgface->get_surface()->get_periode_v();
683     if (uv1[1]>=mgface->get_surface()->get_periode_v()) uv1[1]=uv1[1]-mgface->get_surface()->get_periode_v();
684     }
685     coo=noeudori2->get_coord();
686     mgface->inverser(uv2,coo,1e-10);
687     if (mgface->get_surface()->est_periodique_u()==1)
688     {
689     if (uv2[0]<0.0) uv2[0]=uv2[0]+mgface->get_surface()->get_periode_u();
690     if (uv2[0]>=mgface->get_surface()->get_periode_u()) uv2[0]=uv2[0]-mgface->get_surface()->get_periode_u();
691     }
692     if (mgface->get_surface()->est_periodique_v()==1)
693     {
694     if (uv2[1]<0.0) uv2[1]=uv2[1]+mgface->get_surface()->get_periode_v();
695     if (uv2[1]>=mgface->get_surface()->get_periode_v()) uv2[1]=uv2[1]-mgface->get_surface()->get_periode_v();
696     }
697    
698     TPL_MAP_ENTITE<MG_FRONT_2D*> liste_trouvee;
699 francois 632 double *xyz1=noeudori1->get_coord();
700     double *xyz2=noeudori2->get_coord();
701     double xyz[3];
702     xyz[0]=0.5*(xyz1[0]+xyz2[0]);
703     xyz[1]=0.5*(xyz1[1]+xyz2[1]);
704     xyz[2]=0.5*(xyz1[2]+xyz2[2]);
705     OT_VECTEUR_3D vec(xyz1,xyz);
706     //double rayonrecherche=sqrt((u-uv1[0])*(u-uv1[0])+(v-uv1[1])*(v-uv1[1]))*1.1;
707     double rayonrecherche=vec.get_longueur()*1.1;
708     ntree_de_front->rechercher(xyz[0],xyz[1],xyz[2],rayonrecherche,liste_trouvee);
709    
710     double u=0.5*(uv1[0]+uv2[0]);
711 5 double v=0.5*(uv1[1]+uv2[1]);
712     int nb_entite=liste_trouvee.get_nb();
713     double du=decalage->calcul_decalage_parametre_u(u);
714     double dv=decalage->calcul_decalage_parametre_v(v);
715     double u1=decalage->decalage_parametre_u(uv1[0],du);
716     double v1=decalage->decalage_parametre_v(uv1[1],dv);
717     double u2=decalage->decalage_parametre_u(uv2[0],du);
718     double v2=decalage->decalage_parametre_v(uv2[1],dv);
719     MG_FRONT_2D *ref1=NULL,*ref2=NULL;
720     double angle1,angle2;
721     for(int j=0;j<nb_entite;j++)
722     {
723     MG_FRONT_2D *ft=liste_trouvee.get(j);
724     MG_NOEUD* noeudfront=ft->get_noeud2();
725     double uvfront[2];
726     uvfront[0]=noeudfront->get_u();
727     uvfront[1]=noeudfront->get_v();
728     double ufront=decalage->decalage_parametre_u(uvfront[0],du);
729     double vfront=decalage->decalage_parametre_v(uvfront[1],dv);
730     //noeud 1 du segment a inserer
731 francois 632 double *xyzfront=noeudfront->get_coord();
732     //mgface->evaluer(uvfront,xyzfront);
733     OT_VECTEUR_3D vec(xyz1,xyzfront);
734     double dist=vec.get_longueur();
735     //double dist=sqrt((ufront-u1)*(ufront-u1)+(vfront-v1)*(vfront-v1));
736 francois 61 if (dist<1e-5*rayonrecherche)
737 5 {
738     if (ref1==NULL)
739     {
740     ref1=ft;
741     OT_VECTEUR_3D vecteur_baseu(u2-u1,v2-v1,0.);
742     MG_NOEUD* noeudfrontautre=ft->get_noeud1();
743     double uvfrontautre[2];
744     uvfrontautre[0]=noeudfrontautre->get_u();
745     uvfrontautre[1]=noeudfrontautre->get_v();
746     double ufrontautre=decalage->decalage_parametre_u(uvfrontautre[0],du);
747     double vfrontautre=decalage->decalage_parametre_v(uvfrontautre[1],dv);
748     OT_VECTEUR_3D vecteur_front(ufrontautre-ufront,vfrontautre-vfront,0.);
749     vecteur_baseu.norme();
750     vecteur_front.norme();
751     double cosangle=vecteur_baseu*vecteur_front;
752     if (cosangle>1.) cosangle=1.;
753     if (cosangle<-1.) cosangle=(-1.);
754     angle1=acos(cosangle);
755     }
756     else
757     {
758     OT_VECTEUR_3D vecteur_baseu(u2-u1,v2-v1,0.);
759     MG_NOEUD* noeudfrontautre=ft->get_noeud1();
760     double uvfrontautre[2];
761     uvfrontautre[0]=noeudfrontautre->get_u();
762     uvfrontautre[1]=noeudfrontautre->get_v();
763     double ufrontautre=decalage->decalage_parametre_u(uvfrontautre[0],du);
764     double vfrontautre=decalage->decalage_parametre_v(uvfrontautre[1],dv);
765     OT_VECTEUR_3D vecteur_front(ufrontautre-ufront,vfrontautre-vfront,0.);
766     vecteur_baseu.norme();
767     vecteur_front.norme();
768     double cosangle=vecteur_baseu*vecteur_front;
769     if (cosangle>1.) cosangle=1.;
770     if (cosangle<-1.) cosangle=(-1.);
771     double angle=acos(cosangle);
772     if (angle<angle1) {angle1=angle;ref1=ft;}
773     }
774     }
775     //noeud 2 du segment a inserer
776 francois 632 OT_VECTEUR_3D vec2(xyz2,xyzfront);
777     dist=vec2.get_longueur();
778     //dist=sqrt((ufront-u2)*(ufront-u2)+(vfront-v2)*(vfront-v2));
779 francois 61 if (dist<1e-5*rayonrecherche)
780 5 {
781     if (ref2==NULL)
782     {
783     ref2=ft;
784     OT_VECTEUR_3D vecteur_baseu(u1-u2,v1-v2,0.);
785     MG_NOEUD* noeudfrontautre=ft->get_noeud1();
786     double uvfrontautre[2];
787     uvfrontautre[0]=noeudfrontautre->get_u();
788     uvfrontautre[1]=noeudfrontautre->get_v();
789     double ufrontautre=decalage->decalage_parametre_u(uvfrontautre[0],du);
790     double vfrontautre=decalage->decalage_parametre_v(uvfrontautre[1],dv);
791     OT_VECTEUR_3D vecteur_front(ufrontautre-ufront,vfrontautre-vfront,0.);
792     vecteur_baseu.norme();
793     vecteur_front.norme();
794     double cosangle=vecteur_baseu*vecteur_front;
795     if (cosangle>1.) cosangle=1.;
796     if (cosangle<-1.) cosangle=(-1.);
797     angle2=acos(cosangle);
798     }
799     else
800     {
801     OT_VECTEUR_3D vecteur_baseu(u1-u2,v1-v2,0.);
802     MG_NOEUD* noeudfrontautre=ft->get_noeud1();
803     double uvfrontautre[2];
804     uvfrontautre[0]=noeudfrontautre->get_u();
805     uvfrontautre[1]=noeudfrontautre->get_v();
806     double ufrontautre=decalage->decalage_parametre_u(uvfrontautre[0],du);
807     double vfrontautre=decalage->decalage_parametre_v(uvfrontautre[1],dv);
808     OT_VECTEUR_3D vecteur_front(ufrontautre-ufront,vfrontautre-vfront,0.);
809     vecteur_baseu.norme();
810     vecteur_front.norme();
811     double cosangle=vecteur_baseu*vecteur_front;
812     if (cosangle>1.) cosangle=1.;
813     if (cosangle<-1.) cosangle=(-1.);
814     double angle=acos(cosangle);
815     if (angle<angle2) {angle1=angle;ref2=ft;}
816     }
817     }
818    
819     }
820     // creation du segemnt
821     MG_NOEUD* noeud1;
822     MG_NOEUD* noeud2;
823     if (ref1!=NULL) noeud1=ref1->get_noeud2();
824     else
825     {
826     double *coord=noeudori1->get_coord();
827 francois 35 noeud1=mg_maillage->ajouter_mg_noeud(mgface,coord[0],coord[1],coord[2],IMPOSE);
828 5 noeud1->change_u(uv1[0]);
829     noeud1->change_v(uv1[1]);
830 francois 447 noeud1->change_nouveau_numero(noeudori1->get_nouveau_numero());
831 francois 155 }
832 5 if (ref2!=NULL) noeud2=ref2->get_noeud2();
833     else
834     {
835     double *coord=noeudori2->get_coord();
836 francois 35 noeud2=mg_maillage->ajouter_mg_noeud(mgface,coord[0],coord[1],coord[2],IMPOSE);
837 5 noeud2->change_u(uv2[0]);
838     noeud2->change_v(uv2[1]);
839 francois 155 noeud2->change_nouveau_numero(noeudori2->get_nouveau_numero());
840     }
841 francois 35 MG_SEGMENT* mgsegment=mg_maillage->ajouter_mg_segment(mgface,noeud1,noeud2,IMPOSE);
842 5 MG_FRONT_2D *nv_ft=ajouter_front(front_courant,noeud1,noeud2,mgsegment);
843     MG_FRONT_2D *nv_ft2=ajouter_front(front_courant,noeud2,noeud1,mgsegment);
844     if (ref1==NULL)
845     {
846     nv_ft->changer_front_precedent(nv_ft2);
847     nv_ft2->changer_front_suivant(nv_ft);
848     }
849     else
850     {
851     MG_FRONT_2D *tmp=ref1->get_front_suivant();
852     ref1->changer_front_suivant(nv_ft);
853     nv_ft->changer_front_precedent(ref1);
854     nv_ft2->changer_front_suivant(tmp);
855     tmp->changer_front_precedent(nv_ft2);
856     }
857     if (ref2==NULL)
858     {
859     nv_ft->changer_front_suivant(nv_ft2);
860     nv_ft2->changer_front_precedent(nv_ft);
861     }
862     else
863     {
864     MG_FRONT_2D *tmp=ref2->get_front_suivant();
865     ref2->changer_front_suivant(nv_ft2);
866     nv_ft2->changer_front_precedent(ref2);
867     nv_ft->changer_front_suivant(tmp);
868     tmp->changer_front_precedent(nv_ft);
869     }
870    
871     }
872     }
873    
874     void MAILLEUR2D::insere_contrainte_triangle(MG_FACE* mgface,TPL_LISTE_ENTITE<MG_TRIANGLE*> *lsttri)
875     {
876     int nbtri=lsttri->get_nb();
877     for (int i=0;i<nbtri;i++)
878     {
879     MG_TRIANGLE* triori=lsttri->get(i);
880     MG_NOEUD* noeudori1=triori->get_noeud1();
881     MG_NOEUD* noeudori2=triori->get_noeud2();
882     MG_NOEUD* noeudori3=triori->get_noeud3();
883     double uv1[2];
884     double uv2[2];
885     double uv3[2];
886     double *coo=noeudori1->get_coord();
887     mgface->inverser(uv1,coo,1e-10);
888     if (mgface->get_surface()->est_periodique_u()==1)
889     {
890     if (uv1[0]<0.0) uv1[0]=uv1[0]+mgface->get_surface()->get_periode_u();
891     if (uv1[0]>=mgface->get_surface()->get_periode_u()) uv1[0]=uv1[0]-mgface->get_surface()->get_periode_u();
892     }
893     if (mgface->get_surface()->est_periodique_v()==1)
894     {
895     if (uv1[1]<0.0) uv1[1]=uv1[1]+mgface->get_surface()->get_periode_v();
896     if (uv1[1]>=mgface->get_surface()->get_periode_v()) uv1[1]=uv1[1]-mgface->get_surface()->get_periode_v();
897     }
898     coo=noeudori2->get_coord();
899     mgface->inverser(uv2,coo,1e-10);
900     if (mgface->get_surface()->est_periodique_u()==1)
901     {
902     if (uv2[0]<0.0) uv2[0]=uv2[0]+mgface->get_surface()->get_periode_u();
903     if (uv2[0]>=mgface->get_surface()->get_periode_u()) uv2[0]=uv2[0]-mgface->get_surface()->get_periode_u();
904     }
905     if (mgface->get_surface()->est_periodique_v()==1)
906     {
907     if (uv2[1]<0.0) uv2[1]=uv2[1]+mgface->get_surface()->get_periode_v();
908     if (uv2[1]>=mgface->get_surface()->get_periode_v()) uv2[1]=uv2[1]-mgface->get_surface()->get_periode_v();
909     }
910     coo=noeudori3->get_coord();
911     mgface->inverser(uv3,coo,1e-10);
912     if (mgface->get_surface()->est_periodique_u()==1)
913     {
914 francois 33 if (uv3[0]<0.0) uv3[0]=uv3[0]+mgface->get_surface()->get_periode_u();
915     if (uv3[0]>=mgface->get_surface()->get_periode_u()) uv3[0]=uv3[0]-mgface->get_surface()->get_periode_u();
916 5 }
917     if (mgface->get_surface()->est_periodique_v()==1)
918     {
919     if (uv3[1]<0.0) uv3[1]=uv3[1]+mgface->get_surface()->get_periode_v();
920     if (uv3[1]>=mgface->get_surface()->get_periode_v()) uv3[1]=uv3[1]-mgface->get_surface()->get_periode_v();
921     }
922     TPL_MAP_ENTITE<MG_FRONT_2D*> liste_trouvee;
923     double u=0.3333333333333333*(uv1[0]+uv2[0]+uv3[0]);
924     double v=0.3333333333333333*(uv1[1]+uv2[1]+uv3[1]);
925 francois 33 double rayonrecherche1=sqrt((u-uv1[0])*(u-uv1[0])+(v-uv1[1])*(v-uv1[1]))*2.;
926     double rayonrecherche2=sqrt((u-uv2[0])*(u-uv2[0])+(v-uv2[1])*(v-uv2[1]))*2.;
927     double rayonrecherche3=sqrt((u-uv3[0])*(u-uv3[0])+(v-uv3[1])*(v-uv3[1]))*2.;
928     double rayonrecherche=rayonrecherche1;
929     if (rayonrecherche2>rayonrecherche) rayonrecherche=rayonrecherche2;
930     if (rayonrecherche3>rayonrecherche) rayonrecherche=rayonrecherche3;
931 francois 632 double *xyz1=noeudori1->get_coord();
932     double *xyz2=noeudori2->get_coord();
933     double *xyz3=noeudori3->get_coord();
934     double xyz[3];
935     xyz[0]=0.333333333333333333333*(xyz1[0]+xyz2[0]+xyz3[0]);
936     xyz[1]=0.333333333333333333333*(xyz1[1]+xyz2[1]+xyz3[1]);
937     xyz[2]=0.333333333333333333333*(xyz1[2]+xyz2[2]+xyz3[2]);
938     OT_VECTEUR_3D vec1(xyz1,xyz);
939     OT_VECTEUR_3D vec2(xyz2,xyz);
940     OT_VECTEUR_3D vec3(xyz3,xyz);
941     rayonrecherche=std::max(vec1.get_longueur(),vec2.get_longueur());
942     rayonrecherche=std::max(rayonrecherche,vec3.get_longueur())*1.1;
943     //double rayonrecherche=sqrt((u-uv1[0])*(u-uv1[0])+(v-uv1[1])*(v-uv1[1]))*1.1;
944     ntree_de_front->rechercher(xyz[0],xyz[1],xyz[2],rayonrecherche,liste_trouvee);
945 5 int nb_entite=liste_trouvee.get_nb();
946     double du=decalage->calcul_decalage_parametre_u(u);
947     double dv=decalage->calcul_decalage_parametre_v(v);
948     double u1=decalage->decalage_parametre_u(uv1[0],du);
949     double v1=decalage->decalage_parametre_v(uv1[1],dv);
950     double u2=decalage->decalage_parametre_u(uv2[0],du);
951     double v2=decalage->decalage_parametre_v(uv2[1],dv);
952     double u3=decalage->decalage_parametre_u(uv3[0],du);
953     double v3=decalage->decalage_parametre_v(uv3[1],dv);
954     MG_FRONT_2D *ref1=NULL,*ref2=NULL,*ref3=NULL;
955     double angle1,angle2,angle3;
956     for(int j=0;j<nb_entite;j++)
957     {
958     MG_FRONT_2D *ft=liste_trouvee.get(j);
959     MG_NOEUD* noeudfront=ft->get_noeud2();
960     double uvfront[2];
961     uvfront[0]=noeudfront->get_u();
962     uvfront[1]=noeudfront->get_v();
963     double ufront=decalage->decalage_parametre_u(uvfront[0],du);
964     double vfront=decalage->decalage_parametre_v(uvfront[1],dv);
965     //noeud 1 du triangle a inserer
966 francois 632 //double dist=sqrt((ufront-u1)*(ufront-u1)+(vfront-v1)*(vfront-v1));
967     double *xyzfront=noeudfront->get_coord();
968     //mgface->evaluer(uvfront,xyzfront);
969     OT_VECTEUR_3D vec(xyz1,xyzfront);
970     double dist=vec.get_longueur();
971 francois 54 if (dist<1e-5*rayonrecherche)
972 5 {
973     if (ref1==NULL)
974     {
975     ref1=ft;
976     OT_VECTEUR_3D vecteur_baseu(u2-u1,v2-v1,0.);
977     MG_NOEUD* noeudfrontautre=ft->get_noeud1();
978     double uvfrontautre[2];
979     uvfrontautre[0]=noeudfrontautre->get_u();
980     uvfrontautre[1]=noeudfrontautre->get_v();
981     double ufrontautre=decalage->decalage_parametre_u(uvfrontautre[0],du);
982     double vfrontautre=decalage->decalage_parametre_v(uvfrontautre[1],dv);
983     OT_VECTEUR_3D vecteur_front(ufrontautre-ufront,vfrontautre-vfront,0.);
984     vecteur_baseu.norme();
985     vecteur_front.norme();
986     double cosangle=vecteur_baseu*vecteur_front;
987     if (cosangle>1.) cosangle=1.;
988     if (cosangle<-1.) cosangle=(-1.);
989     angle1=acos(cosangle);
990     OT_VECTEUR_3D w(0.,0.,1.);
991     OT_VECTEUR_3D vecteur_basev=w&vecteur_baseu;
992     double sangle=vecteur_basev*vecteur_front;
993     if (sangle<0.) angle1=2*M_PI-angle1;
994     }
995     else
996     {
997     OT_VECTEUR_3D vecteur_baseu(u2-u1,v2-v1,0.);
998     MG_NOEUD* noeudfrontautre=ft->get_noeud1();
999     double uvfrontautre[2];
1000     uvfrontautre[0]=noeudfrontautre->get_u();
1001     uvfrontautre[1]=noeudfrontautre->get_v();
1002     double ufrontautre=decalage->decalage_parametre_u(uvfrontautre[0],du);
1003     double vfrontautre=decalage->decalage_parametre_v(uvfrontautre[1],dv);
1004     OT_VECTEUR_3D vecteur_front(ufrontautre-ufront,vfrontautre-vfront,0.);
1005     vecteur_baseu.norme();
1006     vecteur_front.norme();
1007     double cosangle=vecteur_baseu*vecteur_front;
1008     if (cosangle>1.) cosangle=1.;
1009     if (cosangle<-1.) cosangle=(-1.);
1010     double angle=acos(cosangle);
1011     OT_VECTEUR_3D w(0.,0.,1.);
1012     OT_VECTEUR_3D vecteur_basev=w&vecteur_baseu;
1013     double sangle=vecteur_basev*vecteur_front;
1014     if (sangle<0.) angle=2*M_PI-angle;
1015     if (angle<angle1) {angle1=angle;ref1=ft;}
1016     }
1017     }
1018     //noeud 2 du triangle a inserer
1019 francois 632 //mgface->evaluer(uvfront,xyzfront);
1020     OT_VECTEUR_3D vec2(xyz2,xyzfront);
1021     dist=vec2.get_longueur();
1022     //dist=sqrt((ufront-u2)*(ufront-u2)+(vfront-v2)*(vfront-v2));
1023 francois 54 if (dist<1e-5*rayonrecherche)
1024 5 {
1025     if (ref2==NULL)
1026     {
1027     ref2=ft;
1028     OT_VECTEUR_3D vecteur_baseu(u3-u2,v3-v2,0.);
1029     MG_NOEUD* noeudfrontautre=ft->get_noeud1();
1030     double uvfrontautre[2];
1031     uvfrontautre[0]=noeudfrontautre->get_u();
1032     uvfrontautre[1]=noeudfrontautre->get_v();
1033     double ufrontautre=decalage->decalage_parametre_u(uvfrontautre[0],du);
1034     double vfrontautre=decalage->decalage_parametre_v(uvfrontautre[1],dv);
1035     OT_VECTEUR_3D vecteur_front(ufrontautre-ufront,vfrontautre-vfront,0.);
1036     vecteur_baseu.norme();
1037     vecteur_front.norme();
1038     double cosangle=vecteur_baseu*vecteur_front;
1039     if (cosangle>1.) cosangle=1.;
1040     if (cosangle<-1.) cosangle=(-1.);
1041     angle2=acos(cosangle);
1042     OT_VECTEUR_3D w(0.,0.,1.);
1043     OT_VECTEUR_3D vecteur_basev=w&vecteur_baseu;
1044     double sangle=vecteur_basev*vecteur_front;
1045     if (sangle<0.) angle2=2*M_PI-angle2;
1046     }
1047     else
1048     {
1049     OT_VECTEUR_3D vecteur_baseu(u3-u2,v3-v2,0.);
1050     MG_NOEUD* noeudfrontautre=ft->get_noeud1();
1051     double uvfrontautre[2];
1052     uvfrontautre[0]=noeudfrontautre->get_u();
1053     uvfrontautre[1]=noeudfrontautre->get_v();
1054     double ufrontautre=decalage->decalage_parametre_u(uvfrontautre[0],du);
1055     double vfrontautre=decalage->decalage_parametre_v(uvfrontautre[1],dv);
1056     OT_VECTEUR_3D vecteur_front(ufrontautre-ufront,vfrontautre-vfront,0.);
1057     vecteur_baseu.norme();
1058     vecteur_front.norme();
1059     double cosangle=vecteur_baseu*vecteur_front;
1060     if (cosangle>1.) cosangle=1.;
1061     if (cosangle<-1.) cosangle=(-1.);
1062     double angle=acos(cosangle);
1063     OT_VECTEUR_3D w(0.,0.,1.);
1064     OT_VECTEUR_3D vecteur_basev=w&vecteur_baseu;
1065     double sangle=vecteur_basev*vecteur_front;
1066     if (sangle<0.) angle=2*M_PI-angle;
1067     if (angle<angle2) {angle2=angle;ref2=ft;}
1068     }
1069     }
1070     //noeud 3 du triangle a inserer
1071 francois 632 //dist=sqrt((ufront-u3)*(ufront-u3)+(vfront-v3)*(vfront-v3));
1072     //mgface->evaluer(uvfront,xyzfront);
1073     OT_VECTEUR_3D vec3(xyz3,xyzfront);
1074     dist=vec3.get_longueur();
1075 francois 54 if (dist<1e-5*rayonrecherche)
1076 5 {
1077     if (ref3==NULL)
1078     {
1079     ref3=ft;
1080     OT_VECTEUR_3D vecteur_baseu(u1-u3,v1-v3,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     angle3=acos(cosangle);
1094     OT_VECTEUR_3D w(0.,0.,1.);
1095     OT_VECTEUR_3D vecteur_basev=w&vecteur_baseu;
1096     double sangle=vecteur_basev*vecteur_front;
1097     if (sangle<0.) angle3=2*M_PI-angle3;
1098     }
1099     else
1100     {
1101     OT_VECTEUR_3D vecteur_baseu(u1-u3,v1-v3,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     double angle=acos(cosangle);
1115     OT_VECTEUR_3D w(0.,0.,1.);
1116     OT_VECTEUR_3D vecteur_basev=w&vecteur_baseu;
1117     double sangle=vecteur_basev*vecteur_front;
1118     if (sangle<0.) angle=2*M_PI-angle;
1119     if (angle<angle3) {angle3=angle;ref3=ft;}
1120    
1121     }
1122     }
1123     }
1124     // creation du triangle
1125     MG_NOEUD* noeud1;
1126     MG_NOEUD* noeud2;
1127     MG_NOEUD* noeud3;
1128     if (ref1!=NULL) noeud1=ref1->get_noeud2();
1129     else
1130     {
1131     double *coord=noeudori1->get_coord();
1132 francois 35 noeud1=mg_maillage->ajouter_mg_noeud(mgface,coord[0],coord[1],coord[2],IMPOSE);
1133 5 noeud1->change_u(uv1[0]);
1134     noeud1->change_v(uv1[1]);
1135 francois 447 noeud1->change_nouveau_numero(noeudori1->get_nouveau_numero());
1136 5 }
1137     if (ref2!=NULL) noeud2=ref2->get_noeud2();
1138     else
1139     {
1140     double *coord=noeudori2->get_coord();
1141 francois 35 noeud2=mg_maillage->ajouter_mg_noeud(mgface,coord[0],coord[1],coord[2],IMPOSE);
1142 5 noeud2->change_u(uv2[0]);
1143     noeud2->change_v(uv2[1]);
1144 francois 155 noeud2->change_nouveau_numero(noeudori2->get_nouveau_numero());
1145 5 }
1146     if (ref3!=NULL) noeud3=ref3->get_noeud2();
1147     else
1148     {
1149     double *coord=noeudori3->get_coord();
1150 francois 35 noeud3=mg_maillage->ajouter_mg_noeud(mgface,coord[0],coord[1],coord[2],IMPOSE);
1151 5 noeud3->change_u(uv3[0]);
1152     noeud3->change_v(uv3[1]);
1153 francois 447 noeud3->change_nouveau_numero(noeudori3->get_nouveau_numero());
1154 5 }
1155     MG_SEGMENT* mgsegment1=mg_maillage->get_mg_segment(noeud1->get_id(),noeud2->get_id());
1156     MG_SEGMENT* mgsegment2=mg_maillage->get_mg_segment(noeud2->get_id(),noeud3->get_id());
1157     MG_SEGMENT* mgsegment3=mg_maillage->get_mg_segment(noeud3->get_id(),noeud1->get_id());
1158     int seg1=1,seg2=1,seg3=1;
1159 francois 35 if (mgsegment1==NULL) mgsegment1=mg_maillage->ajouter_mg_segment(mgface,noeud1,noeud2,IMPOSE); else seg1=0;
1160     if (mgsegment2==NULL) mgsegment2=mg_maillage->ajouter_mg_segment(mgface,noeud2,noeud3,IMPOSE); else seg2=0;
1161     if (mgsegment3==NULL) mgsegment3=mg_maillage->ajouter_mg_segment(mgface,noeud3,noeud1,IMPOSE); else seg3=0;
1162 francois 54 M3D_TRIANGLE* mtriangle=new M3D_TRIANGLE(mgface,noeud1,noeud2,noeud3,mgsegment1,mgsegment2,mgsegment3,IMPOSE);
1163 5 mg_maillage->ajouter_mg_triangle(mtriangle);
1164 francois 632 int segtotal=seg1+seg2+seg3;
1165 5 if (segtotal==3)
1166     {
1167     MG_FRONT_2D* ft1=ajouter_front(front_courant,noeud1,noeud2,mgsegment1);
1168     MG_FRONT_2D* ft2=ajouter_front(front_courant,noeud2,noeud3,mgsegment2);
1169     MG_FRONT_2D* ft3=ajouter_front(front_courant,noeud3,noeud1,mgsegment3);
1170     if (ref1==NULL)
1171     {
1172     ft1->changer_front_precedent(ft3);
1173     ft3->changer_front_suivant(ft1);
1174     }
1175     else
1176     {
1177     MG_FRONT_2D* tmp=ref1->get_front_suivant();
1178     ft1->changer_front_precedent(ref1);
1179     ref1->changer_front_suivant(ft1);
1180     ft3->changer_front_suivant(tmp);
1181     tmp->changer_front_precedent(ft3);
1182     }
1183     if (ref2==NULL)
1184     {
1185     ft1->changer_front_suivant(ft2);
1186     ft2->changer_front_precedent(ft1);
1187     }
1188     else
1189     {
1190     MG_FRONT_2D* tmp=ref2->get_front_suivant();
1191     ft2->changer_front_precedent(ref2);
1192     ref2->changer_front_suivant(ft2);
1193     ft1->changer_front_suivant(tmp);
1194     tmp->changer_front_precedent(ft1);
1195     }
1196     if (ref3==NULL)
1197     {
1198     ft2->changer_front_suivant(ft3);
1199     ft3->changer_front_precedent(ft2);
1200     }
1201     else
1202     {
1203     MG_FRONT_2D* tmp=ref3->get_front_suivant();
1204     ft3->changer_front_precedent(ref3);
1205     ref3->changer_front_suivant(ft3);
1206     ft2->changer_front_suivant(tmp);
1207     tmp->changer_front_precedent(ft2);
1208     }
1209     }
1210     if (segtotal==2)
1211     {
1212     MG_FRONT_2D *front1,*front2,*front3;
1213     MG_SEGMENT *segcre1,*segcre2;
1214     if (seg3==0)
1215     {
1216     front1=ref1;front2=ref3;front3=ref2;
1217     segcre1=mgsegment1;segcre2=mgsegment2;
1218     }
1219     if (seg1==0)
1220     {
1221     front1=ref2;front2=ref1;front3=ref3;
1222     segcre1=mgsegment2;segcre2=mgsegment3;
1223     }
1224     if (seg2==0)
1225     {
1226     front1=ref3;front2=ref2;front3=ref1;
1227     segcre1=mgsegment3;segcre2=mgsegment1;
1228     }
1229     MG_FRONT_2D* ft1=ajouter_front(front_courant,segcre1->get_noeud1(),segcre1->get_noeud2(),segcre1);
1230     MG_FRONT_2D* ft2=ajouter_front(front_courant,segcre2->get_noeud1(),segcre2->get_noeud2(),segcre2);
1231     front1->changer_front_suivant(ft1);
1232     ft1->changer_front_precedent(front1);
1233     if (front3==NULL)
1234     {
1235     ft1->changer_front_suivant(ft2);
1236     ft2->changer_front_precedent(ft1);
1237     }
1238     else
1239     {
1240     MG_FRONT_2D* tmp=front3->get_front_suivant();
1241     ft1->changer_front_suivant(tmp);
1242     tmp->changer_front_precedent(ft1);
1243     ft2->changer_front_precedent(front3);
1244     front3->changer_front_suivant(ft2);
1245     }
1246     ft2->changer_front_suivant(front2->get_front_suivant());
1247     front2->get_front_suivant()->changer_front_precedent(ft2);
1248     supprimer_front(front2);
1249     }
1250     if (segtotal==1)
1251     {
1252     MG_FRONT_2D *front1,*front2,*front3;
1253     MG_SEGMENT *segcre1;
1254     if (seg1==1)
1255     {
1256     front1=ref1;front2=ref3;front3=ref2;
1257     segcre1=mgsegment1;
1258     }
1259     if (seg2==1)
1260     {
1261     front1=ref2;front2=ref1;front3=ref3;
1262     segcre1=mgsegment2;
1263     }
1264     if (seg3==1)
1265     {
1266     front1=ref3;front2=ref2;front3=ref1;
1267     segcre1=mgsegment3;
1268     }
1269     MG_FRONT_2D* ft1=ajouter_front(front_courant,segcre1->get_noeud1(),segcre1->get_noeud2(),segcre1);
1270     front1->changer_front_suivant(ft1);
1271     ft1->changer_front_precedent(front1);
1272     ft1->changer_front_suivant(front3->get_front_suivant());
1273     front3->get_front_suivant()->changer_front_precedent(ft1);
1274     supprimer_front(front2);
1275     supprimer_front(front3);
1276     }
1277     if (segtotal==0)
1278     {
1279     supprimer_front(ref1);
1280     supprimer_front(ref2);
1281     supprimer_front(ref3);
1282     }
1283    
1284    
1285     }
1286     }
1287    
1288 francois 447 void MAILLEUR2D::change_niveau_optimisation(int num)
1289     {
1290     niveau_optimisation=num;
1291     }
1292 5
1293 francois 447 int MAILLEUR2D::get_niveau_optimisation(void)
1294     {
1295     return niveau_optimisation;
1296     }
1297    
1298    
1299 5 // FONCTIONS GERANT L ENTITE FRONT (ajout suppression et tout le bordel)
1300     MG_FRONT_2D* MAILLEUR2D::ajouter_front(FRONT& front,MG_NOEUD* noeud1,MG_NOEUD* noeud2,MG_SEGMENT* segment)
1301     {
1302     MG_FRONT_2D* ft=new MG_FRONT_2D(noeud1,noeud2,segment);
1303     ajouter_front(front,ft);
1304 francois 632 ntree_de_front->inserer(ft);
1305 5 return ft;
1306     }
1307    
1308     void MAILLEUR2D::ajouter_front(FRONT& front,MG_FRONT_2D *ft)
1309     {
1310     std::pair<const double,MG_FRONT_2D*> tmp(ft->get_segment()->get_longueur(),ft);
1311     front.insert(tmp);
1312     }
1313    
1314     MG_FRONT_2D* MAILLEUR2D::get_front(FRONT& front,unsigned int num)
1315     {
1316     FRONT::iterator i=front.begin();
1317     for (unsigned long j=0;j<num;j++) i++;
1318     return ((*i).second);
1319     }
1320    
1321    
1322     unsigned int MAILLEUR2D::get_nb_front(FRONT& front)
1323     {
1324     return front.size();
1325     }
1326    
1327    
1328     void MAILLEUR2D::supprimer_front(MG_FRONT_2D* ft)
1329     {
1330 francois 632 ntree_de_front->supprimer(ft);
1331 5
1332     FRONT::iterator j=front_courant.lower_bound(ft->get_segment()->get_longueur());
1333     int ok=0;
1334     if (j==front_courant.end()) ok=2;
1335     while (ok==0)
1336     {
1337     MG_FRONT_2D* fttmp=(*j).second;
1338     if (ft==fttmp) {ok=1;front_courant.erase(j);}
1339     if (fttmp->get_segment()->get_longueur()>ft->get_segment()->get_longueur()) ok=2;
1340     j++;
1341     }
1342     if (ok!=1)
1343     {
1344     j=front_attente.lower_bound(ft->get_segment()->get_longueur());
1345     while (ft!=(*j).second) j++;
1346     front_attente.erase(j);
1347     }
1348    
1349     delete ft;
1350     }
1351    
1352     void MAILLEUR2D::echange_de_front(FRONT& front_original,FRONT& front_destination,MG_FRONT_2D* ft)
1353     {
1354     FRONT::iterator j=front_original.lower_bound(ft->get_segment()->get_longueur());
1355     while (ft!=(*j).second) j++;
1356     front_original.erase(j);
1357     ajouter_front(front_destination,ft);
1358     }
1359 francois 632
1360