ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mailleur/src/mailleur2d.cpp
Revision: 155
Committed: Fri Sep 12 14:48:21 2008 UTC (16 years, 8 months ago) by francois
Original Path: magic/lib/mailleur/mailleur/src/mailleur2d.cpp
File size: 64902 byte(s)
Log Message:
Mise a jour remailleur il y a encore un pb avec la distance de destruction qui fait que le remaillage ne donne pas des qualite top

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