ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mailleur/src/mailleur2d.cpp
Revision: 445
Committed: Wed Oct 23 21:42:08 2013 UTC (11 years, 6 months ago) by francois
File size: 65929 byte(s)
Log Message:
clean up ca fait du bien de temps en temps et c est pas fini

File Contents

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