ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mailleur_auto/src/mailleur2d.cpp
Revision: 683
Committed: Mon Jun 29 22:27:31 2015 UTC (9 years, 10 months ago) by couturad
File size: 65914 byte(s)
Log Message:
Resolution du bug de l'arete avec de la matiere de chaque cote sous open cascade. Un cylindre avec une seule génératrice en arete peut maintenant etre maille

File Contents

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