ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mailleur_auto/src/mailleur2d.cpp
Revision: 696
Committed: Fri Jul 24 20:30:52 2015 UTC (9 years, 9 months ago) by francois
File size: 66711 byte(s)
Log Message:
amélioration de l'optimisation 2D avec ajout de l'inverse de diagoanale et le parametrege complet de la methode

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