ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mailleur/src/mailleur2d.cpp
Revision: 447
Committed: Fri Oct 25 22:12:03 2013 UTC (11 years, 6 months ago) by francois
File size: 62420 byte(s)
Log Message:
Decouplage de l'optimisation de maillage 2D du mailleur frontal  lui-même pour reutiliser cette optimisation avec un autre (re)mailleur

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