ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mailleur_auto/src/mailleur2d.cpp
Revision: 951
Committed: Fri Aug 10 15:17:17 2018 UTC (6 years, 9 months ago) by couturad
File size: 80463 byte(s)
Log Message:
-> Ajout de Project Chrono (voir CMakeLists.txt).
-> Ajout d'un générateur de microstructure basé sur la dynamique des corps rigides (MSTRUCT_GENERATEUR_DCR).
-> Ajout d'un opérateur de décallage de la topologie (MG_CG_OP_TRANSF_DECALLAGE).
-> Retrait de «using namespace std»  (conflit avec namespace chrono) et modification des fichiers affectés.
-> Modification de mailleur2d.cpp afin d'enregistrer un fichier MAGiC (void.magic) lorsque le nombre d'itération dépasse la valeur maximale.

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 couturad 906 std::map<MG_ELEMENT_TOPOLOGIQUE*,MG_ELEMENT_TOPOLOGIQUE*>::iterator it;
60     for(MG_ELEMENT_TOPOLOGIQUE* ele=mggt->get_premier(it);ele!=NULL;ele=mggt->get_suivant(it))
61     {
62     lst.ajouter(ele);
63     ele->get_topologie_sousjacente(&lst);
64     }
65 francois 210 }
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 francois 820 TPL_MAP_ENTITE<MG_SOMMET*> liste_pole_sommet;
87     initialise_front(mgface,liste_pole_sommet);
88 5 if (lstseg!=NULL) insere_contrainte_segment(mgface,lstseg);
89     if (lsttri!=NULL) insere_contrainte_triangle(mgface,lsttri);
90 francois 820 if (mgface->get_nb_pole()>0) traite_pole(mgface,liste_pole_sommet);
91 5 progresse_front(mgface);
92 francois 645 int verif=param.get_valeur("Verification_coin_face_mailleur2D");
93 francois 696 TPL_LISTE_ENTITE<MG_TRIANGLE*> lsttriaffectecoin;
94 francois 645 if (verif==1)
95 francois 696 verifie_coin_sommet(mgface,&lsttriaffectecoin);
96 francois 447 MAILLEUR2D_OPTIMISATION opt(mg_maillage,niveau_optimisation);
97 francois 696 if (affichageactif==1) opt.active_affichage(affiche2);
98 francois 447 opt.optimise(mgface);
99 francois 696 if (verif==1)
100     for (int i=0;i<lsttriaffectecoin.get_nb();i++)
101 francois 791 lsttriaffectecoin.get(i)->change_origine(MAGIC::ORIGINE::MAILLEUR_AUTO);
102 francois 632 delete ntree_de_segment;
103     //delete quadtree_de_frontiere;
104     delete ntree_de_front;
105 5 delete decalage;
106     segment_frontiere.vide();
107     noeud_frontiere.vide();
108     //ofstream o3("test_2D.mai",ios::out|ios::trunc);
109     //o3.precision(16);
110     //o3.setf(ios::showpoint);
111     //mg_maillage->enregistrer_sous_mesh_2D(o3);
112     }
113    
114    
115 francois 820 void MAILLEUR2D::traite_pole(MG_FACE* mgface,TPL_MAP_ENTITE<MG_SOMMET*> &liste_pole_sommet)
116     {
117     int nbpolesursommet=liste_pole_sommet.get_nb();
118     char message[255];
119     sprintf(message," face comportant %d pole dont %d pole sur un sommet",mgface->get_nb_pole(),nbpolesursommet);
120     affiche(message);
121     std::vector<double> liste_pole;
122     mgface->get_liste_pole_uv(&liste_pole,mg_geometrie->get_valeur_precision());
123     for (int i=0;i<liste_pole.size();i=i+2)
124     {
125     double uv[3]={liste_pole[i],liste_pole[i+1],0.};
126     double xyz[3];
127     mgface->evaluer(uv,xyz);
128     double tenseur_metrique[9];
129     metrique->evaluer(xyz,tenseur_metrique);
130     double dcible=1./sqrt(tenseur_metrique[0]);
131     MG_SOMMET* som=NULL;
132     TPL_MAP_ENTITE<MG_SOMMET*>::ITERATEUR it;
133     for (MG_SOMMET* s=liste_pole_sommet.get_premier(it);s!=NULL;s=liste_pole_sommet.get_suivant(it))
134     {
135     double xyztmp[3];
136     s->get_point()->evaluer(xyztmp);
137     OT_VECTEUR_3D vec(xyz,xyztmp);
138     if (vec.get_longueur()<1e-10*dcible) som=s;
139    
140     }
141     if (som!=NULL)
142     {
143     double xyz[3];
144     som->get_point()->evaluer(xyz);
145     TPL_MAP_ENTITE<MG_FRONT_2D*> liste_trouvee;
146     ntree_de_front->rechercher(xyz[0],xyz[1],xyz[2],0.,liste_trouvee);
147     for (int j=0;j<liste_trouvee.get_nb();j++)
148     {
149     MG_FRONT_2D *ft=liste_trouvee.get(j);
150     if (ft->get_noeud2()->get_lien_topologie()==som)
151     {
152     MG_FRONT_2D *fts=ft->get_front_suivant();
153     double pu=mgface->get_surface()->get_periode_u();
154     double pv=mgface->get_surface()->get_periode_v();
155     int num=0;
156     if (pv>0) num=1;
157     MG_NOEUD* no1=ft->get_noeud1();
158     MG_NOEUD* nopo=ft->get_noeud2();
159     MG_NOEUD* no2=fts->get_noeud2();
160     MG_FRONT_2D* ftpp=ft->get_front_precedent();
161     MG_FRONT_2D* ftss=fts->get_front_suivant();
162     OT_VECTEUR_3D n1n2(ft->get_noeud1()->get_coord(),ft->get_noeud2()->get_coord());
163     OT_VECTEUR_3D n2s(fts->get_noeud1()->get_coord(),fts->get_noeud2()->get_coord());
164     n1n2.norme();
165     n2s.norme();
166     double coo[3];
167     double uv[3];
168     double uvpole[3];
169     uv[0]=ft->get_noeud2()->get_u();
170     uv[1]=ft->get_noeud2()->get_v();
171     uvpole[0]=nopo->get_u();
172     uvpole[1]=nopo->get_v();
173     uvpole[2]=0.;
174     mgface->calcul_normale_unitaire(uv,coo);
175     OT_VECTEUR_3D nplan(coo);
176     OT_VECTEUR_3D n=nplan&n1n2;
177     n.norme();
178     double cs=(-1)*(n1n2*n2s);
179     if (cs>1.) cs=1.;
180     if (cs<-1.) cs=-1.;
181     double sn=(-1)*(n*n2s);
182     double angle=acos(cs);
183     if (sn<0) angle=-angle;
184     if (angle<1e-6) angle=angle+2*M_PI;
185     int nbtri=(int)(angle*1.01/M_PI*3.);
186     supprimer_front(ft);
187     supprimer_front(fts);
188     MG_SEGMENT** tabseg=new MG_SEGMENT*[nbtri];
189     for (int i=0;i<nbtri;i++)
190     tabseg[i]=NULL;
191     uv[0]=no1->get_u();
192     uv[1]=no2->get_v();
193     int ierr=1;
194     do
195     {
196     if (ierr==0) uv[(num+1)%2]=uv[(num+1)%2]-(uv[(num+1)%2]-uvpole[(num+1)%2])*0.5;
197     ierr=1;
198     MG_NOEUD* noc=no1;
199     for (int i=0;i<nbtri-1;i++)
200     {
201     uv[num]=(i+1)*1.0/nbtri*angle;
202     double xyzn[3];
203     mgface->evaluer(uv,xyzn);
204     MG_NOEUD* nn=mg_maillage->ajouter_mg_noeud(mgface,xyzn[0],xyzn[1],xyzn[2],MAGIC::ORIGINE::MAILLEUR_AUTO);
205     nn->change_u(uv[0]);
206     nn->change_v(uv[1]);
207     ierr=ierr*insere_segment(mgface,&(tabseg[i]),noc,nn,TOUS_FRONT);
208     noc=nn;
209     }
210     ierr=ierr*insere_segment(mgface,&(tabseg[nbtri-1]),noc,no2,TOUS_FRONT);
211     }
212     while (ierr==0);
213     OT_VECTEUR_3D w(0.,0.,1.);
214     double uvn1[3]={tabseg[0]->get_noeud1()->get_u(),tabseg[0]->get_noeud1()->get_v(),0.};
215     double uvn2[3]={tabseg[0]->get_noeud2()->get_u(),tabseg[0]->get_noeud2()->get_v(),0.};
216     OT_VECTEUR_3D uvn1n2(uvn1,uvn2);
217     uvn1n2.norme();
218     OT_VECTEUR_3D uvn1pole(uvn1,uvpole);
219     uvn1pole.norme();
220     double sens=(w&uvn1n2)*uvn1pole;
221     MG_FRONT_2D* ftppcourant=ftpp;
222     if (sens>0) ftppcourant=ftss;
223     for (int i=0;i<nbtri;i++)
224     {
225     if (sens<0)
226     insere_triangle(mgface,nopo,tabseg[i]->get_noeud1(),tabseg[i]->get_noeud2());
227     else
228     insere_triangle(mgface,nopo,tabseg[i]->get_noeud2(),tabseg[i]->get_noeud1());
229     if (sens<0)
230     {
231     MG_FRONT_2D *ft=ajouter_front(front_courant,tabseg[i]->get_noeud1(),tabseg[i]->get_noeud2(),tabseg[i]);
232     ft->changer_front_precedent(ftppcourant);
233     ftppcourant->changer_front_suivant(ft);
234     ftppcourant=ft;
235     }
236     else
237     {
238     MG_FRONT_2D *ft=ajouter_front(front_courant,tabseg[i]->get_noeud2(),tabseg[i]->get_noeud1(),tabseg[i]);
239     ft->changer_front_suivant(ftppcourant);
240     ftppcourant->changer_front_precedent(ft);
241     ftppcourant=ft;
242     }
243     }
244     if (sens<0)
245     {
246     ftppcourant->changer_front_suivant(ftss);
247     ftss->changer_front_precedent(ftppcourant);
248     }
249     else
250     {
251     ftppcourant->changer_front_precedent(ftpp);
252     ftpp->changer_front_suivant(ftppcourant);
253     }
254     delete [] tabseg;
255     }
256     }
257     }
258     else
259     {
260     double pu=mgface->get_surface()->get_periode_u();
261     double pv=mgface->get_surface()->get_periode_v();
262     if (pu>0.)
263     {
264     double u1=pu/2.;
265     double v1=uv[1];
266     double u2=pu/2.;
267     double v2=uv[1]+0.001*(vmax-vmin);
268     if (v2>vmax) v2=uv[1]-0.001*(vmax-vmin);
269     double u,v;
270     metrique->ajuste_distance_metrique(mgface,u1,v1,u2,v2,u,v,sqrt(3)/3.,0,0,pas);
271     double un1=0.;
272     double un2=pu/3;
273     double un3=2*pu/3;
274     double uvn1[3]={un1,v,0.};
275     double uvn2[3]={un2,v,0.};
276     double uvn3[3]={un3,v,0.};
277     double xyzn1[3],xyzn2[3],xyzn3[3];
278     mgface->evaluer(uvn1,xyzn1);
279     mgface->evaluer(uvn2,xyzn2);
280     mgface->evaluer(uvn3,xyzn3);
281     MG_NOEUD* nn1=mg_maillage->ajouter_mg_noeud(mgface,xyzn1[0],xyzn1[1],xyzn1[2],MAGIC::ORIGINE::MAILLEUR_AUTO);
282     MG_NOEUD* nn2=mg_maillage->ajouter_mg_noeud(mgface,xyzn2[0],xyzn2[1],xyzn2[2],MAGIC::ORIGINE::MAILLEUR_AUTO);
283     MG_NOEUD* nn3=mg_maillage->ajouter_mg_noeud(mgface,xyzn3[0],xyzn3[1],xyzn3[2],MAGIC::ORIGINE::MAILLEUR_AUTO);
284     MG_SEGMENT *seg1=NULL,*seg2=NULL,*seg3=NULL;
285     int ierr1=insere_segment(mgface,&seg1,nn1,nn2,TOUS_FRONT);
286     int ierr2=insere_segment(mgface,&seg2,nn2,nn3,TOUS_FRONT);
287     int ierr3=insere_segment(mgface,&seg3,nn3,nn1,TOUS_FRONT);
288     while (ierr1*ierr2*ierr3==0)
289     {
290     v=v-(v-uv[1])*0.5;
291     uvn1[1]=v;
292     uvn2[1]=v;
293     uvn3[1]=v;
294     mgface->evaluer(uvn1,xyzn1);
295     mgface->evaluer(uvn2,xyzn2);
296     mgface->evaluer(uvn3,xyzn3);
297     if (seg1!=NULL) ntree_de_segment->supprimer(seg1);
298     if (seg2!=NULL) ntree_de_segment->supprimer(seg2);
299     if (seg3!=NULL) ntree_de_segment->supprimer(seg3);
300     nn1->change_coord(xyzn1);
301     nn2->change_coord(xyzn2);
302     nn3->change_coord(xyzn3);
303     ierr1=insere_segment(mgface,&seg1,nn1,nn2,TOUS_FRONT);
304     ierr2=insere_segment(mgface,&seg2,nn2,nn3,TOUS_FRONT);
305     ierr3=insere_segment(mgface,&seg3,nn3,nn1,TOUS_FRONT);
306     }
307     OT_VECTEUR_3D w(0.,0.,1.);
308     OT_VECTEUR_3D n1n2(uvn1,uvn2);
309     n1n2.norme();
310     OT_VECTEUR_3D n1pole(uvn1,uv);
311     n1pole.norme();
312     double sens=(w&n1n2)*n1pole;
313     if (sens<0)
314     {
315     insere_triangle(mgface,nn1,nn2,nn3);
316     MG_FRONT_2D *ft1=ajouter_front(front_courant,nn1,nn2,seg1);
317     MG_FRONT_2D *ft2=ajouter_front(front_courant,nn2,nn3,seg2);
318     MG_FRONT_2D *ft3=ajouter_front(front_courant,nn3,nn1,seg3);
319     ft1->changer_front_suivant(ft2);
320     ft1->changer_front_precedent(ft3);
321     ft2->changer_front_suivant(ft3);
322     ft2->changer_front_precedent(ft1);
323     ft3->changer_front_suivant(ft1);
324     ft3->changer_front_precedent(ft2);
325     }
326     else
327     {
328     insere_triangle(mgface,nn2,nn1,nn3);
329     MG_FRONT_2D *ft1=ajouter_front(front_courant,nn2,nn1,seg1);
330     MG_FRONT_2D *ft2=ajouter_front(front_courant,nn3,nn2,seg2);
331     MG_FRONT_2D *ft3=ajouter_front(front_courant,nn1,nn3,seg3);
332     ft1->changer_front_suivant(ft3);
333     ft1->changer_front_precedent(ft2);
334     ft2->changer_front_suivant(ft1);
335     ft2->changer_front_precedent(ft3);
336     ft3->changer_front_suivant(ft2);
337     ft3->changer_front_precedent(ft1);
338     }
339    
340     }
341     else if (pv>0.)
342     {
343     double u1=uv[0];
344     double v1=pv/2.;
345     double u2=uv[0]+0.001*(umax-umin);;
346     double v2=pv/2;
347     if (u2>umax) u2=uv[0]-0.001*(umax-umin);
348     double u,v;
349     metrique->ajuste_distance_metrique(mgface,u1,v1,u2,v2,u,v,sqrt(3)/3.,0,0,pas);
350     double vn1=0.;
351     double vn2=pu/3;
352     double vn3=2*pu/3;
353     double uvn1[3]={u,vn1,0.};
354     double uvn2[3]={u,vn2,0.};
355     double uvn3[3]={u,vn3,0.};
356     double xyzn1[3],xyzn2[3],xyzn3[3];
357     mgface->evaluer(uvn1,xyzn1);
358     mgface->evaluer(uvn2,xyzn2);
359     mgface->evaluer(uvn3,xyzn3);
360     MG_NOEUD* nn1=mg_maillage->ajouter_mg_noeud(mgface,xyzn1[0],xyzn1[1],xyzn1[2],MAGIC::ORIGINE::MAILLEUR_AUTO);
361     MG_NOEUD* nn2=mg_maillage->ajouter_mg_noeud(mgface,xyzn2[0],xyzn2[1],xyzn2[2],MAGIC::ORIGINE::MAILLEUR_AUTO);
362     MG_NOEUD* nn3=mg_maillage->ajouter_mg_noeud(mgface,xyzn3[0],xyzn3[1],xyzn3[2],MAGIC::ORIGINE::MAILLEUR_AUTO);
363     MG_SEGMENT *seg1=NULL,*seg2=NULL,*seg3=NULL;
364     int ierr1=insere_segment(mgface,&seg1,nn1,nn2,TOUS_FRONT);
365     int ierr2=insere_segment(mgface,&seg2,nn2,nn3,TOUS_FRONT);
366     int ierr3=insere_segment(mgface,&seg3,nn3,nn1,TOUS_FRONT);
367     while (ierr1*ierr2*ierr3==0)
368     {
369     u=u-(u-uv[0])*0.5;
370     uvn1[0]=u;
371     uvn2[0]=u;
372     uvn3[0]=u;
373     mgface->evaluer(uvn1,xyzn1);
374     mgface->evaluer(uvn2,xyzn2);
375     mgface->evaluer(uvn3,xyzn3);
376     if (seg1!=NULL) ntree_de_segment->supprimer(seg1);
377     if (seg2!=NULL) ntree_de_segment->supprimer(seg2);
378     if (seg3!=NULL) ntree_de_segment->supprimer(seg3);
379     nn1->change_coord(xyzn1);
380     nn2->change_coord(xyzn2);
381     nn3->change_coord(xyzn3);
382     ierr1=insere_segment(mgface,&seg1,nn1,nn2,TOUS_FRONT);
383     ierr2=insere_segment(mgface,&seg2,nn2,nn3,TOUS_FRONT);
384     ierr3=insere_segment(mgface,&seg3,nn3,nn1,TOUS_FRONT);
385     }
386     OT_VECTEUR_3D w(0.,0.,1.);
387     OT_VECTEUR_3D n1n2(uvn1,uvn2);
388     n1n2.norme();
389     OT_VECTEUR_3D n1pole(uvn1,uv);
390     n1pole.norme();
391     double sens=(w&n1n2)*n1pole;
392     if (sens<0)
393     {
394     MG_FRONT_2D *ft1=ajouter_front(front_courant,nn1,nn2,seg1);
395     MG_FRONT_2D *ft2=ajouter_front(front_courant,nn2,nn3,seg2);
396     MG_FRONT_2D *ft3=ajouter_front(front_courant,nn3,nn1,seg3);
397     ft1->changer_front_suivant(ft2);
398     ft1->changer_front_precedent(ft3);
399     ft2->changer_front_suivant(ft3);
400     ft2->changer_front_precedent(ft1);
401     ft3->changer_front_suivant(ft1);
402     ft3->changer_front_precedent(ft2);
403     }
404     else
405     {
406     MG_FRONT_2D *ft1=ajouter_front(front_courant,nn2,nn1,seg1);
407     MG_FRONT_2D *ft2=ajouter_front(front_courant,nn3,nn2,seg2);
408     MG_FRONT_2D *ft3=ajouter_front(front_courant,nn1,nn3,seg3);
409     ft1->changer_front_suivant(ft3);
410     ft1->changer_front_precedent(ft2);
411     ft2->changer_front_suivant(ft1);
412     ft2->changer_front_precedent(ft3);
413     ft3->changer_front_suivant(ft2);
414     ft3->changer_front_precedent(ft1);
415     }
416    
417     }
418     }
419     }
420     }
421    
422    
423    
424    
425 francois 696 void MAILLEUR2D::verifie_coin_sommet(MG_FACE* mgface,TPL_LISTE_ENTITE<MG_TRIANGLE*> *lstaffectecoin)
426 francois 645 {
427     TPL_MAP_ENTITE<MG_SOMMET*> lstsom;
428     int nbboucle=mgface->get_nb_mg_boucle();
429     for (int i=0;i<nbboucle;i++)
430     {
431     MG_BOUCLE *bou=mgface->get_mg_boucle(i);
432     int nbare=bou->get_nb_mg_coarete();
433     for (int j=0;j<nbare;j++)
434     {
435     lstsom.ajouter(bou->get_mg_coarete(j)->get_arete()->get_cosommet1()->get_sommet());
436     lstsom.ajouter(bou->get_mg_coarete(j)->get_arete()->get_cosommet2()->get_sommet());
437     }
438     }
439     TPL_MAP_ENTITE<MG_SOMMET*>::ITERATEUR it;
440     for (MG_SOMMET* som=lstsom.get_premier(it);som!=NULL;som=lstsom.get_suivant(it))
441     {
442     MG_NOEUD* no;
443     int i=0;
444     do
445     {
446     no=(MG_NOEUD*)som->get_lien_maillage()->get(i);
447     i++;
448     }
449     while (mg_maillage->get_mg_noeudid(no->get_id())!=no);
450     int nbtri=no->get_lien_triangle()->get_nb();
451     int nbtrivoisin=0;
452     MG_TRIANGLE* trivoi;
453     for (int i=0;i<nbtri;i++)
454     {
455     MG_TRIANGLE* tri=no->get_lien_triangle()->get(i);
456     if (mg_maillage->get_mg_triangleid(tri->get_id())!=tri) continue;
457     if (tri->get_lien_topologie()==mgface)
458     nbtrivoisin++;
459     trivoi=tri;
460     }
461 francois 696 if (nbtrivoisin>1)
462     for (int i=0;i<nbtri;i++)
463     {
464     MG_TRIANGLE* tri=no->get_lien_triangle()->get(i);
465     if (mg_maillage->get_mg_triangleid(tri->get_id())!=tri) continue;
466     if (tri->get_lien_topologie()==mgface)
467 francois 791 tri->change_origine(MAGIC::ORIGINE::IMPOSE);
468 francois 696 lstaffectecoin->ajouter(tri);
469     }
470 francois 791 if ((nbtrivoisin==1) && (trivoi->get_origine()==MAGIC::ORIGINE::MAILLEUR_AUTO))
471 francois 645 {
472     MG_NOEUD *no1,*no2;
473     if (no==trivoi->get_noeud1()) {no1=trivoi->get_noeud2();no2=trivoi->get_noeud3();}
474     if (no==trivoi->get_noeud2()) {no1=trivoi->get_noeud3();no2=trivoi->get_noeud1();}
475     if (no==trivoi->get_noeud3()) {no1=trivoi->get_noeud1();no2=trivoi->get_noeud2();}
476     MG_TRIANGLE* autretri=NULL;
477     for (int i=0;i<no1->get_lien_triangle()->get_nb();i++)
478     for (int j=0;j<no2->get_lien_triangle()->get_nb();j++)
479     {
480     MG_TRIANGLE* tri1=no1->get_lien_triangle()->get(i);
481     MG_TRIANGLE* tri2=no2->get_lien_triangle()->get(j);
482     if (tri1==tri2)
483     if (tri1!=trivoi) autretri=tri1;
484     }
485     if (autretri!=NULL)
486     {
487     MG_NOEUD* autrenoeud;
488     if ((autretri->get_noeud1()!=no1) && (autretri->get_noeud1()!=no2)) autrenoeud=autretri->get_noeud1();
489     if ((autretri->get_noeud2()!=no1) && (autretri->get_noeud2()!=no2)) autrenoeud=autretri->get_noeud2();
490     if ((autretri->get_noeud3()!=no1) && (autretri->get_noeud3()!=no2)) autrenoeud=autretri->get_noeud3();
491 francois 700 double nqual1=OPERATEUR::qualite_triangle(no1->get_coord(),autrenoeud->get_coord(),no->get_coord());
492     double nqual2=OPERATEUR::qualite_triangle(no2->get_coord(),no->get_coord(),autrenoeud->get_coord());
493     OT_VECTEUR_3D n1n3(no1->get_coord(),no->get_coord());
494     OT_VECTEUR_3D n1n4(no1->get_coord(),autrenoeud->get_coord());
495     double xyznormal[3];
496     double uv[2]={no1->get_u(),no1->get_v()};
497     mgface->calcul_normale_unitaire(uv,xyznormal);
498     OT_VECTEUR_3D normalface(xyznormal);
499     OT_VECTEUR_3D normal=normalface&n1n3;
500     normal.norme();
501     n1n4.norme();
502     if (normal*n1n4<0.0001) nqual1=-nqual1;
503     OT_VECTEUR_3D n2n4(no2->get_coord(),autrenoeud->get_coord());
504     OT_VECTEUR_3D n2n3(no2->get_coord(),no->get_coord());
505     double uv2[2]={no2->get_u(),no2->get_v()};
506     mgface->calcul_normale_unitaire(uv2,xyznormal);
507     OT_VECTEUR_3D normalface2(xyznormal);
508     OT_VECTEUR_3D normal2=normalface&n2n4;
509     normal2.norme();
510     n2n3.norme();
511     if (normal2*n2n3<0.0001) nqual2=-nqual2;
512     if (nqual1<1e-4) continue;
513     if (nqual2<1e-4) continue;
514     MG_TRIANGLE* tri1=insere_triangle(mgface,no1,autrenoeud,no);
515     MG_TRIANGLE* tri2=insere_triangle(mgface,no2,no,autrenoeud);
516 francois 791 tri1->change_origine(MAGIC::ORIGINE::IMPOSE);
517     tri2->change_origine(MAGIC::ORIGINE::IMPOSE);
518 francois 696 lstaffectecoin->ajouter(tri1);
519     lstaffectecoin->ajouter(tri2);
520 francois 645 mg_maillage->supprimer_mg_triangleid(trivoi->get_id());
521     mg_maillage->supprimer_mg_triangleid(autretri->get_id());
522     }
523     }
524    
525     }
526 5
527 francois 645 }
528 5
529    
530     void MAILLEUR2D::initialise_frontiere(MG_FACE* mgface)
531     {
532 francois 632 umin=1e308;vmin=1e-308;
533     umax=-1e308;vmax=-1e-308;
534 5 int nb_boucle=mgface->get_nb_mg_boucle();
535     for (int i=0;i<nb_boucle;i++)
536     {
537     MG_BOUCLE* mgboucle=mgface->get_mg_boucle(i);
538     int nb_coarete=mgboucle->get_nb_mg_coarete();
539     for (int j=0;j<nb_coarete;j++)
540     {
541     MG_COARETE* coarete=mgboucle->get_mg_coarete(j);
542     MG_ARETE* mgarete=coarete->get_arete();
543     int nb_segment=mgarete->get_lien_maillage()->get_nb();
544     for (int k=0;k<nb_segment;k++)
545     {
546     refresh();
547     MG_SEGMENT* mgsegment=(MG_SEGMENT*)mgarete->get_lien_maillage()->get(k);
548     MG_SEGMENT* mgsegtemp=mg_maillage->get_mg_segmentid(mgsegment->get_id());
549     if (mgsegtemp==NULL) continue;
550     MG_NOEUD* mgnoeud=mgsegment->get_noeud1();
551     segment_frontiere.ajouter(mgsegment);
552 francois 61 if (!noeud_frontiere.est_dans_la_liste(mgnoeud))
553     {
554     double uv[2];
555     double *coo=mgnoeud->get_coord();
556     mgface->inverser(uv,coo,1e-4);
557     if (mgface->get_surface()->est_periodique_u()==1)
558     {
559 francois 315 double eps=1e-10*mgface->get_surface()->get_periode_u();
560     if (uv[0]<-eps) uv[0]=uv[0]+mgface->get_surface()->get_periode_u();
561     if (uv[0]>=mgface->get_surface()->get_periode_u()-eps) uv[0]=uv[0]-mgface->get_surface()->get_periode_u();
562 francois 61 }
563     if (mgface->get_surface()->est_periodique_v()==1)
564     {
565 francois 315 double eps=1e-10*mgface->get_surface()->get_periode_v();
566     if (uv[1]<-eps) uv[1]=uv[1]+mgface->get_surface()->get_periode_v();
567     if (uv[1]>=mgface->get_surface()->get_periode_v()-eps) uv[1]=uv[1]-mgface->get_surface()->get_periode_v();
568 francois 61 }
569 francois 632 if (uv[0]<umin) umin=uv[0];
570     if (uv[1]<vmin) vmin=uv[1];
571     if (uv[0]>umax) umax=uv[0];
572     if (uv[1]>vmax) vmax=uv[1];
573 francois 61 mgnoeud->change_u(uv[0]);
574     mgnoeud->change_v(uv[1]);
575     noeud_frontiere.ajouter(mgnoeud);
576     }
577 5 mgnoeud=mgsegment->get_noeud2();
578 francois 61 if (!noeud_frontiere.est_dans_la_liste(mgnoeud))
579 5 {
580     double uv[2];
581     double *coo=mgnoeud->get_coord();
582     mgface->inverser(uv,coo,1e-4);
583     if (mgface->get_surface()->est_periodique_u()==1)
584     {
585 francois 315 double eps=1e-10*mgface->get_surface()->get_periode_u();
586     if (uv[0]<-eps) uv[0]=uv[0]+mgface->get_surface()->get_periode_u();
587     if (uv[0]>=mgface->get_surface()->get_periode_u()-eps) uv[0]=uv[0]-mgface->get_surface()->get_periode_u();
588 5 }
589     if (mgface->get_surface()->est_periodique_v()==1)
590     {
591 francois 315 double eps=1e-10*mgface->get_surface()->get_periode_v();
592     if (uv[1]<-eps) uv[1]=uv[1]+mgface->get_surface()->get_periode_v();
593     if (uv[1]>=mgface->get_surface()->get_periode_v()-eps) uv[1]=uv[1]-mgface->get_surface()->get_periode_v();
594 5 }
595 francois 632 if (uv[0]<umin) umin=uv[0];
596     if (uv[1]<vmin) vmin=uv[1];
597     if (uv[0]>umax) umax=uv[0];
598     if (uv[1]>vmax) vmax=uv[1];
599 5 mgnoeud->change_u(uv[0]);
600     mgnoeud->change_v(uv[1]);
601     noeud_frontiere.ajouter(mgnoeud);
602     }
603     }
604    
605     }
606     }
607    
608     }
609    
610 francois 632 void MAILLEUR2D::cree_ntree(MG_FACE* mgface)
611 5 {
612     int nb_noeud=noeud_frontiere.get_nb();
613 francois 632 int nb_echan=(int)param.get_valeur((char*)"Echantillon_face");
614     BOITE_3D boiteface=mgface->get_boite_3D(nb_echan);
615     boiteface.change_grosseur(1.1);
616     BOITE_3D boitemetrique=metrique->get_boite_3D();
617     BOITE_3D boite=boiteface&boitemetrique;
618     boite=boitemetrique;
619     double xmin=boite.get_xmin();
620     double ymin=boite.get_ymin();
621     double zmin=boite.get_zmin();
622     double xmax=boite.get_xmax();
623     double ymax=boite.get_ymax();
624     double zmax=boite.get_zmax();
625     ntree_de_segment=new TPL_NTREE_FCT<MG_SEGMENT*,FCT_TAILLE>;
626     ntree_de_front=new TPL_OCTREE<MG_FRONT_2D*,MG_NOEUD*>;
627     ntree_de_segment->initialiser(*metrique,xmin,ymin,zmin,xmax,ymax,zmax);
628     ntree_de_front->initialiser(ntree_de_segment);
629 5 int nb_segment=segment_frontiere.get_nb();
630     for (int j=0;j<nb_segment;j++)
631     {
632 francois 632 MG_SEGMENT* seg=segment_frontiere.get(j);
633     ntree_de_segment->inserer(segment_frontiere.get(j));
634 5 }
635     }
636    
637    
638 francois 820 void MAILLEUR2D::initialise_front(MG_FACE* mgface,TPL_MAP_ENTITE<MG_SOMMET*> &liste_pole)
639 5 {
640     MG_FRONT_2D::initialise_compteur_id();
641     int nb_boucle=mgface->get_nb_mg_boucle();
642     for (int iboucle=0;iboucle<nb_boucle;iboucle++)
643     {
644     unsigned int nb_front_avant_cette_boucle=get_nb_front(front_courant);
645     MG_BOUCLE* mgboucle=mgface->get_mg_boucle(iboucle);
646     unsigned int nbcoaretetotale=mgboucle->get_nb_mg_coarete();
647     MG_COARETE* mgcoarete=mgboucle->get_mg_coarete(0);
648     MG_NOEUD* noeud_de_depart;
649     int bon_noeud=0;
650     int numnoeud=0;
651     while (bon_noeud==0)
652     {
653     if (mgcoarete->get_orientation()==MEME_SENS) noeud_de_depart=(MG_NOEUD*)mgcoarete->get_arete()->get_cosommet1()->get_sommet()->get_lien_maillage()->get(numnoeud);
654     else noeud_de_depart=(MG_NOEUD*)mgcoarete->get_arete()->get_cosommet2()->get_sommet()->get_lien_maillage()->get(numnoeud);
655     MG_NOEUD* noeudtemp=mg_maillage->get_mg_noeudid(noeud_de_depart->get_id());
656     if (noeudtemp==NULL) numnoeud++; else bon_noeud=1;
657     }
658     MG_FRONT_2D* premier_front;
659     MG_NOEUD* noeud_courant=noeud_de_depart;
660     MG_FRONT_2D* front_precedent=NULL;
661     unsigned int nbcoaretetraite=0;
662     do
663     {
664 francois 820 MG_SEGMENT* segment_courant=NULL;
665 5 nbcoaretetraite++;
666     MG_NOEUD* noeud_d_arrivee;
667     int bon_noeud=0;
668     int numnoeud=0;
669     while (bon_noeud==0)
670     {
671     if (mgcoarete->get_orientation()==MEME_SENS) noeud_d_arrivee=(MG_NOEUD*)mgcoarete->get_arete()->get_cosommet2()->get_sommet()->get_lien_maillage()->get(numnoeud);
672     else noeud_d_arrivee=(MG_NOEUD*)mgcoarete->get_arete()->get_cosommet1()->get_sommet()->get_lien_maillage()->get(numnoeud);
673     MG_NOEUD* noeudtemp=mg_maillage->get_mg_noeudid(noeud_d_arrivee->get_id());
674     if (noeudtemp==NULL) numnoeud++; else bon_noeud=1;
675     }
676     MG_ARETE* mgarete=mgcoarete->get_arete();
677     int passe_aretefermee=0;
678     do
679     {
680     int trouve=0;
681     int i;
682     if ((mgcoarete->get_arete()->get_cosommet1()->get_sommet()==mgcoarete->get_arete()->get_cosommet2()->get_sommet())&&(passe_aretefermee==0))
683     {
684     passe_aretefermee=1;
685     MG_SEGMENT* mgsegment_depart1=NULL;
686     MG_SEGMENT* mgsegment_depart2=NULL;
687     TPL_SET<MG_ELEMENT_MAILLAGE*>::ITERATEUR it;
688     MG_SEGMENT* mgsegment=(MG_SEGMENT*)mgarete->get_lien_maillage()->get_premier(it);
689     do
690     {
691     if ((mgsegment->get_noeud1()==noeud_courant) || (mgsegment->get_noeud2()==noeud_courant)) mgsegment_depart1=mgsegment;
692     mgsegment=(MG_SEGMENT*)mgarete->get_lien_maillage()->get_suivant(it);
693     }
694     while (mgsegment_depart1==NULL);
695     do
696     {
697     if ((mgsegment->get_noeud1()==noeud_courant) || (mgsegment->get_noeud2()==noeud_courant)) mgsegment_depart2=mgsegment;
698     mgsegment=(MG_SEGMENT*)mgarete->get_lien_maillage()->get_suivant(it);
699     }
700     while (mgsegment_depart2==NULL);
701     MG_NOEUD* noeud1_2;
702     MG_NOEUD* noeud2_2;
703     if (mgsegment_depart1->get_noeud1()==noeud_courant) noeud1_2=mgsegment_depart1->get_noeud2(); else noeud1_2=mgsegment_depart1->get_noeud1();
704     if (mgsegment_depart2->get_noeud1()==noeud_courant) noeud2_2=mgsegment_depart2->get_noeud2(); else noeud2_2=mgsegment_depart2->get_noeud1();
705     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());
706     double coo[3];
707     mgarete->deriver(mgarete->get_tmin(),coo);
708     OT_VECTEUR_3D tangeante(coo[0]*mgcoarete->get_orientation(),coo[1]*mgcoarete->get_orientation(),coo[2]*mgcoarete->get_orientation());
709     MG_NOEUD* noeud_suivant;
710     if (vecteur1*tangeante>0.)
711     {
712     mgsegment=mgsegment_depart1;
713     noeud_suivant=noeud1_2;
714     }
715     else
716     {
717     mgsegment=mgsegment_depart2;
718     noeud_suivant=noeud2_2;
719     }
720     MG_FRONT_2D* front=ajouter_front(front_courant,noeud_courant,noeud_suivant,mgsegment);
721 francois 632 ntree_de_segment->inserer(mgsegment);
722 5 if (get_nb_front(front_courant)==nb_front_avant_cette_boucle+1) premier_front=front;
723     front->changer_front_precedent(front_precedent);
724 couturad 683 if (front_precedent!=NULL) front_precedent->changer_front_suivant(front);
725 5 front_precedent=front;
726     noeud_courant=noeud_suivant;
727     segment_courant=mgsegment;
728     }
729     else
730     {
731     trouve=0;
732     TPL_SET<MG_ELEMENT_MAILLAGE*>::ITERATEUR it;
733     MG_SEGMENT* mgsegment=(MG_SEGMENT*)mgarete->get_lien_maillage()->get_premier(it);
734     do
735     {
736     if ((mgsegment->get_noeud1()==noeud_courant) || (mgsegment->get_noeud2()==noeud_courant))
737     if (mgsegment!=segment_courant)
738     {
739     trouve=1;
740     MG_NOEUD* noeud_suivant;
741     if (mgsegment->get_noeud1()==noeud_courant) noeud_suivant=mgsegment->get_noeud2();
742     else if (mgsegment->get_noeud2()==noeud_courant) noeud_suivant=mgsegment->get_noeud1();
743     MG_FRONT_2D* front=ajouter_front(front_courant,noeud_courant,noeud_suivant,mgsegment);
744 francois 632 ntree_de_segment->inserer(mgsegment);
745 5 if (get_nb_front(front_courant)==nb_front_avant_cette_boucle+1) premier_front=front;
746     else front_precedent->changer_front_suivant(front);
747     front->changer_front_precedent(front_precedent);
748     front_precedent=front;
749     noeud_courant=noeud_suivant;
750     segment_courant=mgsegment;
751     }
752     mgsegment=(MG_SEGMENT*)mgarete->get_lien_maillage()->get_suivant(it);
753     }
754     while (trouve==0);
755     }
756     }
757     while (noeud_courant!=noeud_d_arrivee);
758     int trouve=0;
759     MG_SOMMET* mgsommet;
760     if (mgcoarete->get_orientation()==MEME_SENS) mgsommet=mgcoarete->get_arete()->get_cosommet2()->get_sommet();
761     else mgsommet=mgcoarete->get_arete()->get_cosommet1()->get_sommet();
762 francois 820 if (mgsommet->est_pole()) liste_pole.ajouter(mgsommet);
763 5 double xyz[3];
764     mgsommet->get_point()->evaluer(xyz);
765     int nbcoaretesuivante=mgboucle->get_nb_mg_coarete();
766     MG_COARETE* mgcoaretetmp=NULL;
767     double angleref=0.;
768     double angleref2=0.;
769     for (int i=0;i<nbcoaretesuivante;i++)
770     {
771     MG_COARETE* mgcoarete_suivante=mgboucle->get_mg_coarete(i);
772     MG_SOMMET* mgsommet_suivant;
773     if (mgcoarete_suivante->get_orientation()==MEME_SENS) mgsommet_suivant=mgcoarete_suivante->get_arete()->get_cosommet1()->get_sommet();
774     else mgsommet_suivant=mgcoarete_suivante->get_arete()->get_cosommet2()->get_sommet();
775     if (mgsommet==mgsommet_suivant)
776     {
777     if (trouve==0)
778     {
779     trouve=1;
780     mgcoaretetmp=mgcoarete_suivante;
781     }
782     else
783     {
784     //angleref
785     double uv[2];
786     mgface->inverser(uv,xyz);
787     double normal[3];
788     mgface->calcul_normale_unitaire(uv,normal);
789     double dir1[3];
790     double dir2[3];
791     MG_COSOMMET* mgcosommet;
792     if (mgcoarete->get_orientation()==MEME_SENS) mgcosommet=mgcoarete->get_arete()->get_cosommet2();
793     else mgcosommet=mgcoarete->get_arete()->get_cosommet1();
794     mgcoarete->get_arete()->deriver(mgcosommet->get_t(),dir1);
795     if (mgcoaretetmp->get_orientation()==MEME_SENS) mgcosommet=mgcoaretetmp->get_arete()->get_cosommet1();
796     else mgcosommet=mgcoaretetmp->get_arete()->get_cosommet2();
797     mgcoaretetmp->get_arete()->deriver(mgcosommet->get_t(),dir2);
798     int sens1=mgcoarete->get_orientation();
799     int sens2=mgcoaretetmp->get_orientation();
800     OT_VECTEUR_3D vec1(-dir1[0]*sens1,-dir1[1]*sens1,-dir1[2]*sens1);
801     OT_VECTEUR_3D vec2(dir2[0]*sens2,dir2[1]*sens2,dir2[2]*sens2);
802     vec1.norme();
803     vec2.norme();
804     OT_VECTEUR_3D nor=normal&vec1;
805     double cs=vec1*vec2;
806     double sn=-1*(vec2*nor);
807     angleref=acos(cs);
808     if (sn<0) angleref=-angleref;
809     if (angleref<0) angleref=angleref+2.*M_PI;
810     if (mgcoarete->get_arete()==mgcoaretetmp->get_arete()) angleref=2*M_PI;
811     if (angleref<1e-10)
812     {
813     double dt=1e-3*(mgcoaretetmp->get_arete()->get_tmax()-mgcoaretetmp->get_arete()->get_tmax());
814     mgcoaretetmp->get_arete()->deriver(mgcosommet->get_t()+dt,dir2);
815     OT_VECTEUR_3D vec2(dir2[0]*sens2,dir2[1]*sens2,dir2[2]*sens2);
816     vec2.norme();
817     double cs=vec1*vec2;
818     double sn=-1*(vec2*nor);
819     angleref=acos(cs);
820     if (sn<0) angleref2=-angleref2;
821     if (angleref<0) angleref2=angleref2+2.*M_PI;
822     }
823     //angle
824     if (mgcoarete->get_orientation()==MEME_SENS) mgcosommet=mgcoarete->get_arete()->get_cosommet2();
825     else mgcosommet=mgcoarete->get_arete()->get_cosommet1();
826     mgcoarete->get_arete()->deriver(mgcosommet->get_t(),dir1);
827     if (mgcoarete_suivante->get_orientation()==MEME_SENS) mgcosommet=mgcoarete_suivante->get_arete()->get_cosommet1();
828     else mgcosommet=mgcoarete_suivante->get_arete()->get_cosommet2();
829     mgcoarete_suivante->get_arete()->deriver(mgcosommet->get_t(),dir2);
830     sens1=mgcoarete->get_orientation();
831     sens2=mgcoarete_suivante->get_orientation();
832     vec1.change_x(-dir1[0]*sens1);
833     vec1.change_y(-dir1[1]*sens1);
834     vec1.change_z(-dir1[2]*sens1);
835     vec2.change_x(dir2[0]*sens2);
836     vec2.change_y(dir2[1]*sens2);
837     vec2.change_z(dir2[2]*sens2);
838     vec1.norme();
839     vec2.norme();
840     nor=normal&vec1;
841     cs=vec1*vec2;
842     sn=-1*(vec2*nor);
843     double angle=acos(cs);
844     if (sn<0) angle=-angle;
845     if (angle<0) angle=angle+2.*M_PI;
846     if (mgcoarete->get_arete()==mgcoarete_suivante->get_arete()) angle=2*M_PI;
847     if (angle<angleref)
848     {
849     angleref=angle;
850     mgcoaretetmp=mgcoarete_suivante;
851     }
852     else if ((angle<1e-10) && (angleref<1e-10))
853     {
854     double dt=1e-3*(mgcoarete_suivante->get_arete()->get_tmax()-mgcoarete_suivante->get_arete()->get_tmax());
855     mgcoarete_suivante->get_arete()->deriver(mgcosommet->get_t()+dt,dir2);
856     OT_VECTEUR_3D vec2(dir2[0]*sens2,dir2[1]*sens2,dir2[2]*sens2);
857     vec2.norme();
858     double cs=vec1*vec2;
859     double sn=-1*(vec2*nor);
860     angle=acos(cs);
861     if (sn<0) angle=-angle;
862     if (angle<0) angle=angle+2.*M_PI;
863     if (angle<angleref2)
864     mgcoaretetmp=mgcoarete_suivante;
865    
866     }
867    
868     }
869     }
870 francois 820
871 5 }
872     mgcoarete=mgcoaretetmp;
873 couturad 919 // if(nbcoaretetraite>nbcoaretetotale) break;
874 5 }
875     while ((noeud_courant!=noeud_de_depart) || (nbcoaretetraite!=nbcoaretetotale));
876     front_precedent->changer_front_suivant(premier_front);
877     premier_front->changer_front_precedent(front_precedent);
878     }
879     }
880    
881 couturad 919 int MAILLEUR2D::progresse_front(MG_FACE* mgface)
882 5 {
883     int compteur=0;
884 couturad 919 long Nb_iteration_max_mailleur2d = (long)param.get_valeur((char*)"Nb_iteration_max_mailleur2d");
885 5 while (get_nb_front(front_courant)!=0)
886     {
887 couturad 919 if(compteur>Nb_iteration_max_mailleur2d)
888     {
889     std::cerr << "*** MAILLEUR2D::progresse_front : Nb_iteration_max_mailleur2d atteint ! ***" << std::endl;
890 couturad 951 mg_maillage->get_gestionnaire()->enregistrer("void.magic");
891 couturad 919 return FAIL;
892     }
893 couturad 906 // std::cout << "compteur = " << compteur << std::endl;
894 francois 33 //ofstream o3("c:\\void_1D.mai",ios::out|ios::trunc);
895 francois 820 //o3.(16);
896 francois 33 //o3.setf(ios::showpoint);
897     //mg_maillage->enregistrer_sous_mesh_1D(o3);
898 couturad 919 //ofstream o4("c:\\void_2D.mai",ios::out|ios::trunc);B
899 francois 33 //o4.precision(16);
900     //o4.setf(ios::showpoint);
901     //mg_maillage->enregistrer_sous_mesh_2D(o4);
902 couturad 683 //mg_maillage->get_gestionnaire()->enregistrer("void.magic");
903 5 compteur++;
904 francois 315 /*if (mg_maillage->get_nb_mg_triangle()+558>=1160)
905     {int i=0;
906     LISTE_MG_NOEUD::iterator it;for (MG_NOEUD* noeud=mg_maillage->get_premier_noeud(it);noeud;noeud=mg_maillage->get_suivant_noeud(it))
907     {
908     noeud->change_nouveau_numero(i+1);
909     std::cout << i+1 << " " << noeud->get_u() << " " << noeud->get_v() << std::endl; ;
910     i++;
911     }
912     mg_maillage->get_gestionnaire()->enregistrer("toto.magic");
913     }*/
914 couturad 919 // if (compteur%1000==1)
915    
916     // if(compteur>1000)
917     // {
918 couturad 906 // mg_maillage->get_gestionnaire()->enregistrer("toto.magic");
919 couturad 919 // compteur=0;
920     // }
921 5 refresh();
922     MG_FRONT_2D* ft=get_front(front_courant,0);
923     MG_FRONT_2D* ftp=ft->get_front_precedent();
924     MG_FRONT_2D* fts=ft->get_front_suivant();
925     double eps=0.0001*ft->get_segment()->get_longueur();
926     MG_NOEUD* nop=ftp->get_noeud1();
927     MG_NOEUD* no1=ft->get_noeud1();
928     MG_NOEUD* no2=ft->get_noeud2();
929     MG_NOEUD* nos=fts->get_noeud2();
930     /* angle precedent et angle suivant */
931     OT_VECTEUR_3D n1n2(no1->get_coord(),no2->get_coord());
932     OT_VECTEUR_3D n2s(no2->get_coord(),nos->get_coord());
933     OT_VECTEUR_3D pn1(nop->get_coord(),no1->get_coord());
934     n1n2.norme();
935     n2s.norme();
936     pn1.norme();
937     double coo[3];
938     double uv[2];
939     uv[0]=no1->get_u();
940     uv[1]=no1->get_v();
941     mgface->calcul_normale_unitaire(uv,coo);
942     OT_VECTEUR_3D nplan(coo);
943     OT_VECTEUR_3D n=nplan&n1n2;
944     n.norme();
945     double pcp=(-1)*(n1n2*pn1);
946     double psp=(-1)*(n*pn1);
947     int anglep;
948     if ((pcp>=0.1786481777)&&(psp>eps)) anglep=1; else anglep=0;
949     uv[0]=no2->get_u();
950     uv[1]=no2->get_v();
951     mgface->calcul_normale_unitaire(uv,coo);
952     OT_VECTEUR_3D nplan2(coo);
953     n=nplan2&n1n2;
954     n.norme();
955     double pcs=(-1.)*(n1n2*n2s);
956     double pss=n*n2s;
957     int angles;
958     if ((pcs>=0.1786481777)&&(pss>eps)) angles=1; else angles=0;
959     int type_cas_front[7];
960     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;
961     if (ftp->get_front_precedent()==fts->get_front_suivant()) type_cas_front[CAS_FRONT_4]=1; else type_cas_front[CAS_FRONT_4]=0;
962     if ( (anglep==1) && (angles==1) ) type_cas_front[CAS_FERME_CAVITE]=1; else type_cas_front[CAS_FERME_CAVITE]=0;
963     if ( anglep==1 ) type_cas_front[CAS_FERME_CAVITE_P]=1; else type_cas_front[CAS_FERME_CAVITE_P]=0;
964     if ( angles==1 ) type_cas_front[CAS_FERME_CAVITE_S]=1; else type_cas_front[CAS_FERME_CAVITE_S]=0;
965     type_cas_front[CAS_GENERAL]=1;
966     int solution=PASTROUVE;
967     if (type_cas_front[CAS_FRONT_3]) solution=traite_front(CAS_FRONT_3,mgface,ftp,ft,fts);
968     if ((solution==PASTROUVE) && (type_cas_front[CAS_FRONT_4])) solution=traite_front(CAS_FRONT_4,mgface,ftp,ft,fts);
969     if ((solution==PASTROUVE) && (type_cas_front[CAS_FERME_CAVITE])) solution=traite_front(CAS_FERME_CAVITE,mgface,ftp,ft,fts);
970     if ((solution==PASTROUVE) && (type_cas_front[CAS_FERME_CAVITE_P])) solution=traite_front(CAS_FERME_CAVITE_P,mgface,ftp,ft,fts);
971     if ((solution==PASTROUVE) && (type_cas_front[CAS_FERME_CAVITE_S])) solution=traite_front(CAS_FERME_CAVITE_S,mgface,ftp,ft,fts);
972     if ((solution==PASTROUVE) && (type_cas_front[CAS_GENERAL]))
973     {
974     solution=traite_front(CAS_GENERAL,mgface,ftp,ft,fts);
975     if ((solution!=PASTROUVE)&&(solution!=TROUVE))
976     if (!type_cas_front[solution]) solution=traite_front(solution,mgface,ftp,ft,fts); else solution=PASTROUVE;
977     if (solution==PASTROUVE)
978     {
979     echange_de_front(front_courant,front_attente,ft);
980     ft->incremente_ifail();
981     solution=TROUVE;
982     }
983     }
984     if (get_nb_front(front_courant)==0) front_courant.swap(front_attente);
985     }
986 couturad 919 return OK;
987 5 }
988    
989    
990    
991 francois 447
992 5 void MAILLEUR2D::insere_contrainte_segment(MG_FACE* mgface,TPL_LISTE_ENTITE<MG_SEGMENT*> *lstseg)
993     {
994     int nbseg=lstseg->get_nb();
995     for (int i=0;i<nbseg;i++)
996     {
997     MG_SEGMENT* segori=lstseg->get(i);
998     MG_NOEUD* noeudori1=segori->get_noeud1();
999     MG_NOEUD* noeudori2=segori->get_noeud2();
1000     double uv1[2];
1001     double uv2[2];
1002     double *coo=noeudori1->get_coord();
1003     mgface->inverser(uv1,coo,1e-10);
1004     if (mgface->get_surface()->est_periodique_u()==1)
1005     {
1006     if (uv1[0]<0.0) uv1[0]=uv1[0]+mgface->get_surface()->get_periode_u();
1007     if (uv1[0]>=mgface->get_surface()->get_periode_u()) uv1[0]=uv1[0]-mgface->get_surface()->get_periode_u();
1008     }
1009     if (mgface->get_surface()->est_periodique_v()==1)
1010     {
1011     if (uv1[1]<0.0) uv1[1]=uv1[1]+mgface->get_surface()->get_periode_v();
1012     if (uv1[1]>=mgface->get_surface()->get_periode_v()) uv1[1]=uv1[1]-mgface->get_surface()->get_periode_v();
1013     }
1014     coo=noeudori2->get_coord();
1015     mgface->inverser(uv2,coo,1e-10);
1016     if (mgface->get_surface()->est_periodique_u()==1)
1017     {
1018     if (uv2[0]<0.0) uv2[0]=uv2[0]+mgface->get_surface()->get_periode_u();
1019     if (uv2[0]>=mgface->get_surface()->get_periode_u()) uv2[0]=uv2[0]-mgface->get_surface()->get_periode_u();
1020     }
1021     if (mgface->get_surface()->est_periodique_v()==1)
1022     {
1023     if (uv2[1]<0.0) uv2[1]=uv2[1]+mgface->get_surface()->get_periode_v();
1024     if (uv2[1]>=mgface->get_surface()->get_periode_v()) uv2[1]=uv2[1]-mgface->get_surface()->get_periode_v();
1025     }
1026    
1027     TPL_MAP_ENTITE<MG_FRONT_2D*> liste_trouvee;
1028 francois 632 double *xyz1=noeudori1->get_coord();
1029     double *xyz2=noeudori2->get_coord();
1030     double xyz[3];
1031     xyz[0]=0.5*(xyz1[0]+xyz2[0]);
1032     xyz[1]=0.5*(xyz1[1]+xyz2[1]);
1033     xyz[2]=0.5*(xyz1[2]+xyz2[2]);
1034     OT_VECTEUR_3D vec(xyz1,xyz);
1035     //double rayonrecherche=sqrt((u-uv1[0])*(u-uv1[0])+(v-uv1[1])*(v-uv1[1]))*1.1;
1036     double rayonrecherche=vec.get_longueur()*1.1;
1037     ntree_de_front->rechercher(xyz[0],xyz[1],xyz[2],rayonrecherche,liste_trouvee);
1038    
1039     double u=0.5*(uv1[0]+uv2[0]);
1040 5 double v=0.5*(uv1[1]+uv2[1]);
1041     int nb_entite=liste_trouvee.get_nb();
1042     double du=decalage->calcul_decalage_parametre_u(u);
1043     double dv=decalage->calcul_decalage_parametre_v(v);
1044     double u1=decalage->decalage_parametre_u(uv1[0],du);
1045     double v1=decalage->decalage_parametre_v(uv1[1],dv);
1046     double u2=decalage->decalage_parametre_u(uv2[0],du);
1047     double v2=decalage->decalage_parametre_v(uv2[1],dv);
1048     MG_FRONT_2D *ref1=NULL,*ref2=NULL;
1049     double angle1,angle2;
1050     for(int j=0;j<nb_entite;j++)
1051     {
1052     MG_FRONT_2D *ft=liste_trouvee.get(j);
1053     MG_NOEUD* noeudfront=ft->get_noeud2();
1054     double uvfront[2];
1055     uvfront[0]=noeudfront->get_u();
1056     uvfront[1]=noeudfront->get_v();
1057     double ufront=decalage->decalage_parametre_u(uvfront[0],du);
1058     double vfront=decalage->decalage_parametre_v(uvfront[1],dv);
1059     //noeud 1 du segment a inserer
1060 francois 632 double *xyzfront=noeudfront->get_coord();
1061     //mgface->evaluer(uvfront,xyzfront);
1062     OT_VECTEUR_3D vec(xyz1,xyzfront);
1063     double dist=vec.get_longueur();
1064     //double dist=sqrt((ufront-u1)*(ufront-u1)+(vfront-v1)*(vfront-v1));
1065 francois 61 if (dist<1e-5*rayonrecherche)
1066 5 {
1067     if (ref1==NULL)
1068     {
1069     ref1=ft;
1070     OT_VECTEUR_3D vecteur_baseu(u2-u1,v2-v1,0.);
1071     MG_NOEUD* noeudfrontautre=ft->get_noeud1();
1072     double uvfrontautre[2];
1073     uvfrontautre[0]=noeudfrontautre->get_u();
1074     uvfrontautre[1]=noeudfrontautre->get_v();
1075     double ufrontautre=decalage->decalage_parametre_u(uvfrontautre[0],du);
1076     double vfrontautre=decalage->decalage_parametre_v(uvfrontautre[1],dv);
1077     OT_VECTEUR_3D vecteur_front(ufrontautre-ufront,vfrontautre-vfront,0.);
1078     vecteur_baseu.norme();
1079     vecteur_front.norme();
1080     double cosangle=vecteur_baseu*vecteur_front;
1081     if (cosangle>1.) cosangle=1.;
1082     if (cosangle<-1.) cosangle=(-1.);
1083     angle1=acos(cosangle);
1084     }
1085     else
1086     {
1087     OT_VECTEUR_3D vecteur_baseu(u2-u1,v2-v1,0.);
1088     MG_NOEUD* noeudfrontautre=ft->get_noeud1();
1089     double uvfrontautre[2];
1090     uvfrontautre[0]=noeudfrontautre->get_u();
1091     uvfrontautre[1]=noeudfrontautre->get_v();
1092     double ufrontautre=decalage->decalage_parametre_u(uvfrontautre[0],du);
1093     double vfrontautre=decalage->decalage_parametre_v(uvfrontautre[1],dv);
1094     OT_VECTEUR_3D vecteur_front(ufrontautre-ufront,vfrontautre-vfront,0.);
1095     vecteur_baseu.norme();
1096     vecteur_front.norme();
1097     double cosangle=vecteur_baseu*vecteur_front;
1098     if (cosangle>1.) cosangle=1.;
1099     if (cosangle<-1.) cosangle=(-1.);
1100     double angle=acos(cosangle);
1101     if (angle<angle1) {angle1=angle;ref1=ft;}
1102     }
1103     }
1104     //noeud 2 du segment a inserer
1105 francois 632 OT_VECTEUR_3D vec2(xyz2,xyzfront);
1106     dist=vec2.get_longueur();
1107     //dist=sqrt((ufront-u2)*(ufront-u2)+(vfront-v2)*(vfront-v2));
1108 francois 61 if (dist<1e-5*rayonrecherche)
1109 5 {
1110     if (ref2==NULL)
1111     {
1112     ref2=ft;
1113     OT_VECTEUR_3D vecteur_baseu(u1-u2,v1-v2,0.);
1114     MG_NOEUD* noeudfrontautre=ft->get_noeud1();
1115     double uvfrontautre[2];
1116     uvfrontautre[0]=noeudfrontautre->get_u();
1117     uvfrontautre[1]=noeudfrontautre->get_v();
1118     double ufrontautre=decalage->decalage_parametre_u(uvfrontautre[0],du);
1119     double vfrontautre=decalage->decalage_parametre_v(uvfrontautre[1],dv);
1120     OT_VECTEUR_3D vecteur_front(ufrontautre-ufront,vfrontautre-vfront,0.);
1121     vecteur_baseu.norme();
1122     vecteur_front.norme();
1123     double cosangle=vecteur_baseu*vecteur_front;
1124     if (cosangle>1.) cosangle=1.;
1125     if (cosangle<-1.) cosangle=(-1.);
1126     angle2=acos(cosangle);
1127     }
1128     else
1129     {
1130     OT_VECTEUR_3D vecteur_baseu(u1-u2,v1-v2,0.);
1131     MG_NOEUD* noeudfrontautre=ft->get_noeud1();
1132     double uvfrontautre[2];
1133     uvfrontautre[0]=noeudfrontautre->get_u();
1134     uvfrontautre[1]=noeudfrontautre->get_v();
1135     double ufrontautre=decalage->decalage_parametre_u(uvfrontautre[0],du);
1136     double vfrontautre=decalage->decalage_parametre_v(uvfrontautre[1],dv);
1137     OT_VECTEUR_3D vecteur_front(ufrontautre-ufront,vfrontautre-vfront,0.);
1138     vecteur_baseu.norme();
1139     vecteur_front.norme();
1140     double cosangle=vecteur_baseu*vecteur_front;
1141     if (cosangle>1.) cosangle=1.;
1142     if (cosangle<-1.) cosangle=(-1.);
1143     double angle=acos(cosangle);
1144     if (angle<angle2) {angle1=angle;ref2=ft;}
1145     }
1146     }
1147    
1148     }
1149     // creation du segemnt
1150     MG_NOEUD* noeud1;
1151     MG_NOEUD* noeud2;
1152     if (ref1!=NULL) noeud1=ref1->get_noeud2();
1153     else
1154     {
1155     double *coord=noeudori1->get_coord();
1156 francois 791 noeud1=mg_maillage->ajouter_mg_noeud(mgface,coord[0],coord[1],coord[2],MAGIC::ORIGINE::IMPOSE);
1157 5 noeud1->change_u(uv1[0]);
1158     noeud1->change_v(uv1[1]);
1159 francois 447 noeud1->change_nouveau_numero(noeudori1->get_nouveau_numero());
1160 francois 155 }
1161 5 if (ref2!=NULL) noeud2=ref2->get_noeud2();
1162     else
1163     {
1164     double *coord=noeudori2->get_coord();
1165 francois 791 noeud2=mg_maillage->ajouter_mg_noeud(mgface,coord[0],coord[1],coord[2],MAGIC::ORIGINE::IMPOSE);
1166 5 noeud2->change_u(uv2[0]);
1167     noeud2->change_v(uv2[1]);
1168 francois 155 noeud2->change_nouveau_numero(noeudori2->get_nouveau_numero());
1169     }
1170 francois 791 MG_SEGMENT* mgsegment=mg_maillage->ajouter_mg_segment(mgface,noeud1,noeud2,MAGIC::ORIGINE::IMPOSE);
1171 5 MG_FRONT_2D *nv_ft=ajouter_front(front_courant,noeud1,noeud2,mgsegment);
1172     MG_FRONT_2D *nv_ft2=ajouter_front(front_courant,noeud2,noeud1,mgsegment);
1173     if (ref1==NULL)
1174     {
1175     nv_ft->changer_front_precedent(nv_ft2);
1176     nv_ft2->changer_front_suivant(nv_ft);
1177     }
1178     else
1179     {
1180     MG_FRONT_2D *tmp=ref1->get_front_suivant();
1181     ref1->changer_front_suivant(nv_ft);
1182     nv_ft->changer_front_precedent(ref1);
1183     nv_ft2->changer_front_suivant(tmp);
1184     tmp->changer_front_precedent(nv_ft2);
1185     }
1186     if (ref2==NULL)
1187     {
1188     nv_ft->changer_front_suivant(nv_ft2);
1189     nv_ft2->changer_front_precedent(nv_ft);
1190     }
1191     else
1192     {
1193     MG_FRONT_2D *tmp=ref2->get_front_suivant();
1194     ref2->changer_front_suivant(nv_ft2);
1195     nv_ft2->changer_front_precedent(ref2);
1196     nv_ft->changer_front_suivant(tmp);
1197     tmp->changer_front_precedent(nv_ft);
1198     }
1199    
1200     }
1201     }
1202    
1203     void MAILLEUR2D::insere_contrainte_triangle(MG_FACE* mgface,TPL_LISTE_ENTITE<MG_TRIANGLE*> *lsttri)
1204     {
1205     int nbtri=lsttri->get_nb();
1206     for (int i=0;i<nbtri;i++)
1207     {
1208     MG_TRIANGLE* triori=lsttri->get(i);
1209     MG_NOEUD* noeudori1=triori->get_noeud1();
1210     MG_NOEUD* noeudori2=triori->get_noeud2();
1211     MG_NOEUD* noeudori3=triori->get_noeud3();
1212     double uv1[2];
1213     double uv2[2];
1214     double uv3[2];
1215     double *coo=noeudori1->get_coord();
1216     mgface->inverser(uv1,coo,1e-10);
1217     if (mgface->get_surface()->est_periodique_u()==1)
1218     {
1219     if (uv1[0]<0.0) uv1[0]=uv1[0]+mgface->get_surface()->get_periode_u();
1220     if (uv1[0]>=mgface->get_surface()->get_periode_u()) uv1[0]=uv1[0]-mgface->get_surface()->get_periode_u();
1221     }
1222     if (mgface->get_surface()->est_periodique_v()==1)
1223     {
1224     if (uv1[1]<0.0) uv1[1]=uv1[1]+mgface->get_surface()->get_periode_v();
1225     if (uv1[1]>=mgface->get_surface()->get_periode_v()) uv1[1]=uv1[1]-mgface->get_surface()->get_periode_v();
1226     }
1227     coo=noeudori2->get_coord();
1228     mgface->inverser(uv2,coo,1e-10);
1229     if (mgface->get_surface()->est_periodique_u()==1)
1230     {
1231     if (uv2[0]<0.0) uv2[0]=uv2[0]+mgface->get_surface()->get_periode_u();
1232     if (uv2[0]>=mgface->get_surface()->get_periode_u()) uv2[0]=uv2[0]-mgface->get_surface()->get_periode_u();
1233     }
1234     if (mgface->get_surface()->est_periodique_v()==1)
1235     {
1236     if (uv2[1]<0.0) uv2[1]=uv2[1]+mgface->get_surface()->get_periode_v();
1237     if (uv2[1]>=mgface->get_surface()->get_periode_v()) uv2[1]=uv2[1]-mgface->get_surface()->get_periode_v();
1238     }
1239     coo=noeudori3->get_coord();
1240     mgface->inverser(uv3,coo,1e-10);
1241     if (mgface->get_surface()->est_periodique_u()==1)
1242     {
1243 francois 33 if (uv3[0]<0.0) uv3[0]=uv3[0]+mgface->get_surface()->get_periode_u();
1244     if (uv3[0]>=mgface->get_surface()->get_periode_u()) uv3[0]=uv3[0]-mgface->get_surface()->get_periode_u();
1245 5 }
1246     if (mgface->get_surface()->est_periodique_v()==1)
1247     {
1248     if (uv3[1]<0.0) uv3[1]=uv3[1]+mgface->get_surface()->get_periode_v();
1249     if (uv3[1]>=mgface->get_surface()->get_periode_v()) uv3[1]=uv3[1]-mgface->get_surface()->get_periode_v();
1250     }
1251     TPL_MAP_ENTITE<MG_FRONT_2D*> liste_trouvee;
1252     double u=0.3333333333333333*(uv1[0]+uv2[0]+uv3[0]);
1253     double v=0.3333333333333333*(uv1[1]+uv2[1]+uv3[1]);
1254 francois 33 double rayonrecherche1=sqrt((u-uv1[0])*(u-uv1[0])+(v-uv1[1])*(v-uv1[1]))*2.;
1255     double rayonrecherche2=sqrt((u-uv2[0])*(u-uv2[0])+(v-uv2[1])*(v-uv2[1]))*2.;
1256     double rayonrecherche3=sqrt((u-uv3[0])*(u-uv3[0])+(v-uv3[1])*(v-uv3[1]))*2.;
1257     double rayonrecherche=rayonrecherche1;
1258     if (rayonrecherche2>rayonrecherche) rayonrecherche=rayonrecherche2;
1259     if (rayonrecherche3>rayonrecherche) rayonrecherche=rayonrecherche3;
1260 francois 632 double *xyz1=noeudori1->get_coord();
1261     double *xyz2=noeudori2->get_coord();
1262     double *xyz3=noeudori3->get_coord();
1263     double xyz[3];
1264     xyz[0]=0.333333333333333333333*(xyz1[0]+xyz2[0]+xyz3[0]);
1265     xyz[1]=0.333333333333333333333*(xyz1[1]+xyz2[1]+xyz3[1]);
1266     xyz[2]=0.333333333333333333333*(xyz1[2]+xyz2[2]+xyz3[2]);
1267     OT_VECTEUR_3D vec1(xyz1,xyz);
1268     OT_VECTEUR_3D vec2(xyz2,xyz);
1269     OT_VECTEUR_3D vec3(xyz3,xyz);
1270     rayonrecherche=std::max(vec1.get_longueur(),vec2.get_longueur());
1271     rayonrecherche=std::max(rayonrecherche,vec3.get_longueur())*1.1;
1272     //double rayonrecherche=sqrt((u-uv1[0])*(u-uv1[0])+(v-uv1[1])*(v-uv1[1]))*1.1;
1273     ntree_de_front->rechercher(xyz[0],xyz[1],xyz[2],rayonrecherche,liste_trouvee);
1274 5 int nb_entite=liste_trouvee.get_nb();
1275     double du=decalage->calcul_decalage_parametre_u(u);
1276     double dv=decalage->calcul_decalage_parametre_v(v);
1277     double u1=decalage->decalage_parametre_u(uv1[0],du);
1278     double v1=decalage->decalage_parametre_v(uv1[1],dv);
1279     double u2=decalage->decalage_parametre_u(uv2[0],du);
1280     double v2=decalage->decalage_parametre_v(uv2[1],dv);
1281     double u3=decalage->decalage_parametre_u(uv3[0],du);
1282     double v3=decalage->decalage_parametre_v(uv3[1],dv);
1283     MG_FRONT_2D *ref1=NULL,*ref2=NULL,*ref3=NULL;
1284     double angle1,angle2,angle3;
1285     for(int j=0;j<nb_entite;j++)
1286     {
1287     MG_FRONT_2D *ft=liste_trouvee.get(j);
1288     MG_NOEUD* noeudfront=ft->get_noeud2();
1289     double uvfront[2];
1290     uvfront[0]=noeudfront->get_u();
1291     uvfront[1]=noeudfront->get_v();
1292     double ufront=decalage->decalage_parametre_u(uvfront[0],du);
1293     double vfront=decalage->decalage_parametre_v(uvfront[1],dv);
1294     //noeud 1 du triangle a inserer
1295 francois 632 //double dist=sqrt((ufront-u1)*(ufront-u1)+(vfront-v1)*(vfront-v1));
1296     double *xyzfront=noeudfront->get_coord();
1297     //mgface->evaluer(uvfront,xyzfront);
1298     OT_VECTEUR_3D vec(xyz1,xyzfront);
1299     double dist=vec.get_longueur();
1300 francois 54 if (dist<1e-5*rayonrecherche)
1301 5 {
1302     if (ref1==NULL)
1303     {
1304     ref1=ft;
1305     OT_VECTEUR_3D vecteur_baseu(u2-u1,v2-v1,0.);
1306     MG_NOEUD* noeudfrontautre=ft->get_noeud1();
1307     double uvfrontautre[2];
1308     uvfrontautre[0]=noeudfrontautre->get_u();
1309     uvfrontautre[1]=noeudfrontautre->get_v();
1310     double ufrontautre=decalage->decalage_parametre_u(uvfrontautre[0],du);
1311     double vfrontautre=decalage->decalage_parametre_v(uvfrontautre[1],dv);
1312     OT_VECTEUR_3D vecteur_front(ufrontautre-ufront,vfrontautre-vfront,0.);
1313     vecteur_baseu.norme();
1314     vecteur_front.norme();
1315     double cosangle=vecteur_baseu*vecteur_front;
1316     if (cosangle>1.) cosangle=1.;
1317     if (cosangle<-1.) cosangle=(-1.);
1318     angle1=acos(cosangle);
1319     OT_VECTEUR_3D w(0.,0.,1.);
1320     OT_VECTEUR_3D vecteur_basev=w&vecteur_baseu;
1321     double sangle=vecteur_basev*vecteur_front;
1322     if (sangle<0.) angle1=2*M_PI-angle1;
1323     }
1324     else
1325     {
1326     OT_VECTEUR_3D vecteur_baseu(u2-u1,v2-v1,0.);
1327     MG_NOEUD* noeudfrontautre=ft->get_noeud1();
1328     double uvfrontautre[2];
1329     uvfrontautre[0]=noeudfrontautre->get_u();
1330     uvfrontautre[1]=noeudfrontautre->get_v();
1331     double ufrontautre=decalage->decalage_parametre_u(uvfrontautre[0],du);
1332     double vfrontautre=decalage->decalage_parametre_v(uvfrontautre[1],dv);
1333     OT_VECTEUR_3D vecteur_front(ufrontautre-ufront,vfrontautre-vfront,0.);
1334     vecteur_baseu.norme();
1335     vecteur_front.norme();
1336     double cosangle=vecteur_baseu*vecteur_front;
1337     if (cosangle>1.) cosangle=1.;
1338     if (cosangle<-1.) cosangle=(-1.);
1339     double angle=acos(cosangle);
1340     OT_VECTEUR_3D w(0.,0.,1.);
1341     OT_VECTEUR_3D vecteur_basev=w&vecteur_baseu;
1342     double sangle=vecteur_basev*vecteur_front;
1343     if (sangle<0.) angle=2*M_PI-angle;
1344     if (angle<angle1) {angle1=angle;ref1=ft;}
1345     }
1346     }
1347     //noeud 2 du triangle a inserer
1348 francois 632 //mgface->evaluer(uvfront,xyzfront);
1349     OT_VECTEUR_3D vec2(xyz2,xyzfront);
1350     dist=vec2.get_longueur();
1351     //dist=sqrt((ufront-u2)*(ufront-u2)+(vfront-v2)*(vfront-v2));
1352 francois 54 if (dist<1e-5*rayonrecherche)
1353 5 {
1354     if (ref2==NULL)
1355     {
1356     ref2=ft;
1357     OT_VECTEUR_3D vecteur_baseu(u3-u2,v3-v2,0.);
1358     MG_NOEUD* noeudfrontautre=ft->get_noeud1();
1359     double uvfrontautre[2];
1360     uvfrontautre[0]=noeudfrontautre->get_u();
1361     uvfrontautre[1]=noeudfrontautre->get_v();
1362     double ufrontautre=decalage->decalage_parametre_u(uvfrontautre[0],du);
1363     double vfrontautre=decalage->decalage_parametre_v(uvfrontautre[1],dv);
1364     OT_VECTEUR_3D vecteur_front(ufrontautre-ufront,vfrontautre-vfront,0.);
1365     vecteur_baseu.norme();
1366     vecteur_front.norme();
1367     double cosangle=vecteur_baseu*vecteur_front;
1368     if (cosangle>1.) cosangle=1.;
1369     if (cosangle<-1.) cosangle=(-1.);
1370     angle2=acos(cosangle);
1371     OT_VECTEUR_3D w(0.,0.,1.);
1372     OT_VECTEUR_3D vecteur_basev=w&vecteur_baseu;
1373     double sangle=vecteur_basev*vecteur_front;
1374     if (sangle<0.) angle2=2*M_PI-angle2;
1375     }
1376     else
1377     {
1378     OT_VECTEUR_3D vecteur_baseu(u3-u2,v3-v2,0.);
1379     MG_NOEUD* noeudfrontautre=ft->get_noeud1();
1380     double uvfrontautre[2];
1381     uvfrontautre[0]=noeudfrontautre->get_u();
1382     uvfrontautre[1]=noeudfrontautre->get_v();
1383     double ufrontautre=decalage->decalage_parametre_u(uvfrontautre[0],du);
1384     double vfrontautre=decalage->decalage_parametre_v(uvfrontautre[1],dv);
1385     OT_VECTEUR_3D vecteur_front(ufrontautre-ufront,vfrontautre-vfront,0.);
1386     vecteur_baseu.norme();
1387     vecteur_front.norme();
1388     double cosangle=vecteur_baseu*vecteur_front;
1389     if (cosangle>1.) cosangle=1.;
1390     if (cosangle<-1.) cosangle=(-1.);
1391     double angle=acos(cosangle);
1392     OT_VECTEUR_3D w(0.,0.,1.);
1393     OT_VECTEUR_3D vecteur_basev=w&vecteur_baseu;
1394     double sangle=vecteur_basev*vecteur_front;
1395     if (sangle<0.) angle=2*M_PI-angle;
1396     if (angle<angle2) {angle2=angle;ref2=ft;}
1397     }
1398     }
1399     //noeud 3 du triangle a inserer
1400 francois 632 //dist=sqrt((ufront-u3)*(ufront-u3)+(vfront-v3)*(vfront-v3));
1401     //mgface->evaluer(uvfront,xyzfront);
1402     OT_VECTEUR_3D vec3(xyz3,xyzfront);
1403     dist=vec3.get_longueur();
1404 francois 54 if (dist<1e-5*rayonrecherche)
1405 5 {
1406     if (ref3==NULL)
1407     {
1408     ref3=ft;
1409     OT_VECTEUR_3D vecteur_baseu(u1-u3,v1-v3,0.);
1410     MG_NOEUD* noeudfrontautre=ft->get_noeud1();
1411     double uvfrontautre[2];
1412     uvfrontautre[0]=noeudfrontautre->get_u();
1413     uvfrontautre[1]=noeudfrontautre->get_v();
1414     double ufrontautre=decalage->decalage_parametre_u(uvfrontautre[0],du);
1415     double vfrontautre=decalage->decalage_parametre_v(uvfrontautre[1],dv);
1416     OT_VECTEUR_3D vecteur_front(ufrontautre-ufront,vfrontautre-vfront,0.);
1417     vecteur_baseu.norme();
1418     vecteur_front.norme();
1419     double cosangle=vecteur_baseu*vecteur_front;
1420     if (cosangle>1.) cosangle=1.;
1421     if (cosangle<-1.) cosangle=(-1.);
1422     angle3=acos(cosangle);
1423     OT_VECTEUR_3D w(0.,0.,1.);
1424     OT_VECTEUR_3D vecteur_basev=w&vecteur_baseu;
1425     double sangle=vecteur_basev*vecteur_front;
1426     if (sangle<0.) angle3=2*M_PI-angle3;
1427     }
1428     else
1429     {
1430     OT_VECTEUR_3D vecteur_baseu(u1-u3,v1-v3,0.);
1431     MG_NOEUD* noeudfrontautre=ft->get_noeud1();
1432     double uvfrontautre[2];
1433     uvfrontautre[0]=noeudfrontautre->get_u();
1434     uvfrontautre[1]=noeudfrontautre->get_v();
1435     double ufrontautre=decalage->decalage_parametre_u(uvfrontautre[0],du);
1436     double vfrontautre=decalage->decalage_parametre_v(uvfrontautre[1],dv);
1437     OT_VECTEUR_3D vecteur_front(ufrontautre-ufront,vfrontautre-vfront,0.);
1438     vecteur_baseu.norme();
1439     vecteur_front.norme();
1440     double cosangle=vecteur_baseu*vecteur_front;
1441     if (cosangle>1.) cosangle=1.;
1442     if (cosangle<-1.) cosangle=(-1.);
1443     double angle=acos(cosangle);
1444     OT_VECTEUR_3D w(0.,0.,1.);
1445     OT_VECTEUR_3D vecteur_basev=w&vecteur_baseu;
1446     double sangle=vecteur_basev*vecteur_front;
1447     if (sangle<0.) angle=2*M_PI-angle;
1448     if (angle<angle3) {angle3=angle;ref3=ft;}
1449    
1450     }
1451     }
1452     }
1453     // creation du triangle
1454     MG_NOEUD* noeud1;
1455     MG_NOEUD* noeud2;
1456     MG_NOEUD* noeud3;
1457     if (ref1!=NULL) noeud1=ref1->get_noeud2();
1458     else
1459     {
1460     double *coord=noeudori1->get_coord();
1461 francois 791 noeud1=mg_maillage->ajouter_mg_noeud(mgface,coord[0],coord[1],coord[2],MAGIC::ORIGINE::IMPOSE);
1462 5 noeud1->change_u(uv1[0]);
1463     noeud1->change_v(uv1[1]);
1464 francois 447 noeud1->change_nouveau_numero(noeudori1->get_nouveau_numero());
1465 5 }
1466     if (ref2!=NULL) noeud2=ref2->get_noeud2();
1467     else
1468     {
1469     double *coord=noeudori2->get_coord();
1470 francois 791 noeud2=mg_maillage->ajouter_mg_noeud(mgface,coord[0],coord[1],coord[2],MAGIC::ORIGINE::IMPOSE);
1471 5 noeud2->change_u(uv2[0]);
1472     noeud2->change_v(uv2[1]);
1473 francois 155 noeud2->change_nouveau_numero(noeudori2->get_nouveau_numero());
1474 5 }
1475     if (ref3!=NULL) noeud3=ref3->get_noeud2();
1476     else
1477     {
1478     double *coord=noeudori3->get_coord();
1479 francois 791 noeud3=mg_maillage->ajouter_mg_noeud(mgface,coord[0],coord[1],coord[2],MAGIC::ORIGINE::IMPOSE);
1480 5 noeud3->change_u(uv3[0]);
1481     noeud3->change_v(uv3[1]);
1482 francois 447 noeud3->change_nouveau_numero(noeudori3->get_nouveau_numero());
1483 5 }
1484     MG_SEGMENT* mgsegment1=mg_maillage->get_mg_segment(noeud1->get_id(),noeud2->get_id());
1485     MG_SEGMENT* mgsegment2=mg_maillage->get_mg_segment(noeud2->get_id(),noeud3->get_id());
1486     MG_SEGMENT* mgsegment3=mg_maillage->get_mg_segment(noeud3->get_id(),noeud1->get_id());
1487     int seg1=1,seg2=1,seg3=1;
1488 francois 791 if (mgsegment1==NULL) mgsegment1=mg_maillage->ajouter_mg_segment(mgface,noeud1,noeud2,MAGIC::ORIGINE::IMPOSE); else seg1=0;
1489     if (mgsegment2==NULL) mgsegment2=mg_maillage->ajouter_mg_segment(mgface,noeud2,noeud3,MAGIC::ORIGINE::IMPOSE); else seg2=0;
1490     if (mgsegment3==NULL) mgsegment3=mg_maillage->ajouter_mg_segment(mgface,noeud3,noeud1,MAGIC::ORIGINE::IMPOSE); else seg3=0;
1491     M3D_TRIANGLE* mtriangle=new M3D_TRIANGLE(mgface,noeud1,noeud2,noeud3,mgsegment1,mgsegment2,mgsegment3,MAGIC::ORIGINE::IMPOSE);
1492 5 mg_maillage->ajouter_mg_triangle(mtriangle);
1493 francois 632 int segtotal=seg1+seg2+seg3;
1494 5 if (segtotal==3)
1495     {
1496     MG_FRONT_2D* ft1=ajouter_front(front_courant,noeud1,noeud2,mgsegment1);
1497     MG_FRONT_2D* ft2=ajouter_front(front_courant,noeud2,noeud3,mgsegment2);
1498     MG_FRONT_2D* ft3=ajouter_front(front_courant,noeud3,noeud1,mgsegment3);
1499     if (ref1==NULL)
1500     {
1501     ft1->changer_front_precedent(ft3);
1502     ft3->changer_front_suivant(ft1);
1503     }
1504     else
1505     {
1506     MG_FRONT_2D* tmp=ref1->get_front_suivant();
1507     ft1->changer_front_precedent(ref1);
1508     ref1->changer_front_suivant(ft1);
1509     ft3->changer_front_suivant(tmp);
1510     tmp->changer_front_precedent(ft3);
1511     }
1512     if (ref2==NULL)
1513     {
1514     ft1->changer_front_suivant(ft2);
1515     ft2->changer_front_precedent(ft1);
1516     }
1517     else
1518     {
1519     MG_FRONT_2D* tmp=ref2->get_front_suivant();
1520     ft2->changer_front_precedent(ref2);
1521     ref2->changer_front_suivant(ft2);
1522     ft1->changer_front_suivant(tmp);
1523     tmp->changer_front_precedent(ft1);
1524     }
1525     if (ref3==NULL)
1526     {
1527     ft2->changer_front_suivant(ft3);
1528     ft3->changer_front_precedent(ft2);
1529     }
1530     else
1531     {
1532     MG_FRONT_2D* tmp=ref3->get_front_suivant();
1533     ft3->changer_front_precedent(ref3);
1534     ref3->changer_front_suivant(ft3);
1535     ft2->changer_front_suivant(tmp);
1536     tmp->changer_front_precedent(ft2);
1537     }
1538     }
1539     if (segtotal==2)
1540     {
1541     MG_FRONT_2D *front1,*front2,*front3;
1542     MG_SEGMENT *segcre1,*segcre2;
1543     if (seg3==0)
1544     {
1545     front1=ref1;front2=ref3;front3=ref2;
1546     segcre1=mgsegment1;segcre2=mgsegment2;
1547     }
1548     if (seg1==0)
1549     {
1550     front1=ref2;front2=ref1;front3=ref3;
1551     segcre1=mgsegment2;segcre2=mgsegment3;
1552     }
1553     if (seg2==0)
1554     {
1555     front1=ref3;front2=ref2;front3=ref1;
1556     segcre1=mgsegment3;segcre2=mgsegment1;
1557     }
1558     MG_FRONT_2D* ft1=ajouter_front(front_courant,segcre1->get_noeud1(),segcre1->get_noeud2(),segcre1);
1559     MG_FRONT_2D* ft2=ajouter_front(front_courant,segcre2->get_noeud1(),segcre2->get_noeud2(),segcre2);
1560     front1->changer_front_suivant(ft1);
1561     ft1->changer_front_precedent(front1);
1562     if (front3==NULL)
1563     {
1564     ft1->changer_front_suivant(ft2);
1565     ft2->changer_front_precedent(ft1);
1566     }
1567     else
1568     {
1569     MG_FRONT_2D* tmp=front3->get_front_suivant();
1570     ft1->changer_front_suivant(tmp);
1571     tmp->changer_front_precedent(ft1);
1572     ft2->changer_front_precedent(front3);
1573     front3->changer_front_suivant(ft2);
1574     }
1575     ft2->changer_front_suivant(front2->get_front_suivant());
1576     front2->get_front_suivant()->changer_front_precedent(ft2);
1577     supprimer_front(front2);
1578     }
1579     if (segtotal==1)
1580     {
1581     MG_FRONT_2D *front1,*front2,*front3;
1582     MG_SEGMENT *segcre1;
1583     if (seg1==1)
1584     {
1585     front1=ref1;front2=ref3;front3=ref2;
1586     segcre1=mgsegment1;
1587     }
1588     if (seg2==1)
1589     {
1590     front1=ref2;front2=ref1;front3=ref3;
1591     segcre1=mgsegment2;
1592     }
1593     if (seg3==1)
1594     {
1595     front1=ref3;front2=ref2;front3=ref1;
1596     segcre1=mgsegment3;
1597     }
1598     MG_FRONT_2D* ft1=ajouter_front(front_courant,segcre1->get_noeud1(),segcre1->get_noeud2(),segcre1);
1599     front1->changer_front_suivant(ft1);
1600     ft1->changer_front_precedent(front1);
1601     ft1->changer_front_suivant(front3->get_front_suivant());
1602     front3->get_front_suivant()->changer_front_precedent(ft1);
1603     supprimer_front(front2);
1604     supprimer_front(front3);
1605     }
1606     if (segtotal==0)
1607     {
1608     supprimer_front(ref1);
1609     supprimer_front(ref2);
1610     supprimer_front(ref3);
1611     }
1612    
1613    
1614     }
1615     }
1616    
1617 francois 447 void MAILLEUR2D::change_niveau_optimisation(int num)
1618     {
1619     niveau_optimisation=num;
1620     }
1621 5
1622 francois 447 int MAILLEUR2D::get_niveau_optimisation(void)
1623     {
1624     return niveau_optimisation;
1625     }
1626    
1627    
1628 5 // FONCTIONS GERANT L ENTITE FRONT (ajout suppression et tout le bordel)
1629     MG_FRONT_2D* MAILLEUR2D::ajouter_front(FRONT& front,MG_NOEUD* noeud1,MG_NOEUD* noeud2,MG_SEGMENT* segment)
1630     {
1631     MG_FRONT_2D* ft=new MG_FRONT_2D(noeud1,noeud2,segment);
1632     ajouter_front(front,ft);
1633 francois 632 ntree_de_front->inserer(ft);
1634 5 return ft;
1635     }
1636    
1637     void MAILLEUR2D::ajouter_front(FRONT& front,MG_FRONT_2D *ft)
1638     {
1639     std::pair<const double,MG_FRONT_2D*> tmp(ft->get_segment()->get_longueur(),ft);
1640     front.insert(tmp);
1641     }
1642    
1643     MG_FRONT_2D* MAILLEUR2D::get_front(FRONT& front,unsigned int num)
1644     {
1645     FRONT::iterator i=front.begin();
1646     for (unsigned long j=0;j<num;j++) i++;
1647     return ((*i).second);
1648     }
1649    
1650    
1651     unsigned int MAILLEUR2D::get_nb_front(FRONT& front)
1652     {
1653     return front.size();
1654     }
1655    
1656    
1657     void MAILLEUR2D::supprimer_front(MG_FRONT_2D* ft)
1658     {
1659 francois 632 ntree_de_front->supprimer(ft);
1660 5
1661     FRONT::iterator j=front_courant.lower_bound(ft->get_segment()->get_longueur());
1662     int ok=0;
1663     if (j==front_courant.end()) ok=2;
1664     while (ok==0)
1665     {
1666     MG_FRONT_2D* fttmp=(*j).second;
1667     if (ft==fttmp) {ok=1;front_courant.erase(j);}
1668     if (fttmp->get_segment()->get_longueur()>ft->get_segment()->get_longueur()) ok=2;
1669     j++;
1670     }
1671     if (ok!=1)
1672     {
1673     j=front_attente.lower_bound(ft->get_segment()->get_longueur());
1674     while (ft!=(*j).second) j++;
1675     front_attente.erase(j);
1676     }
1677    
1678     delete ft;
1679     }
1680    
1681     void MAILLEUR2D::echange_de_front(FRONT& front_original,FRONT& front_destination,MG_FRONT_2D* ft)
1682     {
1683     FRONT::iterator j=front_original.lower_bound(ft->get_segment()->get_longueur());
1684     while (ft!=(*j).second) j++;
1685     front_original.erase(j);
1686     ajouter_front(front_destination,ft);
1687     }
1688 francois 632
1689