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