ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mailleur/src/mailleur2d.cpp
Revision: 446
Committed: Fri Oct 25 19:30:16 2013 UTC (11 years, 6 months ago) by francois
File size: 65668 byte(s)
Log Message:
suppression de la vieille compatibilité avec la these de VF sur la carte de taille. Maintenant la carte de taille est a priori obligatoirement

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