ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mailleur/src/mailleur2d.cpp
Revision: 54
Committed: Fri Sep 28 19:43:11 2007 UTC (17 years, 7 months ago) by francois
Original Path: magic/lib/mailleur/mailleur/src/mailleur2d.cpp
File size: 64247 byte(s)
Log Message:

File Contents

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