MAGiC  V5.0
Mailleurs Automatiques de Géometries intégrés à la Cao
rec_squelette_opt.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 //####// rec_squelette_opt.cpp
15 //####//
16 //####//------------------------------------------------------------
17 //####//------------------------------------------------------------
18 //####// COPYRIGHT 2000-2024
19 //####// jeu 13 jun 2024 11:58:56 EDT
20 //####//------------------------------------------------------------
21 //####//------------------------------------------------------------
22 #include "rec_squelette_opt.h"
23 #include <stdio.h>
24 #include <limits>
25 
27 {
28 }
29 
30 
31 
33 {
34 }
35 
36 
37 
38 void REC_SQUELETTE_OPT::import_squelette_cg(FILE* fichier_cg, MG_MAILLAGE* mai_sq)
39 {
40  std::vector<SQ_NOEUD*> lst_noeuds;
41  double xx,yy,zz;
42  int n1,n2;
43  char ligne[100];
44  char c;
45 
46  std::fgets(ligne,100,fichier_cg);
47  while((std::fgets(ligne,100,fichier_cg)!=nullptr)&&(ligne[0]=='v'))
48  {
49  std::sscanf(ligne,"%c %lf %lf %lf",&c,&xx,&yy,&zz);
50  SQ_NOEUD* no_sq=new SQ_NOEUD(nullptr,xx,yy,zz,MAGIC::ORIGINE::SQUELETTE);
51  lst_noeuds.push_back(no_sq);
52  mai_sq->ajouter_mg_noeud(no_sq);
53  }
54  do
55  {
56  std::sscanf(ligne,"%c %d %d",&c,&n1,&n2);
57  MG_SEGMENT* seg_sq=new MG_SEGMENT(nullptr,lst_noeuds[n1-1],lst_noeuds[n2-1],MAGIC::ORIGINE::SQUELETTE);
58  mai_sq->ajouter_mg_segment(seg_sq);
59  }
60  while((std::fgets(ligne,100,fichier_cg)!=nullptr)&&(ligne[0]=='e'));
61  std::fclose (fichier_cg);
62 }
63 
64 
65 
67 {
68  MG_NOEUD* no=nullptr;
69 
70  TPL_LISTE_ENTITE<MG_TRIANGLE*>* lsttrifront;
71  int nbvolume=mai_nd->get_mg_geometrie()->get_nb_mg_volume();
72  lsttrifront=new TPL_LISTE_ENTITE<MG_TRIANGLE*>[nbvolume];
73 
74  cree_liste_frontiere(mai_nd,lsttrifront);
75 
76  LISTE_MG_NOEUD::iterator itNo;
78 
79  for(no=mai_sq->get_premier_noeud(itNo);no!=nullptr;no=mai_sq->get_suivant_noeud(itNo))
80  {
81  double xyz[3]={no->get_x(),no->get_y(),no->get_z()};
82  for (int i=0;i<nbvolume;i++)
83  if(point_appartient_volume(xyz,lsttrifront,i))
84  LstNoND.ajouter(no);
85  }
86  for(int i=0;i<LstNoND.get_nb();i++)
87  {
88  no=LstNoND.get(i);
89  int nbseg=no->get_lien_segment()->get_nb();
90  for(int j=0;j<nbseg;j++)
91  {
92  MG_SEGMENT* seg=no->get_lien_segment()->get(j);
93  mai_sq->supprimer_mg_segmentid(seg->get_id());
94  }
95  }
96  delete[] lsttrifront;
97 }
98 
99 
100 
102 {
103  int nbvolume=mai->get_mg_geometrie()->get_nb_mg_volume();
104  for (int i=0;i<nbvolume;i++)
105  {
106  MG_VOLUME* vol=mai->get_mg_geometrie()->get_mg_volume(i);
107  int nbco=vol->get_nb_mg_coquille();
108  for (int j=0;j<nbco;j++)
109  {
110  MG_COQUILLE* coq=vol->get_mg_coquille(j);
111  int nbface=coq->get_nb_mg_coface();
112  for (int k=0;k<nbface;k++)
113  {
114  MG_FACE* face=coq->get_mg_coface(k)->get_face();
115  int nbseg=face->get_lien_maillage()->get_nb();
116  for (int l=0;l<nbseg;l++)
117  {
118  MG_TRIANGLE* tri=(MG_TRIANGLE*)face->get_lien_maillage()->get(l);
119  if (mai->get_mg_triangleid(tri->get_id())==nullptr) continue;
120  lsttrifront[i].ajouter(tri);
121  }
122  }
123  }
124  }
125 }
126 
127 
128 
130 {
131  int ok=0;
132  int i=0;
133  std::multimap<double,double,std::less<double> > intersection;
134  OT_VECTEUR_3D vecteur_dir;
135  while (ok==0)
136  {
137  int ok2=0;
138  while (ok2==0)
139  {
140  MG_TRIANGLE* tri=lsttrifront[numvol].get(i);
141  MG_NOEUD* no1=tri->get_noeud1();
142  MG_NOEUD* no2=tri->get_noeud2();
143  MG_NOEUD* no3=tri->get_noeud3();
144  double xb=(no1->get_x()+no2->get_x()+no3->get_x())/3.;
145  double yb=(no1->get_y()+no2->get_y()+no3->get_y())/3.;
146  double zb=(no1->get_z()+no2->get_z()+no3->get_z())/3.;
147  OT_VECTEUR_3D directeur(xb-xyz[0],yb-xyz[1],zb-xyz[2]);
148  directeur.norme();
149  vecteur_dir=directeur;
150  OT_VECTEUR_3D n1n3(no1->get_coord(),no3->get_coord());
151  OT_VECTEUR_3D n1n2(no1->get_coord(),no2->get_coord());
152  OT_VECTEUR_3D n=n1n3&n1n2;
153  n.norme();
154  double ps1=n*directeur;
155  if (fabs(ps1)<1e-6) i++;
156  else ok2=1;
157  }
158  ok2=0;
159  intersection.clear();
160  for (int j=0;j<lsttrifront[numvol].get_nb();j++)
161  {
162  MG_TRIANGLE* tri=lsttrifront[numvol].get(j);
163 
164  double t;
165  int res=inter_droite_triangle(xyz,vecteur_dir,tri,&t);
166  if (res==2)
167  {
168  ok2=1;
169  break;
170  }
171  if (res==1)
172  {
173  std::pair<double,double> tmp(t,t);
174  intersection.insert(tmp);
175  }
176  }
177  if (ok2==0) ok=1;
178  i++;
179  }
180  std::multimap<double,double,std::less <double> >::iterator it=intersection.begin();
181  int nbinterneg=0;
182  double tavant=1e308;
183  while (it!=intersection.end())
184  {
185  if ((*it).second<0.)
186  {
187  double t=(*it).second;
188  if (!(OPERATEUR::egal(t,tavant,1e-6)))
189  nbinterneg++;
190  tavant=t;
191  }
192  it++;
193  }
194  if (nbinterneg%2==1) return 1;
195  return 0;
196 }
197 
198 
199 
200 int REC_SQUELETTE_OPT::inter_droite_triangle(double *xyz,double *dir,MG_TRIANGLE* tri,double *t)
201 {
202  MG_NOEUD *noeud1=tri->get_noeud1();
203  MG_NOEUD *noeud2=tri->get_noeud2();
204  MG_NOEUD *noeud3=tri->get_noeud3();
205  OT_VECTEUR_3D g1(noeud2->get_x()-noeud1->get_x(),noeud2->get_y()-noeud1->get_y(),noeud2->get_z()-noeud1->get_z());
206  OT_VECTEUR_3D g2(noeud3->get_x()-noeud1->get_x(),noeud3->get_y()-noeud1->get_y(),noeud3->get_z()-noeud1->get_z());
207  OT_VECTEUR_3D g3(dir);
208  OT_MATRICE_3D systeme(g1,g2,g3);
209  double det=systeme.get_determinant();
210  double eps=0.333333333333*(g1.diff()+g2.diff()+g3.diff());
211  eps=eps*eps*0.0018;
212  if (OPERATEUR::egal(det,0.0,eps)==true)
213  {
214  OT_VECTEUR_3D g3b(xyz[0]-noeud1->get_x(),xyz[1]-noeud1->get_y(),xyz[2]-noeud1->get_z());
215  OT_MATRICE_3D systeme2(g1,g2,g3b);
216  double det2=systeme2.get_determinant();
217  double eps2=0.333333333333*(g1.diff()+g2.diff()+g3b.diff());
218  eps2=18.*eps2*eps2*eps2*1e-6;
219  if (OPERATEUR::egal(det2,0.0,eps)==true) // cas 2D
220  {
221  return 2;
222  }
223  else return 0;
224  }
225  else
226  {
227  double x,y,z;
228  x=1.0/det*(g2.get_y()*g3.get_z()-g2.get_z()*g3.get_y());
229  y=1.0/det*(g3.get_x()*g2.get_z()-g2.get_x()*g3.get_z());
230  z=1.0/det*(g2.get_x()*g3.get_y()-g2.get_y()*g3.get_x());
231  OT_VECTEUR_3D g1b(x,y,z);
232  x=1.0/det*(g3.get_y()*g1.get_z()-g1.get_y()*g3.get_z());
233  y=1.0/det*(g1.get_x()*g3.get_z()-g3.get_x()*g1.get_z());
234  z=1.0/det*(g3.get_x()*g1.get_y()-g1.get_x()*g3.get_y());
235  OT_VECTEUR_3D g2b(x,y,z);
236  x=1.0/det*(g1.get_y()*g2.get_z()-g1.get_z()*g2.get_y());
237  y=1.0/det*(g2.get_x()*g1.get_z()-g1.get_x()*g2.get_z());
238  z=1.0/det*(g1.get_x()*g2.get_y()-g1.get_y()*g2.get_x());
239  OT_VECTEUR_3D g3b(x,y,z);
240  OT_VECTEUR_3D n1n4(xyz[0]-noeud1->get_x(),xyz[1]-noeud1->get_y(),xyz[2]-noeud1->get_z());
241  double alpha1=n1n4*g1b;
242  double alpha2=n1n4*g2b;
243  double alpha3=-(n1n4*g3b);
244  double alpha4=1-alpha1-alpha2;
245  double eps=0.000001;
246  if ((alpha1>-eps) && (alpha1<1.+eps))
247  if ((alpha2>-eps) && (alpha2<1.+eps))
248  if ((alpha4>-eps) && (alpha4<1.+eps)) {
249  *t=alpha3;
250  return 1;
251  }
252  return 0;
253  }
254 }
255 
256 
257 
259 {
260  MG_NOEUD* no=nullptr;
261  LISTE_MG_NOEUD::iterator ItLstNo;
262  MG_SEGMENT* seg=nullptr;
263 
264  //1) Recherche des contours design/non-design
265  TPL_LISTE_ENTITE<MG_NOEUD*> LstNoInter;
266  std::vector<std::vector<MG_NOEUD*>> LstContour;
267 
268  for(no=mai_peau->get_premier_noeud(ItLstNo);no!=nullptr;no=mai_peau->get_suivant_noeud(ItLstNo))
269  if(!LstNoInter.est_dans_la_liste(no))
270  for(int i=0;i<no->get_lien_segment()->get_nb();i++)
271  {
272  seg=no->get_lien_segment()->get(i);
273  if(seg->get_lien_triangle()->get(0)->get_origine()!=seg->get_lien_triangle()->get(1)->get_origine())
274  {
275  LstNoInter.ajouter(no);
276  std::vector<MG_NOEUD*> Contour;
277  Contour.push_back(no);
278  recherche_contour(&Contour,&LstNoInter);
279  LstContour.push_back(Contour);
280  break;
281  }
282  }
283 
284  //2) Recherche des noeuds extrêmes du squelette
285  TPL_LISTE_ENTITE<MG_NOEUD*> LstNoExtr;
286  for(no=mai_sq->get_premier_noeud(ItLstNo);no!=nullptr;no=mai_sq->get_suivant_noeud(ItLstNo))
287  if(no->get_nb_reference()==1)
288  LstNoExtr.ajouter(no);
289 
290  //3) Création d'un noeud au centre de chaque contour design/non-design
291  TPL_LISTE_ENTITE<MG_NOEUD*> LstNoCntr;
292  for(int i=0;i<LstContour.size();i++)
293  {
294  double C[3];
295  centre_contour(&LstContour[i],C);
296  SQ_NOEUD* no_sq=new SQ_NOEUD(nullptr,C[0],C[1],C[2],MAGIC::ORIGINE::SECTION);
297  LstNoCntr.ajouter(no_sq);
298 
299  OT_VECTEUR_3D A(no_sq->get_coord(),LstContour[i].front()->get_coord());
300  OT_VECTEUR_3D B(no_sq->get_coord(),LstContour[i].back()->get_coord());
301  OT_VECTEUR_3D N=A&B;
302  N.norme();
303  no_sq->change_normal_section(N);
304  mai_sq->ajouter_mg_noeud(no_sq);
305 
306  //*) Stockage de la liste des interfaces design/non-design dans le vecteur LstBranches
307  std::vector<MG_NOEUD*> Section;
308  for(int j=0;j<LstContour[i].size();j++)
309  {
310  no=LstContour[i][j];
311  MG_NOEUD* no_sec=new MG_NOEUD(nullptr,no->get_x(),no->get_y(),no->get_z(),MAGIC::ORIGINE::SECTION);
312  Section.push_back(no_sec);
313  }
314  SQ_BRANCHE* bran=new SQ_BRANCHE();
315  bran->ajouter_section(no_sq,Section);
316  LstBranches.push_back(bran);
317  }
318 
319  //4) Liaison des noeuds extrêmes aux noeuds centraux
320  for(int i=0;i<LstNoExtr.get_nb();i++)
321  {
322  double dist_min=std::numeric_limits<double>::max();
323  for(int j=0;j<LstNoCntr.get_nb();j++)
324  {
325  OT_VECTEUR_3D V(LstNoExtr.get(i)->get_coord(),LstNoCntr.get(j)->get_coord());
326  if(dist_min>V.get_longueur())
327  {
328  dist_min=V.get_longueur();
329  no=LstNoCntr.get(j);
330  }
331  }
332  MG_SEGMENT* seg_sq=new MG_SEGMENT(nullptr,LstNoExtr.get(i),no,MAGIC::ORIGINE::SQUELETTE);
333  mai_sq->ajouter_mg_segment(seg_sq);
334  LstNoCntr.supprimer(no);
335  }
336 
337  //5) Liaison des noeuds centraux restants aux noeuds les plus proches
338  for(int i=0;i<LstNoCntr.get_nb();i++)
339  {
340  double dist_min=std::numeric_limits< double >::max();
341  MG_NOEUD* no_prch=nullptr;
342  for(no=mai_sq->get_premier_noeud(ItLstNo);no!=nullptr;no=mai_sq->get_suivant_noeud(ItLstNo))
343  {
344  OT_VECTEUR_3D V(LstNoCntr.get(i)->get_coord(),no->get_coord());
345  if((no!=LstNoCntr.get(i))&&(dist_min>V.get_longueur()))
346  {
347  dist_min=V.get_longueur();
348  no_prch=no;
349  }
350  }
351  MG_SEGMENT* seg_sq=new MG_SEGMENT(nullptr,LstNoCntr.get(i),no_prch,MAGIC::ORIGINE::SQUELETTE);
352  mai_sq->ajouter_mg_segment(seg_sq);
353  }
354 }
355 
356 
357 
359 {
360  MG_NOEUD* no=nullptr;
361  LISTE_MG_NOEUD::iterator ItLstNo;
362  MG_SEGMENT* seg=nullptr;
363  LISTE_MG_SEGMENT::iterator ItLstSeg;
364  MG_TRIANGLE* tri=nullptr;
365  LISTE_MG_TRIANGLE::iterator ItLstTri;
366 
367  double max=std::numeric_limits<double>::max();
368  double xmin=max;
369  double ymin=max;
370  double zmin=max;
371  double xmax=-max;
372  double ymax=-max;
373  double zmax=-max;
374  for(no=mai_peau->get_premier_noeud(ItLstNo);no!=NULL;no=mai_peau->get_suivant_noeud(ItLstNo))
375  {
376  if(no->get_x()<xmin) xmin=no->get_x();
377  if(no->get_y()<ymin) ymin=no->get_y();
378  if(no->get_z()<zmin) zmin=no->get_z();
379  if(no->get_x()>xmax) xmax=no->get_x();
380  if(no->get_y()>ymax) ymax=no->get_y();
381  if(no->get_z()>zmax) zmax=no->get_z();
382  }
383  BOITE_3D boite(xmin,ymin,zmin,xmax,ymax,zmax);
384  boite.change_grosseur(1.1);
385 
386  int nb_pas=cbrt(mai_peau->get_nb_mg_noeud());
387  GrilleSeg.initialiser(boite.get_xmin(),boite.get_ymin(),boite.get_zmin(),boite.get_xmax(),boite.get_ymax(),boite.get_zmax(),nb_pas,nb_pas,nb_pas);
388  GrilleTri.initialiser(boite.get_xmin(),boite.get_ymin(),boite.get_zmin(),boite.get_xmax(),boite.get_ymax(),boite.get_zmax(),nb_pas,nb_pas,nb_pas);
389 
390  for(seg=mai_peau->get_premier_segment(ItLstSeg);seg!=nullptr;seg=mai_peau->get_suivant_segment(ItLstSeg))
391  GrilleSeg.inserer(seg);
392  for(tri=mai_peau->get_premier_triangle(ItLstTri);tri!=nullptr;tri=mai_peau->get_suivant_triangle(ItLstTri))
393  GrilleTri.inserer(tri);
394 }
395 
396 
397 
398 void REC_SQUELETTE_OPT::recherche_contour(std::vector<MG_NOEUD*>* Contour,TPL_LISTE_ENTITE<MG_NOEUD*>* LstNoInter)
399 {
400  MG_NOEUD* no=Contour->front();
401  MG_NOEUD* no_suivant=nullptr;
402  MG_NOEUD* no_precedent=nullptr;
403  MG_SEGMENT* seg=nullptr;
404 
405  while(no_suivant!=Contour->front())
406  {
407  for(int i=0;i<no->get_lien_segment()->get_nb();i++)
408  {
409  seg=no->get_lien_segment()->get(i);
410  if(seg->get_noeud1()!=no) no_suivant=seg->get_noeud1();
411  else no_suivant=seg->get_noeud2();
412  if((seg->get_lien_triangle()->get(0)->get_origine()!=seg->get_lien_triangle()->get(1)->get_origine())&&(no_suivant!=no_precedent))
413  {
414  Contour->push_back(no_suivant);
415  LstNoInter->ajouter(no_suivant);
416  break;
417  }
418  }
419  no_precedent=no;
420  no=no_suivant;
421  }
422  Contour->pop_back();
423 }
424 
425 
426 
427 void REC_SQUELETTE_OPT::centre_contour(std::vector<MG_NOEUD*>* Contour,double C[3])
428 {
429  MG_NOEUD* no=nullptr;
430  C[0]=0.;
431  C[1]=0.;
432  C[2]=0.;
433  for(int i=0;i<Contour->size();i++)
434  {
435  no=(*Contour)[i];
436  C[0]+=no->get_x();
437  C[1]+=no->get_y();
438  C[2]+=no->get_z();
439  }
440  C[0]/=Contour->size();
441  C[1]/=Contour->size();
442  C[2]/=Contour->size();
443 }
444 
445 
446 
448 {
449  MG_NOEUD* no=nullptr;
450  MG_NOEUD* no_extr=nullptr;
451  MG_NOEUD* no_suivant=nullptr;
452  MG_NOEUD* no_precedent=nullptr;
453  SQ_NOEUD* no_sq=nullptr;
454  TPL_LISTE_ENTITE<MG_NOEUD*> LstNoExtr;
455  LISTE_MG_NOEUD::iterator ItLstNo;
456  std::vector<SQ_NOEUD*> branche;
457  MG_SEGMENT* seg=nullptr;
458 
459  //Détermination des branches
460  for(no=mai_sq->get_premier_noeud(ItLstNo);no!=nullptr;no=mai_sq->get_suivant_noeud(ItLstNo))
461  if(no->get_nb_reference()>2) LstNoExtr.ajouter(no);
462  for(int i=0;i<LstNoExtr.get_nb();i++)
463  {
464  no_extr=LstNoExtr.get(i);
465  for(int j=0;j<no_extr->get_lien_segment()->get_nb();j++)
466  {
467  no_sq=(SQ_NOEUD*)no_extr;
468  branche.push_back(no_sq);
469  seg=no_extr->get_lien_segment()->get(j);
470  if(seg->get_noeud1()!=no_extr) no_suivant=seg->get_noeud1();
471  else no_suivant=seg->get_noeud2();
472  no_sq=(SQ_NOEUD*)no_suivant;
473  branche.push_back(no_sq);
474  no_precedent=no_extr;
475  no=no_suivant;
476  while(no->get_lien_segment()->get_nb()==2)
477  {
478  for(int k=0;k<no->get_lien_segment()->get_nb();k++)
479  {
480  seg=no->get_lien_segment()->get(k);
481  if(seg->get_noeud1()!=no) no_suivant=seg->get_noeud1();
482  else no_suivant=seg->get_noeud2();
483  if(no_suivant!=no_precedent)
484  {
485  no_sq=(SQ_NOEUD*)no_suivant;
486  branche.push_back(no_sq);
487  no_precedent=no;
488  no=no_suivant;
489  break;
490  }
491  }
492  }
493  bool enregistree=false;
494  for(int k=0;k<LstBranches.size();k++)
495  if(LstBranches[k]->get_branche().size()!=0)
496  if(((branche.front()==LstBranches[k]->get_branche().back())&&(branche.back()==LstBranches[k]->get_branche().front()))||
497  ((branche.front()==LstBranches[k]->get_branche().front())&&(branche.back()==LstBranches[k]->get_branche().back())))
498  enregistree=true;
499  if(enregistree==false)
500  {
501  if(branche.back()->get_nb_reference()==1)
502  {
503  double dist_min=std::numeric_limits<double>::max();
504  int kk=0;
505  for(int k=0;k<LstBranches.size();k++)
506  if(LstBranches[k]->get_nb_sections()!=0)
507  {
508  double C[3];
509  std::vector<MG_NOEUD*> section=LstBranches[k]->get_section(0);
510  centre_contour(&section,C);
511  OT_VECTEUR_3D V(C,branche.back()->get_coord());
512  if(dist_min>V.get_longueur())
513  {
514  dist_min=V.get_longueur();
515  kk=k;;
516  }
517  }
518  LstBranches[kk]->change_branche(branche);
519  }
520  else
521  {
522  SQ_BRANCHE* bran=new SQ_BRANCHE(branche);
523  LstBranches.push_back(bran);
524  }
525  }
526  branche.clear();
527  }
528  }
529 
530  //Calcul des normales
531  for(int i=0;i<LstBranches.size();i++)
532  if(LstBranches[i]->get_branche().size()>3)
534 }
535 
536 
537 
539 {
540  std::vector<SQ_NOEUD*> branche=Bran->get_branche();
541  for(int j=1;j<branche.size()-1;j++)
542  {
543  OT_VECTEUR_3D v1(branche[j-1]->get_coord(),branche[j]->get_coord());
544  OT_VECTEUR_3D v2(branche[j]->get_coord(),branche[j+1]->get_coord());
545  OT_VECTEUR_3D n=v1+v2;
546  n.norme();
547  branche[j]->change_normal_section(n);
548  }
549 }
550 
551 
552 
553 void REC_SQUELETTE_OPT::calcul_branches(MG_MAILLAGE* mai_peau,double param_dist,double angle_seuil,double lambda)
554 {
555  std::vector<std::pair<int,SQ_NOEUD*>> LstPosSections;
556  std::map<unsigned long,double> MapNoJonc;
557  std::map<unsigned long,double>::iterator ItMap;
558  std::vector<MG_NOEUD*> section;
559  std::vector<SQ_NOEUD*> branche;
560 
561  double eps=mai_peau->get_mg_geometrie()->get_valeur_precision();
562  for(int i=0;i<LstBranches.size();i++)
563  if(LstBranches[i]->get_branche().size()<4)
564  LstBranches[i]->change_validite(false);
565  else
566  {
567  SQ_NOEUD* no_sq=nullptr;
568  double Rmoy;
569 
570  //1) Calcul du rayon moyen de la section du milieu de chaque branche
571  branche=LstBranches[i]->get_branche();
572  no_sq=milieu_branche(&branche);
573 
576  calcul_section(&MapSeg,no_sq->get_coord(),no_sq->get_normal_section().get_xyz(),eps,&section);
577  Rmoy=rayon_moyen(&section,no_sq);
578  LstBranches[i]->change_rayon_max(Rmoy);
579  section.clear();
580 
581  //2) Détermination du rayon moyen le plus grand parmi les branches de chaque noeud de jonction
582  if((branche.front()->get_nb_reference()!=1)&&(MapNoJonc[branche.front()->get_id()]<Rmoy))
583  MapNoJonc[branche.front()->get_id()]=Rmoy;
584  if((branche.back()->get_nb_reference()!=1)&&(MapNoJonc[branche.back()->get_id()]<Rmoy))
585  MapNoJonc[branche.back()->get_id()]=Rmoy;
586  branche.clear();
587 
588  //3) Vérification de la validité de la branche pour le calcul des sections et les guides
589  if(LstBranches[i]->get_longueur()<2*Rmoy)
590  LstBranches[i]->change_validite(false);
591  else LstBranches[i]->change_validite(true);
592  }
593 
594  //*) Lissage des branches non-valides et ainsi que les branches attachées aux interfaces design/non-design
595  for(int i=0;i<LstBranches.size();i++)
596  if((!LstBranches[i]->get_validite())||
597  (LstBranches[i]->get_branche().front()->get_nb_reference()==1)||
598  (LstBranches[i]->get_branche().back()->get_nb_reference()==1))
599  {
600  lissage_branche(LstBranches[i],angle_seuil,lambda);
602  }
603 
604  //4) Détermination de la position de chaque section
605  for(int i=0;i<LstBranches.size();i++)
606  {
607  double dist1=0.;
608  double Rmoy1=0.;
609  double dist2=0.;
610  double Rmoy2=0.;
611  branche=LstBranches[i]->get_branche();
612 
613  if(branche.front()->get_nb_reference()!=1)
614  {
615  for(ItMap=MapNoJonc.begin();ItMap!=MapNoJonc.end();ItMap++)
616  if((*ItMap).first==branche.front()->get_id())
617  {
618  Rmoy1=(*ItMap).second;
619  break;
620  }
621  for(int j=0;j<branche.size()/2;j++)
622  if(j==branche.size()/2-1)
623  LstPosSections.push_back(std::make_pair(i,branche[j]));
624  else
625  {
626  OT_VECTEUR_3D V(branche[j]->get_coord(),branche[j+1]->get_coord());
627  dist1+=V.get_longueur();
628  if(dist1>param_dist*Rmoy1)
629  {
630  LstPosSections.push_back(std::make_pair(i,branche[j+1]));
631  break;
632  }
633  }
634  }
635 
636  if(branche.back()->get_nb_reference()!=1)
637  {
638  for(ItMap=MapNoJonc.begin();ItMap!=MapNoJonc.end();ItMap++)
639  if((*ItMap).first==branche.back()->get_id())
640  {
641  Rmoy2=(*ItMap).second;
642  break;
643  }
644  for(int j=branche.size()-1;j>branche.size()/2-1;j--)
645  if(j==branche.size()/2)
646  LstPosSections.push_back(std::make_pair(i,branche[j+branche.size()%2]));
647  else
648  {
649  OT_VECTEUR_3D V(branche[j-1]->get_coord(),branche[j]->get_coord());
650  dist2+=V.get_longueur();
651 
652  if(dist2>param_dist*Rmoy2)
653  {
654  LstPosSections.push_back(std::make_pair(i,branche[j-1]));
655  break;
656  }
657  }
658  }
659  branche.clear();
660  }
661 
662  //5) Calcul des sections aux positions déterminées dans l'étape précédente
663  double param_voisinage=6.;
664  for(int i=0;i<LstPosSections.size();i++)
665  {
667  GrilleSeg.rechercher(LstPosSections[i].second->get_x(),LstPosSections[i].second->get_y(),LstPosSections[i].second->get_z(),param_voisinage*LstBranches[LstPosSections[i].first]->get_rayon_max(),MapSeg);
668  calcul_section(&MapSeg,LstPosSections[i].second->get_coord(),LstPosSections[i].second->get_normal_section().get_xyz(),eps,&section);
669  LstBranches[LstPosSections[i].first]->ajouter_section(LstPosSections[i].second,section);
670  LstPosSections[i].second->change_origine(MAGIC::ORIGINE::SECTION);
671  double Rmax=rayon_max(&section,LstPosSections[i].second);
672  if(Rmax>LstBranches[LstPosSections[i].first]->get_rayon_max()) LstBranches[LstPosSections[i].first]->change_rayon_max(Rmax);
673  determine_dir_sec(LstPosSections[i].second,&section);
674  section.clear();
675  }
676 
677  //6) Définition de la branche guide
678  for(int i=0;i<LstBranches.size();i++)
679  {
680  std::vector<SQ_NOEUD*> Branche=LstBranches[i]->get_branche();
681  std::vector<SQ_NOEUD*> BranGuide;
682  int n=1;
683 
684  for(int j=0;j<Branche.size();j++)
685  {
686  if((Branche[j]->get_origine()==MAGIC::ORIGINE::SECTION)&&(n==-1))
687  {
688  BranGuide.push_back(Branche[j]);
689  break;
690  }
691  if((Branche[j]->get_origine()==MAGIC::ORIGINE::SECTION)&&(n==1))
692  {
693  BranGuide.push_back(Branche[j]);
694  n*=-1;
695  }
696  if((Branche[j]->get_origine()==MAGIC::ORIGINE::SQUELETTE)&&(n==-1))
697  BranGuide.push_back(Branche[j]);
698  }
699  if(BranGuide.size()<4) LstBranches[i]->change_validite(false);
700  LstBranches[i]->change_branche_guide(BranGuide);
702 
703  }
704 }
705 
706 
707 
708 void REC_SQUELETTE_OPT::lissage_branche(SQ_BRANCHE* Bran,double angle_seuil,double lambda)
709 {
710  std::vector<SQ_NOEUD*> Branche=Bran->get_branche();
711  bool lisse=false;
712  while(!lisse)
713  {
714  lisse=true;
715  for(int i=1;i<Branche.size()-1;i++)
716  {
717  OT_VECTEUR_3D vec1(Branche[i]->get_coord(),Branche[i-1]->get_coord());
718  OT_VECTEUR_3D vec2(Branche[i]->get_coord(),Branche[i+1]->get_coord());
719  double angle=acos(vec1*vec2/(vec1.get_longueur()*vec2.get_longueur()))*180./M_PI;
720  if(angle<angle_seuil) //angle_seuil : c'est l'angle seuil entre deux segment squelettiques successifs
721  {
722  double x_i=Branche[i]->get_x(), x_i_prec=Branche[i-1]->get_x(), x_i_suiv=Branche[i+1]->get_x();
723  double y_i=Branche[i]->get_y(), y_i_prec=Branche[i-1]->get_y(), y_i_suiv=Branche[i+1]->get_y();
724  double z_i=Branche[i]->get_z(), z_i_prec=Branche[i-1]->get_z(), z_i_suiv=Branche[i+1]->get_z();
725 
726  double delta_x=0.5*(x_i_prec+x_i_suiv)-x_i;
727  double delta_y=0.5*(y_i_prec+y_i_suiv)-y_i;
728  double delta_z=0.5*(z_i_prec+z_i_suiv)-z_i;
729 
730  double x_i_prime=x_i+lambda*delta_x; //Lamda doit être compris entre 0 et 1
731  double y_i_prime=y_i+lambda*delta_y;
732  double z_i_prime=z_i+lambda*delta_z;
733 
734  Branche[i]->change_x(x_i_prime);
735  Branche[i]->change_y(y_i_prime);
736  Branche[i]->change_z(z_i_prime);
737 
738  lisse=false;
739  }
740  }
741  }
742 }
743 
744 
745 
746 void REC_SQUELETTE_OPT::calcul_sections2(MG_MAILLAGE* mai_peau,int NbSecs,int NbPtsInterp)
747 {
748  std::vector<MG_NOEUD*> section;
749  SQ_NOEUD* no_sq=nullptr;
750  double theta=2*M_PI/NbPtsInterp;
751 
752  for(int i=0;i<LstBranches.size();i++)
753  {
754  std::vector<SQ_NOEUD*> PosSecs=calcul_positions_sections(LstBranches[i],NbSecs);
755  for(int j=0;j<PosSecs.size();j++)
756  if(PosSecs[j]->get_nb_reference()!=1)
757  {
758  MG_NOEUD* no_prj=nullptr;
759  LISTE_MG_TRIANGLE::iterator it_lst_tri;
761  no_sq=PosSecs[j];
762  GrilleTri.rechercher(no_sq->get_x(),no_sq->get_y(),no_sq->get_z(),1.5*LstBranches[i]->get_rayon_max(),MapTri);
763  for(int k=0;k<NbPtsInterp;k++)
764  {
765  no_prj=proj_noeud_triangulation(no_sq,&MapTri);
766  if(no_prj!=no_sq) section.push_back(no_prj);
767  OT_VECTEUR_3D NouvDir=cos(theta)*no_sq->get_dir()+sin(theta)*(no_sq->get_normal_section()&no_sq->get_dir());
768  no_sq->change_dir(NouvDir);
769  }
770  LstBranches[i]->ajouter_section2(no_sq,section);
771  section.clear();
772  }
773  else
774  // Méthode(1): par intersection avec un plan
775  {
776  std::vector<MG_NOEUD*> section0=LstBranches[i]->get_section(0);
778  no_sq=PosSecs[j];
779  double eps=mai_peau->get_mg_geometrie()->get_valeur_precision();
780  OT_VECTEUR_3D Norm=no_sq->get_normal_section();
781  for(int k=0;k<NbPtsInterp;k++)
782  {
783  OT_VECTEUR_3D V=no_sq->get_normal_section()&no_sq->get_dir();
784  std::vector<MG_NOEUD*> LstNoInter;
785  double p_coef;
786  MG_NOEUD* no=nullptr;
787  for(int l=0;l<section0.size();l++)
788  {
789  OT_VECTEUR_3D P0(section0[l]->get_coord());
790  OT_VECTEUR_3D P1;
791  if(l<section0.size()-1) P1=OT_VECTEUR_3D(section0[l+1]->get_coord());
792  else P1=OT_VECTEUR_3D(section0[0]->get_coord());
793  if(algo.Intr3D_Segment_Plan(P0.get_xyz(),P1.get_xyz(),no_sq->get_coord(),V.get_xyz(),&p_coef,eps)==1)
794  {
795  OT_VECTEUR_3D P=P0+p_coef*(P1-P0);
796  no=new MG_NOEUD(nullptr,P.get_x(),P.get_y(),P.get_z(),MAGIC::ORIGINE::SQUELETTE);
797  LstNoInter.push_back(no);
798  }
799  }
800  if(section.size()==0)
801  section.push_back(LstNoInter[0]);
802  else
803  {
804  OT_VECTEUR_3D vec1(no_sq->get_coord(),section.back()->get_coord());
805  OT_VECTEUR_3D vec2(no_sq->get_coord(),LstNoInter[0]->get_coord());
806  OT_VECTEUR_3D vec12=vec1&vec2;
807  vec12.norme();
808  if((abs(Norm.get_x()-vec12.get_x())<eps)&&(abs(Norm.get_y()-vec12.get_y())<eps)&&(abs(Norm.get_z()-vec12.get_z())<eps))
809  section.push_back(LstNoInter[0]);
810  else section.push_back(LstNoInter[1]);
811  }
812  OT_VECTEUR_3D NouvDir=cos(theta)*no_sq->get_dir()+sin(theta)*(no_sq->get_normal_section()&no_sq->get_dir());
813  no_sq->change_dir(NouvDir);
814  }
815  LstBranches[i]->ajouter_section2(no_sq,section);
816  section.clear();
817  }
818  // Méthode(2): par selection de NbPtsInterp noeuds
819  /*{
820  no_sq=PosSecs[j];
821  std::vector<MG_NOEUD*> section0=LstBranches[i]->get_section(0);
822  int m=section0.size()/NbPtsInterp;
823  if(m==0) m=1;
824  int k=0;
825  int l=0;
826  do
827  {
828  section.push_back(section0[k]);
829  k+=m;
830  l++;
831  }
832  while((k<section0.size())&&(l<NbPtsInterp));
833  LstBranches[i]->ajouter_section2(no_sq,section);
834  section.clear();
835  }*/
836  }
837 }
838 
839 
840 
841 SQ_NOEUD* REC_SQUELETTE_OPT::milieu_branche(std::vector<SQ_NOEUD*>* branche)
842 {
843  SQ_NOEUD* no_sq_milieu=nullptr;
844  double min=std::numeric_limits<double>::max();
845 
846  for(int i=1;i<branche->size()-1;i++)
847  {
848  double dist1=0.;
849  double dist2=0.;
850 
851  for(int j=0;j<i;j++)
852  {
853  OT_VECTEUR_3D V((*branche)[j]->get_coord(),(*branche)[j+1]->get_coord());
854  dist1+=V.get_longueur();
855  }
856  for(int j=i;j<branche->size()-1;j++)
857  {
858  OT_VECTEUR_3D V((*branche)[j]->get_coord(),(*branche)[j+1]->get_coord());
859  dist2+=V.get_longueur();
860  }
861  if(min>fabs(dist1-dist2))
862  {
863  min=fabs(dist1-dist2);
864  no_sq_milieu=(*branche)[i];
865  }
866  }
867  return no_sq_milieu;
868 }
869 
870 
871 
872 double REC_SQUELETTE_OPT::rayon_moyen(std::vector<MG_NOEUD*>* section, SQ_NOEUD* no_sq)
873 {
874  double Rmoy=0.;
875  for(int i=0;i<section->size();i++)
876  {
877  OT_VECTEUR_3D V(no_sq->get_coord(),(*section)[i]->get_coord());
878  Rmoy+=V.get_longueur();
879  }
880  Rmoy/=section->size();
881  return Rmoy;
882 }
883 
884 
885 
886 double REC_SQUELETTE_OPT::rayon_max(std::vector<MG_NOEUD*>* section, SQ_NOEUD* no_sq)
887 {
888  double Rmax=0.;
889  for(int i=0;i<section->size();i++)
890  {
891  OT_VECTEUR_3D V(no_sq->get_coord(),(*section)[i]->get_coord());
892  if(Rmax<V.get_longueur()) Rmax=V.get_longueur();
893  }
894  return Rmax;
895 }
896 
897 
898 
899 void REC_SQUELETTE_OPT::calcul_section(TPL_MAP_ENTITE<MG_SEGMENT*>* MapSeg,double O[3],double V[3],double eps,std::vector<MG_NOEUD*>* section)
900 {
901  MG_SEGMENT* seg=nullptr;
902  LISTE_MG_SEGMENT::iterator ItLstSeg;
903  std::vector<std::pair<MG_NOEUD*,std::pair<long unsigned int,long unsigned int>>> LstNo;
905 
906  //1) Détermination des points d'intersection des segments du maillage avec le plan considéré
907  for(seg=MapSeg->get_premier(ItLstSeg);seg!=nullptr;seg=MapSeg->get_suivant(ItLstSeg))
908  {
909  OT_VECTEUR_3D P0(seg->get_noeud1()->get_coord());
910  OT_VECTEUR_3D P1(seg->get_noeud2()->get_coord());
911  double p_coef;
912 
913  if(algo.Intr3D_Segment_Plan(P0.get_xyz(),P1.get_xyz(),O,V,&p_coef,eps)==1)
914  {
915  OT_VECTEUR_3D P=P0+p_coef*(P1-P0);
916  MG_NOEUD* no=new MG_NOEUD(nullptr,P.get_x(),P.get_y(),P.get_z(),MAGIC::ORIGINE::TRIANGULATION);
917  LstNo.push_back(std::make_pair(no,std::make_pair(seg->get_lien_triangle()->get(0)->get_id(),seg->get_lien_triangle()->get(1)->get_id())));
918  }
919  //if(algo.Intr3D_Segment_Plan(P0.get_xyz(),P1.get_xyz(),O,V,&p_coef,eps)==2)
920  }
921 
922  //2) Recherche du noeud d'intersection le plus proche au centre de la section
923  double Rmin=std::numeric_limits< double >::max();
924  int ii;
925 
926  for(int i=0;i<LstNo.size();i++)
927  {
928  OT_VECTEUR_3D d(O,LstNo[i].first->get_coord());
929  if(d.get_longueur()<Rmin)
930  {
931  Rmin=d.get_longueur();
932  ii=i;
933  }
934  }
935 
936  //3) Formation du contour de la section
937  std::pair<MG_NOEUD*,std::pair<long unsigned int,long unsigned int>> No_debut;
938  std::pair<MG_NOEUD*,std::pair<long unsigned int,long unsigned int>> No;
939  bool find;
940 
941  No_debut=LstNo[ii];
942  section->push_back(LstNo[ii].first);
943  LstNo[ii].first->change_origine(MAGIC::ORIGINE::SECTION);
944  No=LstNo[ii];
945  do
946  {
947  for(int i=0;i<LstNo.size();i++)
948  {
949  if((LstNo[i].first->get_origine()!=MAGIC::ORIGINE::SECTION)&&((No.second.first==LstNo[i].second.first)||(No.second.first==LstNo[i].second.second)||(No.second.second==LstNo[i].second.first)||(No.second.second==LstNo[i].second.second)))
950  {
951  section->push_back(LstNo[i].first);
952  LstNo[i].first->change_origine(MAGIC::ORIGINE::SECTION);
953  No=LstNo[i];
954  find=true;
955  break;
956  }
957  if(LstNo[i]==LstNo.back())
958  {
959  find=false;
960  break;
961  }
962  if(i==LstNo.size()-1)
963  {
964  find=false;
965  break;
966  }
967  }
968  }
969  while(find);
970 }
971 
972 
973 
974 std::vector<SQ_NOEUD*> REC_SQUELETTE_OPT::calcul_positions_sections(SQ_BRANCHE* Bran,int NbSecs)
975 {
976  std::vector<SQ_NOEUD*> PosSecs;
977  std::vector<SQ_NOEUD*> BranGuide=Bran->get_branche_guide();
978  PosSecs.push_back(BranGuide.front());
979  if(Bran->get_validite())
980  {
981 
982  if(NbSecs<3) PosSecs.push_back(BranGuide.back());
983  else
984  {
985  double Longueur=0.;
986  for(int i=0;i<BranGuide.size()-1;i++)
987  {
988  OT_VECTEUR_3D V(BranGuide[i]->get_coord(),BranGuide[i+1]->get_coord());
989  Longueur+=V.get_longueur();
990  }
991  int j=0;
992  for(int i=0;i<NbSecs-2;i++)
993  {
994  double dist=0.;
995  do
996  {
997  OT_VECTEUR_3D V(BranGuide[j]->get_coord(),BranGuide[j+1]->get_coord());
998  dist+=V.get_longueur();
999  j++;
1000  }
1001  while(dist<Longueur/(NbSecs-1));
1002  PosSecs.push_back(BranGuide[j]);
1003  }
1004  PosSecs.push_back(BranGuide.back());
1005  }
1006  }
1007  else PosSecs.push_back(BranGuide.back());
1008  return PosSecs;
1009 }
1010 
1011 
1012 
1014 {
1015  std::vector<MG_NOEUD*> section;
1016  for(int i=0;i<LstBranches.size();i++)
1017  //if(LstBranches[i]->get_branche().back()->get_nb_reference()==1)
1018  for(int j=0;j<LstBranches[i]->get_nb_sections();j++)
1019  {
1020  section=LstBranches[i]->get_section(j);
1021  for(int k=0;k<section.size();k++)
1022  mai_sq->ajouter_mg_noeud(section[k]);
1023  section.clear();
1024  }
1025 
1026  for(int i=0;i<LstBranches.size();i++)
1027  //if(LstBranches[i]->get_branche().back()->get_nb_reference()==1)
1028  for(int j=0;j<LstBranches[i]->get_nb_sections();j++)
1029  {
1030  section=LstBranches[i]->get_section(j);
1031  for(int k=0;k<section.size()-1;k++)
1032  {
1033  MG_SEGMENT* seg_sq=new MG_SEGMENT(nullptr,section[k],section[k+1],MAGIC::ORIGINE::SQUELETTE);
1034  mai_sq->ajouter_mg_segment(seg_sq);
1035  }
1036  MG_SEGMENT* seg_sq=new MG_SEGMENT(nullptr,section.front(),section.back(),MAGIC::ORIGINE::SQUELETTE);
1037  mai_sq->ajouter_mg_segment(seg_sq);
1038  }
1039 
1040 }
1041 
1042 
1043 
1045 {
1046  std::vector<MG_NOEUD*> section;
1047  for(int i=0;i<LstBranches.size();i++)
1048  if((LstBranches[i]->get_nb_sections2()>2)||((LstBranches[i]->get_branche().back()->get_nb_reference()==1)))
1049  for(int j=1;j<LstBranches[i]->get_nb_sections2();j++)
1050  {
1051  section=LstBranches[i]->get_section2(j);
1052  for(int k=0;k<section.size();k++)
1053  mai_sq->ajouter_mg_noeud(section[k]);
1054  section.clear();
1055  if((LstBranches[i]->get_branche().back()->get_nb_reference()!=1)&&(j==LstBranches[i]->get_nb_sections2()-2)) break;
1056  }
1057 
1058  for(int i=0;i<LstBranches.size();i++)
1059  if((LstBranches[i]->get_nb_sections2()>2)||((LstBranches[i]->get_branche().back()->get_nb_reference()==1)))
1060  for(int j=1;j<LstBranches[i]->get_nb_sections2();j++)
1061  {
1062  section=LstBranches[i]->get_section2(j);
1063  for(int k=0;k<section.size()-1;k++)
1064  {
1065  MG_SEGMENT* seg_sq=new MG_SEGMENT(nullptr,section[k],section[k+1],MAGIC::ORIGINE::SQUELETTE);
1066  mai_sq->ajouter_mg_segment(seg_sq);
1067  }
1068  MG_SEGMENT* seg_sq=new MG_SEGMENT(nullptr,section.front(),section.back(),MAGIC::ORIGINE::SQUELETTE);
1069  mai_sq->ajouter_mg_segment(seg_sq);
1070  if((LstBranches[i]->get_branche().back()->get_nb_reference()!=1)&&(j==LstBranches[i]->get_nb_sections2()-2)) break;
1071  }
1072 }
1073 
1074 
1075 
1077 {
1078  SQ_NOEUD* no_sq=nullptr;
1079  MG_NOEUD* no_prj=nullptr;
1080  MG_TRIANGLE* tri=nullptr;
1081  LISTE_MG_TRIANGLE::iterator it_lst_tri;
1082 
1083  for(int i=0;i<LstBranches.size();i++)
1084  {
1085  std::vector<SQ_NOEUD*> BranGuide=LstBranches[i]->get_branche_guide();
1086 
1087  for(int j=0;j<4;j++)
1088  {
1089  std::vector<MG_NOEUD*> Guide;
1090 
1091  //1) Calcul du guide
1092  for(int k=0;k<BranGuide.size();k++)
1093  {
1094  no_sq=BranGuide[k];
1096  GrilleTri.rechercher(no_sq->get_x(),no_sq->get_y(),no_sq->get_z(),1.1*LstBranches[i]->get_rayon_max(),MapTri);
1097  if(k==0)
1098  {
1099  no_prj=proj_noeud_triangulation(no_sq,&MapTri);
1100  if(no_prj!=no_sq) Guide.push_back(no_prj);
1102  no_sq->change_dir(no_sq->get_dir()&no_sq->get_normal_section());
1103  }
1104  else
1105  if(no_sq->get_nb_reference()!=1)
1106  {
1107  no_prj=proj_noeud_triangulation(no_sq,&MapTri);
1108  if(no_prj!=no_sq) Guide.push_back(no_prj);
1109  }
1110  }
1111 
1112  //2) Suppression de la partie du Guide qui traverse le domaine du non-design
1113  if(BranGuide.back()->get_nb_reference()==1)
1114  for(int k=0;k<Guide.size()-1;k++)
1115  for(tri=mai_nd->get_premier_triangle(it_lst_tri);tri!=nullptr;tri=mai_nd->get_suivant_triangle(it_lst_tri))
1116  if(inter_segment_triangle(tri->get_noeud1(),tri->get_noeud2(),tri->get_noeud3(),Guide[k],Guide[k+1]))
1117  {
1118  Guide.erase(Guide.begin()+k+1,Guide.end());
1119  break;
1120  }
1121 
1122  //3) Liaison du guide avec l'interface design/non-design
1123  if(BranGuide.back()->get_nb_reference()==1)
1124  {
1125  double eps=mai_peau->get_mg_geometrie()->get_valeur_precision();
1126  prolongation_guide(&Guide,i,eps);
1127  }
1128  LstBranches[i]->ajouter_guide(Guide);
1129  }
1130  }
1131 }
1132 
1133 
1134 
1135 void REC_SQUELETTE_OPT::determine_dir_sec(SQ_NOEUD* no_sq,std::vector<MG_NOEUD*>* section)
1136 {
1137  OT_VECTEUR_3D dir(0.,0.,0.);
1138  for(int i=0;i<section->size();i++)
1139  for(int j=0;j<section->size();j++)
1140  {
1141  OT_VECTEUR_3D V((*section)[i]->get_coord(),(*section)[j]->get_coord());
1142  if(dir.get_longueur()<V.get_longueur()) dir=V;
1143  }
1144  dir.norme();
1145  no_sq->change_dir(dir);
1146 }
1147 
1148 
1149 
1151 {
1152  MG_TRIANGLE* tri=nullptr;
1153  LISTE_MG_TRIANGLE::iterator ItLstTri;
1154  double t;
1155  double t_min=std::numeric_limits<double>::max();
1156  MG_NOEUD* no=nullptr;
1157 
1158  for(tri=MapTri->get_premier(ItLstTri);tri!=nullptr;tri=MapTri->get_suivant(ItLstTri))
1159  if((inter_droite_triangle(no_sq->get_coord(),no_sq->get_dir().get_xyz(),tri,&t)==1)&&(t>0.)&&(t<t_min)) t_min=t;
1160  if(t_min!=std::numeric_limits<double>::max())
1161  {
1162  double x=no_sq->get_x()+t_min*(no_sq->get_dir().get_x());
1163  double y=no_sq->get_y()+t_min*(no_sq->get_dir().get_y());
1164  double z=no_sq->get_z()+t_min*(no_sq->get_dir().get_z());
1165  no=new MG_NOEUD(nullptr,x,y,z,MAGIC::ORIGINE::SQUELETTE);
1166  return no;
1167  }
1168  else return no_sq;
1169 }
1170 
1171 
1172 
1174 {
1176  std::vector<SQ_NOEUD*> BranGuide=LstBranches[i]->get_branche_guide();
1177 
1178  for(int j=1;j<BranGuide.size();j++)
1179  {
1180  OT_VECTEUR_3D seg(BranGuide[j-1]->get_coord(),BranGuide[j]->get_coord());
1181  OT_VECTEUR_3D norm1=BranGuide[j-1]->get_dir()&seg;
1182  double u[3];
1183  algo.Intr3D_Plane_Plane(norm1.get_xyz(),BranGuide[j-1]->get_coord(),BranGuide[j]->get_normal_section().get_xyz(),BranGuide[j]->get_coord(),u);
1184  OT_VECTEUR_3D dir(u);
1185  dir=-dir;
1186  BranGuide[j]->change_dir(dir);
1187  }
1188 }
1189 
1190 
1191 
1193 {
1194  #define EPS_BASE_RELATIVE 1e-14
1195  // filtre sur numero
1196  int nb_commun=0;
1197  if((noeud4==noeud1)||(noeud4==noeud2)||(noeud4==noeud3)) nb_commun++;
1198  if((noeud5==noeud1)||(noeud5==noeud2)||(noeud5==noeud3)) nb_commun++;
1199  if(nb_commun==2) return(false);
1200 
1201  int inter=false;
1202  OT_VECTEUR_3D g1(noeud2->get_x()-noeud1->get_x(),noeud2->get_y()-noeud1->get_y(),noeud2->get_z()-noeud1->get_z());
1203  OT_VECTEUR_3D g2(noeud3->get_x()-noeud1->get_x(),noeud3->get_y()-noeud1->get_y(),noeud3->get_z()-noeud1->get_z());
1204  OT_VECTEUR_3D g3(noeud5->get_x()-noeud4->get_x(),noeud5->get_y()-noeud4->get_y(),noeud5->get_z()-noeud4->get_z());
1205  OT_MATRICE_3D systeme(g1,g2,g3);
1206  double det=systeme.get_determinant();
1207  double eps=0.333333333333*(g1.diff()+g2.diff()+g3.diff());
1208  eps=18.*eps*eps*eps*EPS_BASE_RELATIVE;
1209  if (OPERATEUR::egal(det,0.0,eps)==true)
1210  {
1211  OT_VECTEUR_3D g3b(noeud5->get_x()-noeud1->get_x(),noeud5->get_y()-noeud1->get_y(),noeud5->get_z()-noeud1->get_z());
1212  OT_MATRICE_3D systeme2(g1,g2,g3b);
1213  double det2=systeme2.get_determinant();
1214  double eps2=0.333333333333*(g1.diff()+g2.diff()+g3b.diff());
1215  eps2=18.*eps2*eps2*eps2*EPS_BASE_RELATIVE;
1216  if (OPERATEUR::egal(det2,0.0,eps)==true) // cas 2D
1217  {
1218  if (inter_segment_segment1(noeud1,noeud2,noeud4,noeud5)==true) return true;
1219  if (inter_segment_segment1(noeud1,noeud3,noeud4,noeud5)==true) return true;
1220  if (inter_segment_segment1(noeud2,noeud3,noeud4,noeud5)==true) return true;
1221  }
1222  else return false;
1223  }
1224  else
1225  {
1226  if ((noeud4==noeud1)||(noeud4==noeud2)||(noeud4==noeud3)) return false;
1227  if ((noeud5==noeud1)||(noeud5==noeud2)||(noeud5==noeud3)) return false;
1228  double x,y,z;
1229  x=1.0/det*(g2.get_y()*g3.get_z()-g2.get_z()*g3.get_y());
1230  y=1.0/det*(g3.get_x()*g2.get_z()-g2.get_x()*g3.get_z());
1231  z=1.0/det*(g2.get_x()*g3.get_y()-g2.get_y()*g3.get_x());
1232  OT_VECTEUR_3D g1b(x,y,z);
1233  x=1.0/det*(g3.get_y()*g1.get_z()-g1.get_y()*g3.get_z());
1234  y=1.0/det*(g1.get_x()*g3.get_z()-g3.get_x()*g1.get_z());
1235  z=1.0/det*(g3.get_x()*g1.get_y()-g1.get_x()*g3.get_y());
1236  OT_VECTEUR_3D g2b(x,y,z);
1237  x=1.0/det*(g1.get_y()*g2.get_z()-g1.get_z()*g2.get_y());
1238  y=1.0/det*(g2.get_x()*g1.get_z()-g1.get_x()*g2.get_z());
1239  z=1.0/det*(g1.get_x()*g2.get_y()-g1.get_y()*g2.get_x());
1240  OT_VECTEUR_3D g3b(x,y,z);
1241  OT_VECTEUR_3D n1n4(noeud4->get_x()-noeud1->get_x(),noeud4->get_y()-noeud1->get_y(),noeud4->get_z()-noeud1->get_z());
1242  double alpha1=n1n4*g1b;
1243  double alpha2=n1n4*g2b;
1244  double alpha3=-(n1n4*g3b);
1245  double alpha4=1-alpha1-alpha2;
1246  double eps=0.25*(g1.diff()+g2.diff()+g3.diff()+n1n4.diff());
1247  eps=EPS_BASE_RELATIVE*(eps+1./eps);
1248  if((alpha1>-eps)&&(alpha1<1.+eps))
1249  if((alpha2>-eps)&&(alpha2<1.+eps))
1250  if((alpha3>-eps)&&(alpha3<1.+eps))
1251  if((alpha4>-eps) && (alpha4<1.+eps)) return true;
1252  return false;
1253  }
1254  return inter;
1255 }
1256 
1257 
1258 
1260 {
1261  double2 a0(A->get_coord()[0]);
1262  double2 a1(A->get_coord()[1]);
1263  double2 a2(A->get_coord()[2]);
1264  OT_VECTEUR_3DD OA(a0,a1,a2);
1265  double2 b0(B->get_coord()[0]);
1266  double2 b1(B->get_coord()[1]);
1267  double2 b2(B->get_coord()[2]);
1268  OT_VECTEUR_3DD OB(b0,b1,b2);
1269  double2 c0(C->get_coord()[0]);
1270  double2 c1(C->get_coord()[1]);
1271  double2 c2(C->get_coord()[2]);
1272  OT_VECTEUR_3DD OC(c0,c1,c2);
1273  double2 d0(D->get_coord()[0]);
1274  double2 d1(D->get_coord()[1]);
1275  double2 d2(D->get_coord()[2]);
1276  OT_VECTEUR_3DD OD(d0,d1,d2);
1277  OT_VECTEUR_3DD u(OA,OB);
1278  OT_VECTEUR_3DD v(OC,OD);
1279  OT_VECTEUR_3DD AC(OA,OC);
1280 
1281  OT_VECTEUR_3DD uv=u&v;
1282  double2 ZERO(0.);
1283  double2 UN(1.);
1284  double2 longueur=uv.get_longueur();
1285  if(uv.get_longueur()==ZERO)
1286  {
1287  OT_VECTEUR_3DD test=AC&u;
1288  if(test.get_longueur()==ZERO)
1289  {
1290  OT_VECTEUR_3DD AC(OA,OC);
1291  OT_VECTEUR_3DD AD(OA,OD);
1292  OT_VECTEUR_3DD BC(OB,OC);
1293  OT_VECTEUR_3DD BD(OB,OD);
1294  if(((AC*AD>ZERO)||(AC*AD==ZERO))&&((AC*u<ZERO)||(AC*u==ZERO))) return 0;
1295  else if(((BC*BD>ZERO)||(BC*BD==ZERO))&&((BC*u>ZERO)||(BC*u==ZERO))) return 0;
1296  else return 1;
1297  }
1298  else return 0;
1299  }
1300  else
1301  {
1302  OT_VECTEUR_3DD P2=v&uv;
1303  double2 a2=P2.get_x();
1304  double2 b2=P2.get_y();
1305  double2 c2=P2.get_z();
1306  double2 d2=ZERO-a2*C->get_coord()[0]-b2*C->get_coord()[1]-c2*C->get_coord()[2];
1307  double2 t1=ZERO-a2*A->get_coord()[0]-b2*A->get_coord()[1]-c2*A->get_coord()[2]-d2;
1308  t1=t1/(a2*u.get_x()+b2*u.get_y()+c2*u.get_z());
1309  OT_VECTEUR_3DD H=OA+t1*u;
1310 
1311  OT_VECTEUR_3DD P1=u&uv;
1312  double2 a1=P1.get_x();
1313  double2 b1=P1.get_y();
1314  double2 c1=P1.get_z();
1315  double2 d1=ZERO-a1*A->get_coord()[0]-b1*A->get_coord()[1]-c1*A->get_coord()[2];
1316  double2 t2=ZERO-a1*C->get_coord()[0]-b1*C->get_coord()[1]-c1*C->get_coord()[2]-d1;
1317  t2=t2/(a1*v.get_x()+b1*v.get_y()+c1*v.get_z());
1318  OT_VECTEUR_3DD H2=OC+t2*v;
1319  OT_VECTEUR_3DD PPC2(H,H2);
1320  if(PPC2.get_longueur()==ZERO)
1321  {
1322  if((t1>ZERO)&&(t1<UN)&&(t2>ZERO)&&(t2<UN)) return 1;
1323  else return 0;
1324  }
1325  else
1326  return 0;
1327  }
1328  return 0;
1329 }
1330 
1331 
1332 
1333 void REC_SQUELETTE_OPT::prolongation_guide(std::vector<MG_NOEUD*>* guide,int num_bran,double eps)
1334 {
1335  std::vector<SQ_NOEUD*> branche=LstBranches[num_bran]->get_branche();
1336  OT_VECTEUR_3D V=branche.back()->get_normal_section()&branche.back()->get_dir();
1337  std::vector<MG_NOEUD*> section=LstBranches[num_bran]->get_section(0);
1338  std::vector<MG_NOEUD*> LstNoInter;
1340  double p_coef;
1341  MG_NOEUD* no=nullptr;
1342  for(int k=0;k<section.size()-1;k++)
1343  {
1344  OT_VECTEUR_3D P0(section[k]->get_coord());
1345  OT_VECTEUR_3D P1(section[k+1]->get_coord());
1346  if(algo.Intr3D_Segment_Plan(P0.get_xyz(),P1.get_xyz(),branche.back()->get_coord(),V.get_xyz(),&p_coef,eps)==1)
1347  {
1348  OT_VECTEUR_3D P=P0+p_coef*(P1-P0);
1349  no=new MG_NOEUD(nullptr,P.get_x(),P.get_y(),P.get_z(),MAGIC::ORIGINE::SQUELETTE);
1350  LstNoInter.push_back(no);
1351  }
1352  }
1353 
1354  double Lmin=std::numeric_limits<double>::max();
1355  for(int k=0;k<LstNoInter.size();k++)
1356  {
1357  OT_VECTEUR_3D L(guide->back()->get_coord(),LstNoInter[k]->get_coord());
1358  if(L.get_longueur()<Lmin)
1359  {
1360  Lmin=L.get_longueur();
1361  no=LstNoInter[k];
1362  }
1363  }
1364  guide->push_back(no);
1365 }
1366 
1367 
1368 
1370 {
1371  std::vector<MG_NOEUD*> guide;
1372  for(int i=0;i<LstBranches.size();i++)
1373  for(int j=0;j<LstBranches[i]->get_nb_guides();j++)
1374  {
1375  guide=LstBranches[i]->get_guide(j);
1376  for(int k=0;k<guide.size();k++)
1377  mai_sq->ajouter_mg_noeud(guide[k]);
1378  guide.clear();
1379  }
1380  for(int i=0;i<LstBranches.size();i++)
1381  for(int j=0;j<LstBranches[i]->get_nb_guides();j++)
1382  {
1383  guide=LstBranches[i]->get_guide(j);
1384  for(int k=0;k<guide.size()-1;k++)
1385  {
1386  MG_SEGMENT* seg_sq=new MG_SEGMENT(nullptr,guide[k],guide[k+1],MAGIC::ORIGINE::SQUELETTE);
1387  mai_sq->ajouter_mg_segment(seg_sq);
1388  }
1389  guide.clear();
1390  }
1391 }
1392 
1393 
1394 
1396 {
1397  MG_NOEUD* no=nullptr;
1398  std::vector<SQ_NOEUD*> LstNoJonc;
1399  LISTE_MG_NOEUD::iterator ItLstNo;
1400 
1401  //1) Détermination de la liste des noeuds jonction
1402  for(no=mai_sq->get_premier_noeud(ItLstNo);no!=nullptr;no=mai_sq->get_suivant_noeud(ItLstNo))
1403  if(no->get_nb_reference()>2) LstNoJonc.push_back((SQ_NOEUD*)no);
1404 
1405  //2) Recherche des branches attachées à chaque jonction
1406  SQ_NOEUD* no_jonc=nullptr;
1407  for(int i=0;i<LstNoJonc.size();i++)
1408  {
1409  no_jonc=LstNoJonc[i];
1410  SQ_JONCTION* jonc=new SQ_JONCTION();
1411  jonc->change_no_jonction(no_jonc);
1412  for(int j=0;j<LstBranches.size();j++)
1413  {
1414  std::vector<SQ_NOEUD*> branche;
1415  branche=LstBranches[j]->get_branche();
1416  if(branche.front()==no_jonc)
1417  {
1418  jonc->ajouter_branche(LstBranches[j]);
1419  LstBranches[j]->change_jonction1(jonc);
1420  }
1421  if(branche.back()==no_jonc)
1422  {
1423  jonc->ajouter_branche(LstBranches[j]);
1424  LstBranches[j]->change_jonction2(jonc);
1425  }
1426  }
1427  LstJonctions.push_back(jonc);
1428  }
1429 
1430  //3) Définition des interfaces
1431  for(int i=0;i<LstJonctions.size();i++)
1432  for(int j=0;j<LstJonctions[i]->get_nb_branches();j++)
1433  {
1434  SQ_INTERFACE* interface=new SQ_INTERFACE(LstJonctions[i],LstJonctions[i]->get_branche(j));
1435  SQ_NOEUD* no_central=nullptr;
1436  std::vector<SQ_NOEUD*> BranGuide=LstJonctions[i]->get_branche(j)->get_branche_guide();
1437  OT_VECTEUR_3D dist1(LstJonctions[i]->get_no_jonc()->get_coord(),BranGuide.front()->get_coord());
1438  OT_VECTEUR_3D dist2(LstJonctions[i]->get_no_jonc()->get_coord(),BranGuide.back()->get_coord());
1439  if(dist1.get_longueur()<dist2.get_longueur()) no_central=BranGuide.front();
1440  else no_central=BranGuide.back();
1441  interface->change_no_central(no_central);
1442  LstJonctions[i]->ajouter_interface(interface);
1443  }
1444 
1445  //4) Définition des raccords
1446  for(int i=0;i<LstJonctions.size();i++)
1447  for(int j=0;j<LstJonctions[i]->get_nb_interfaces();j++)
1448  for(int k=j+1;k<LstJonctions[i]->get_nb_interfaces();k++)
1449  LstJonctions[i]->ajouter_raccord(new SQ_RACCORD(LstJonctions[i],LstJonctions[i]->get_interface(j),LstJonctions[i]->get_interface(k)));
1450 }
1451 
1452 
1453 
1454 void REC_SQUELETTE_OPT::calcul_sections_jonc(MG_MAILLAGE* mai_peau,MG_MAILLAGE* mai_sq,int NbPtsInterp,int theta)
1455 {
1456  for(int i=0;i<LstJonctions.size();i++)
1457  {
1458  SQ_JONCTION* Jonc=LstJonctions[i];
1459  std::vector<MG_NOEUD*> section;
1460  MG_NOEUD* no_prj=nullptr;
1461 
1462  SQ_NOEUD* NoJonc=Jonc->get_no_jonc();
1463  double DistMax=0.;
1464  for(int j=0;j<Jonc->get_nb_interfaces();j++)
1465  {
1466  OT_VECTEUR_3D V(NoJonc->get_coord(),Jonc->get_interface(j)->get_no_central()->get_coord());
1467  double dist=V.get_longueur();
1468  if(dist>DistMax) DistMax=dist;
1469  }
1470 
1471  //1) Calcul des sections extrêmes
1472  for(int j=0;j<Jonc->get_nb_interfaces();j++)
1473  {
1474  SQ_INTERFACE* Interface=Jonc->get_interface(j);
1475  determine_dirs_interf(Interface,DistMax);
1476  SQ_NOEUD* no_sq=Interface->get_no_central();
1477  no_sq->change_dir(Interface->get_dir(0));
1478  LISTE_MG_TRIANGLE::iterator it_lst_tri;
1480  GrilleTri.rechercher(no_sq->get_x(),no_sq->get_y(),no_sq->get_z(),1.1*Jonc->get_branche(j)->get_rayon_max(),MapTri);
1481 
1482  double alpha=2*M_PI/((NbPtsInterp-1)*Interface->get_nb_branchements());
1483  for(int k=0;k<Interface->get_nb_branchements();k++)
1484  {
1485  for(int l=0;l<NbPtsInterp;l++)
1486  {
1487  no_prj=proj_noeud_triangulation(no_sq,&MapTri);
1488  if(no_prj!=no_sq) section.push_back(no_prj);
1489  if(l!=NbPtsInterp-1)
1490  {
1491  OT_VECTEUR_3D NouvDir=cos(alpha)*no_sq->get_dir()+sin(alpha)*(no_sq->get_normal_section()&no_sq->get_dir());
1492  no_sq->change_dir(NouvDir);
1493  }
1494  }
1495  Interface->ajouter_section(section);
1496  section.clear();
1497  }
1498  }
1499 
1500  //2) Calcul de la section intermédiare
1501  //a. Création d'un espace de voisinage
1503  GrilleTri.rechercher(NoJonc->get_x(),NoJonc->get_y(),NoJonc->get_z(),3.0*DistMax,MapTri);
1504 
1505  //b. Détermination du point centre de la jonction
1506  double Coord1[3]={0};
1507  for(int j=0;j<Jonc->get_nb_interfaces();j++)
1508  {
1509  Coord1[0]+=Jonc->get_interface(j)->get_no_central()->get_x();
1510  Coord1[1]+=Jonc->get_interface(j)->get_no_central()->get_y();
1511  Coord1[2]+=Jonc->get_interface(j)->get_no_central()->get_z();
1512  }
1513  Coord1[0]/=Jonc->get_nb_interfaces();
1514  Coord1[1]/=Jonc->get_nb_interfaces();
1515  Coord1[2]/=Jonc->get_nb_interfaces();
1516  //*. Ajustement
1517  Coord1[0]=(Coord1[0]+NoJonc->get_x())/2;
1518  Coord1[1]=(Coord1[1]+NoJonc->get_y())/2;
1519  Coord1[2]=(Coord1[2]+NoJonc->get_z())/2;
1520 
1521  SQ_NOEUD* no_ctr=new SQ_NOEUD(nullptr,Coord1[0],Coord1[1],Coord1[2],MAGIC::ORIGINE::TRIANGULATION);
1522  //*. Recentrage du point centre dans le cas d'une jonction de trois branches
1523  if(Jonc->get_nb_interfaces()==3)
1524  {
1527  OT_VECTEUR_3D N=V1&V2;
1528  N.norme();
1529  no_ctr->change_dir(N);
1530  MG_NOEUD* no_prj1=proj_noeud_triangulation(no_ctr,&MapTri);
1531  no_ctr->change_dir(-N);
1532  MG_NOEUD* no_prj2=proj_noeud_triangulation(no_ctr,&MapTri);
1533  no_ctr->change_x((no_prj1->get_x()+no_prj2->get_x())/2);
1534  no_ctr->change_y((no_prj1->get_y()+no_prj2->get_y())/2);
1535  no_ctr->change_z((no_prj1->get_z()+no_prj2->get_z())/2);
1536  }
1537 
1538  for(int j=0;j<Jonc->get_nb_raccords();j++)
1539  {
1540  SQ_RACCORD* Raccord=Jonc->get_raccord(j);
1541  //c. Calcul de la direction principale pour le raccord
1542  SQ_INTERFACE* interf1=Raccord->get_interface1();
1543  SQ_INTERFACE* interf2=Raccord->get_interface2();
1544  SQ_NOEUD* no_sq1=interf1->get_no_central();
1545  SQ_NOEUD* no_sq2=interf2->get_no_central();
1546  OT_VECTEUR_3D dir1;
1547  OT_VECTEUR_3D dir2;
1548  for(int k=0;k<interf1->get_nb_liens();k++)
1549  if(interf1->get_lien_interface(k)==interf2) dir1=OT_VECTEUR_3D(no_sq1->get_coord(),interf1->get_lien_projection(k));
1550  for(int k=0;k<interf2->get_nb_liens();k++)
1551  if(interf2->get_lien_interface(k)==interf1) dir2=OT_VECTEUR_3D(no_sq2->get_coord(),interf2->get_lien_projection(k));
1552  no_sq1->change_dir(dir1);
1553  no_sq2->change_dir(dir2);
1554  MG_NOEUD* no_prj1=proj_noeud_triangulation(no_sq1,&MapTri);
1555  MG_NOEUD* no_prj2=proj_noeud_triangulation(no_sq2,&MapTri);
1556  double Coord2[3];
1557  Coord2[0]=(no_prj1->get_x()+no_prj2->get_x())/2.;
1558  Coord2[1]=(no_prj1->get_y()+no_prj2->get_y())/2.;
1559  Coord2[2]=(no_prj1->get_z()+no_prj2->get_z())/2.;
1560 
1561  OT_VECTEUR_3D dir(Coord1,Coord2);
1562  dir.norme();
1563  no_ctr->change_dir(dir);
1564 
1565  //d. Sélection des sections extrêmes qui correspondent au raccord
1566  double dist_min1=std::numeric_limits<double>::max();
1567  int l;
1568  std::vector<MG_NOEUD*> SecInit;
1569  for(int k=0;k<interf1->get_nb_sections();k++)
1570  {
1571  section=interf1->get_section(k);
1572  OT_VECTEUR_3D V(Coord2,section[section.size()/2]->get_coord());
1573  if(V.get_longueur()<dist_min1)
1574  {
1575  dist_min1=V.get_longueur();
1576  l=k;
1577  }
1578  }
1579  SecInit=interf1->get_section(l);
1580  Raccord->set_indice1(l);
1581 
1582  double dist_min2=std::numeric_limits<double>::max();
1583  std::vector<MG_NOEUD*> SecFin;
1584  for(int k=0;k<interf2->get_nb_sections();k++)
1585  {
1586  section=interf2->get_section(k);
1587  OT_VECTEUR_3D V(Coord2,section[section.size()/2]->get_coord());
1588  if(V.get_longueur()<dist_min2)
1589  {
1590  dist_min2=V.get_longueur();
1591  l=k;
1592  }
1593  }
1594  SecFin=interf2->get_section(l);
1595  Raccord->set_indice2(l);
1596 
1597  //e. Calcul de la normale du noeud central
1598  OT_VECTEUR_3D V1(no_ctr->get_coord(),no_prj1->get_coord());
1599  OT_VECTEUR_3D V2(no_ctr->get_coord(),no_prj2->get_coord());
1600  OT_VECTEUR_3D VTangent=V1&V2;
1601  OT_VECTEUR_3D Normale=dir&VTangent;
1602  Normale.norme();
1603  no_ctr->change_normal_section(Normale);
1604 
1605  //f. Calcul de la première direction de projection
1606  OT_VECTEUR_3D PremDir=cos(-(theta*M_PI/180.)/2)*no_ctr->get_dir()+sin(-(theta*M_PI/180.)/2)*(no_ctr->get_normal_section()&no_ctr->get_dir());
1607  no_ctr->change_dir(PremDir);
1608 
1609  //g. Calcul des points d'interpolation de la section intermédiare
1610  double phi=(theta*M_PI/180.)/(NbPtsInterp-1);
1611  std::vector<MG_NOEUD*> SecInter;
1612  for(int k=0;k<NbPtsInterp;k++)
1613  {
1614  no_prj=proj_noeud_triangulation(no_ctr,&MapTri);
1615  if(no_prj!=no_ctr) SecInter.push_back(no_prj);
1616  if(k!=NbPtsInterp-1)
1617  {
1618  OT_VECTEUR_3D NouvDir=cos(phi)*no_ctr->get_dir()+sin(phi)*(no_ctr->get_normal_section()&no_ctr->get_dir());
1619  no_ctr->change_dir(NouvDir);
1620  }
1621  }
1622  Raccord->ajouter_section_intermediaire(SecInter);
1623  }
1624  }
1625 }
1626 
1627 
1628 
1630 {
1631  std::vector<MG_NOEUD*> section;
1632  for(int i=0;i<LstJonctions.size();i++)
1633  {
1634  for(int j=0;j<LstJonctions[i]->get_nb_interfaces();j++)
1635  {
1636  SQ_INTERFACE* interf=LstJonctions[i]->get_interface(j);
1637  for(int k=0;k<interf->get_nb_sections();k++)
1638  {
1639  section=interf->get_section(k);
1640  for(int l=0;l<section.size();l++)
1641  mai_sq->ajouter_mg_noeud(section[l]);
1642  }
1643  //directions
1644  /*for(int k=0;k<interf->get_nb_liens();k++)
1645  {
1646  double* P=interf->get_lien_projection(k);
1647  MG_NOEUD* no=new MG_NOEUD(nullptr,P[0],P[1],P[2],MAGIC::ORIGINE::TRIANGULATION);
1648  mai_sq->ajouter_mg_noeud(no);
1649  MG_SEGMENT* seg_sq=new MG_SEGMENT(nullptr,(MG_NOEUD*)interf->get_no_central(),no,MAGIC::ORIGINE::SQUELETTE);
1650  mai_sq->ajouter_mg_segment(seg_sq);
1651  }*/
1652  }
1653  //sections intermédiares
1654  for(int j=0;j<LstJonctions[i]->get_nb_raccords();j++)
1655  {
1656  section=LstJonctions[i]->get_raccord(j)->get_section_intermediaire();
1657  for(int k=0;k<section.size();k++)
1658  mai_sq->ajouter_mg_noeud(section[k]);
1659  }
1660  }
1661  for(int i=0;i<LstJonctions.size();i++)
1662  {
1663  for(int j=0;j<LstJonctions[i]->get_nb_interfaces();j++)
1664  {
1665  SQ_INTERFACE* interf=LstJonctions[i]->get_interface(j);
1666  for(int k=0;k<interf->get_nb_sections();k++)
1667  {
1668  section=interf->get_section(k);
1669  for(int l=0;l<section.size()-1;l++)
1670  {
1671  MG_SEGMENT* seg_sq=new MG_SEGMENT(nullptr,section[l],section[l+1],MAGIC::ORIGINE::SQUELETTE);
1672  mai_sq->ajouter_mg_segment(seg_sq);
1673  }
1674  //divisions de la section
1675  /*MG_SEGMENT* seg_sq=new MG_SEGMENT(nullptr,section.front(),section.back(),MAGIC::ORIGINE::SQUELETTE);
1676  mai_sq->ajouter_mg_segment(seg_sq);*/
1677  }
1678 
1679  //tangentes
1680  /*std::vector<MG_NOEUD*> Sec0=interf->get_section(0);
1681  std::vector<MG_NOEUD*> Sec1=interf->get_section(1);
1682  MG_SEGMENT* seg_sq1=new MG_SEGMENT(nullptr,Sec0[1],Sec1[Sec1.size()-2],MAGIC::ORIGINE::SQUELETTE);
1683  mai_sq->ajouter_mg_segment(seg_sq1);
1684  MG_SEGMENT* seg_sq2=new MG_SEGMENT(nullptr,Sec0[Sec0.size()-2],Sec1[1],MAGIC::ORIGINE::SQUELETTE);
1685  mai_sq->ajouter_mg_segment(seg_sq2);*/
1686  }
1687  //sections intermédiares
1688  for(int j=0;j<LstJonctions[i]->get_nb_raccords();j++)
1689  {
1690  section=LstJonctions[i]->get_raccord(j)->get_section_intermediaire();
1691  for(int k=0;k<section.size()-1;k++)
1692  {
1693  MG_SEGMENT* seg_sq=new MG_SEGMENT(nullptr,section[k],section[k+1],MAGIC::ORIGINE::SQUELETTE);
1694  mai_sq->ajouter_mg_segment(seg_sq);
1695  }
1696  }
1697  }
1698 }
1699 
1700 
1701 
1703 {
1704  std::vector<OT_VECTEUR_3D> LstProj;
1706  SQ_JONCTION* jonc=interf->get_jonction();
1707  SQ_NOEUD* NoJonc=jonc->get_no_jonc();
1708  SQ_NOEUD* no_sq=interf->get_no_central();
1709  OT_VECTEUR_3D Normale1(no_sq->get_coord(),NoJonc->get_coord());
1710  Normale1.norme();
1711 
1712  for(int k=0;k<jonc->get_nb_interfaces();k++)
1713  if(jonc->get_interface(k)!=interf)
1714  {
1715  //première projection
1716  double Proj1[3];
1717  algo.Proj3D_Point_Plan(Normale1.get_xyz(),NoJonc->get_coord(),jonc->get_interface(k)->get_no_central()->get_coord(),Proj1);
1718  OT_VECTEUR_3D Dir1(NoJonc->get_coord(),Proj1);
1719  Dir1.norme();
1720  Dir1*=DistMax;
1721  OT_VECTEUR_3D V1(NoJonc->get_coord());
1722  OT_VECTEUR_3D P1=V1+Dir1;
1723 
1724  //deuxième projection
1725  double Proj2[3];
1726  algo.Proj3D_Point_Plan(no_sq->get_normal_section().get_xyz(),no_sq->get_coord(),P1.get_xyz(),Proj2);
1727  OT_VECTEUR_3D Dir2(no_sq->get_coord(),Proj2);
1728  Dir2.norme();
1729  Dir2*=DistMax;
1730  LstProj.push_back(Dir2);
1731 
1732  //génération d'un lien
1733  OT_VECTEUR_3D V3(no_sq->get_coord());
1734  OT_VECTEUR_3D P3=V3+Dir2;
1735  double* PP=new double[3];
1736  PP[0]=P3.get_x();
1737  PP[1]=P3.get_y();
1738  PP[2]=P3.get_z();
1739  interf->ajouter_lien(PP,jonc->get_interface(k));
1740  }
1741  if(LstProj.size()==2)
1742  interf->ajouter_dir(LstProj[0]+LstProj[1]);
1743 }
1744 
1745 
1746 
1748 {
1749  MG_SEGMENT* seg=nullptr;
1751  MG_GESTIONNAIRE gest_verif;
1752 
1753  MG_MAILLAGE* seg_selec=new MG_MAILLAGE(NULL);
1754  gest_verif.ajouter_mg_maillage(seg_selec);
1755 
1756  for(seg=MapSeg->get_premier(ItMapSeg);seg!=NULL;seg=MapSeg->get_suivant(ItMapSeg))
1757  {
1758  MG_NOEUD* no1=new MG_NOEUD(NULL,seg->get_noeud1()->get_x(),seg->get_noeud1()->get_y(),seg->get_noeud1()->get_z(),MAGIC::ORIGINE::TRIANGULATION);
1759  MG_NOEUD* no2=new MG_NOEUD(NULL,seg->get_noeud2()->get_x(),seg->get_noeud2()->get_y(),seg->get_noeud2()->get_z(),MAGIC::ORIGINE::TRIANGULATION);
1760 
1761  seg_selec->ajouter_mg_noeud(no1);
1762  seg_selec->ajouter_mg_noeud(no2);
1763 
1764  MG_SEGMENT* segg=new MG_SEGMENT(NULL,no1,no2,MAGIC::ORIGINE::TRIANGULATION);
1765  seg_selec->ajouter_mg_segment(segg);
1766  }
1767  MG_EXPORT exp;
1768  gest_verif.enregistrer("voisinage_seg.magic");
1769  exp.gmsh(seg_selec,"voisinage_seg");
1770 }
1771 
1772 
1773 
1775 {
1776  MG_TRIANGLE* tri=nullptr;
1778  MG_GESTIONNAIRE gest_verif;
1779 
1780  MG_MAILLAGE* tri_selec=new MG_MAILLAGE(NULL);
1781  gest_verif.ajouter_mg_maillage(tri_selec);
1782 
1783  for(tri=MapTri->get_premier(ItMapTri);tri!=NULL;tri=MapTri->get_suivant(ItMapTri))
1784  {
1785  MG_NOEUD* no1=new MG_NOEUD(NULL,tri->get_noeud1()->get_x(),tri->get_noeud1()->get_y(),tri->get_noeud1()->get_z(),MAGIC::ORIGINE::TRIANGULATION);
1786  MG_NOEUD* no2=new MG_NOEUD(NULL,tri->get_noeud2()->get_x(),tri->get_noeud2()->get_y(),tri->get_noeud2()->get_z(),MAGIC::ORIGINE::TRIANGULATION);
1787  MG_NOEUD* no3=new MG_NOEUD(NULL,tri->get_noeud3()->get_x(),tri->get_noeud3()->get_y(),tri->get_noeud3()->get_z(),MAGIC::ORIGINE::TRIANGULATION);
1788 
1789  tri_selec->ajouter_mg_noeud(no1);
1790  tri_selec->ajouter_mg_noeud(no2);
1791  tri_selec->ajouter_mg_noeud(no3);
1792 
1793  MG_SEGMENT* seg1=new MG_SEGMENT(NULL,no1,no2,MAGIC::ORIGINE::TRIANGULATION);
1794  MG_SEGMENT* seg2=new MG_SEGMENT(NULL,no2,no3,MAGIC::ORIGINE::TRIANGULATION);
1795  MG_SEGMENT* seg3=new MG_SEGMENT(NULL,no3,no1,MAGIC::ORIGINE::TRIANGULATION);
1796 
1797  tri_selec->ajouter_mg_segment(seg1);
1798  tri_selec->ajouter_mg_segment(seg2);
1799  tri_selec->ajouter_mg_segment(seg3);
1800 
1801  MG_TRIANGLE* trii=new MG_TRIANGLE(NULL,no1,no2,no3,seg1,seg2,seg3,MAGIC::ORIGINE::TRIANGULATION);
1802  tri_selec->ajouter_mg_triangle(trii);
1803  }
1804  MG_EXPORT exp;
1805  gest_verif.enregistrer("voisinage_tri.magic");
1806  exp.gmsh(tri_selec,"voisinage_tri");
1807 }
1808 
1809 
1810 
1811 std::vector<SQ_BRANCHE*> REC_SQUELETTE_OPT::getLstBranches()
1812 {
1813  return LstBranches;
1814 }
1815 
1816 
1817 
1818 std::vector<SQ_JONCTION*> REC_SQUELETTE_OPT::getLstJonctions()
1819 {
1820  return LstJonctions;
1821 }
SQ_INTERFACE::ajouter_dir
void ajouter_dir(OT_VECTEUR_3D vec)
Definition: sq_interface.cpp:150
MG_GEOMETRIE::get_valeur_precision
double get_valeur_precision(void)
Definition: mg_geometrie.cpp:2642
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
REC_SQUELETTE_OPT::determine_dir_sec
void determine_dir_sec(SQ_NOEUD *no_sq, std::vector< MG_NOEUD * > *section)
Definition: rec_squelette_opt.cpp:1135
TPL_MAP_ENTITE::get_premier
virtual X get_premier(ITERATEUR &it)
Definition: tpl_map_entite.h:112
REC_SQUELETTE_OPT::import_squelette_cg
void import_squelette_cg(FILE *fichier_cg, MG_MAILLAGE *mai_sq)
Definition: rec_squelette_opt.cpp:38
SQ_INTERFACE::change_no_central
void change_no_central(SQ_NOEUD *NoCntrl)
Definition: sq_interface.cpp:143
MG_SEGMENT
Definition: mg_segment.h:38
OT_MATRICE_3D::get_determinant
double get_determinant()
Definition: ot_mathematique.cpp:735
SQ_INTERFACE::get_dir
OT_VECTEUR_3D get_dir(int i)
Definition: sq_interface.cpp:87
MG_VOLUME::get_nb_mg_coquille
virtual int get_nb_mg_coquille(void)
Definition: mg_volume.cpp:65
MG_MAILLAGE::get_premier_noeud
MG_NOEUD * get_premier_noeud(LISTE_MG_NOEUD::iterator &it)
Definition: mg_maillage.cpp:548
SQ_BRANCHE::ajouter_section
void ajouter_section(SQ_NOEUD *NoCentral, std::vector< MG_NOEUD * > Section)
Definition: sq_branche.cpp:207
rec_squelette_opt.h
SQ_NOEUD::get_normal_section
OT_VECTEUR_3D get_normal_section()
Definition: sq_noeud.cpp:57
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
SQ_BRANCHE::get_validite
bool get_validite()
Definition: sq_branche.cpp:144
TPL_MAP_ENTITE< MG_SEGMENT * >
BOITE_3D::get_xmin
double get_xmin(void)
Definition: ot_boite_3d.cpp:104
REC_SQUELETTE_OPT::creation_LstBranches
void creation_LstBranches(MG_MAILLAGE *mai_sq)
Definition: rec_squelette_opt.cpp:447
MG_SEGMENT::get_noeud2
virtual MG_NOEUD * get_noeud2(void)
Definition: mg_segment.cpp:113
MAGIC::ORIGINE::SECTION
@ SECTION
Definition: mg_definition.h:79
MG_NOEUD::get_z
virtual double get_z(void)
Definition: mg_noeud.cpp:87
SQ_JONCTION::get_no_jonc
SQ_NOEUD * get_no_jonc()
Definition: sq_jonction.cpp:46
MG_IDENTIFICATEUR::get_id
unsigned long get_id()
Definition: mg_identificateur.cpp:53
REC_SQUELETTE_OPT::affichage_guides
void affichage_guides(MG_MAILLAGE *mai_sq)
Definition: rec_squelette_opt.cpp:1369
SQ_RACCORD::set_indice1
void set_indice1(int ind1)
Definition: sq_raccord.cpp:114
SQ_JONCTION::get_branche
SQ_BRANCHE * get_branche(int i)
Definition: sq_jonction.cpp:53
REC_SQUELETTE_OPT::GrilleSeg
TPL_GRILLE< MG_SEGMENT * > GrilleSeg
Definition: rec_squelette_opt.h:81
TPL_GRILLE::inserer
virtual void inserer(A a)
Definition: tpl_grille.h:274
SQ_INTERFACE
Definition: sq_interface.h:27
MG_MAILLAGE::supprimer_mg_segmentid
int supprimer_mg_segmentid(unsigned long num)
Definition: mg_maillage.cpp:652
REC_SQUELETTE_OPT::centre_contour
void centre_contour(std::vector< MG_NOEUD * > *Contour, double C[3])
Definition: rec_squelette_opt.cpp:427
MG_COFACE::get_face
virtual MG_FACE * get_face(void)
Definition: mg_coface.cpp:58
double2::get_x
double get_x()
Definition: ot_doubleprecision.cpp:367
MAGIC::ORIGINE::SQUELETTE
@ SQUELETTE
Definition: mg_definition.h:79
REC_SQUELETTE_OPT::getLstBranches
std::vector< SQ_BRANCHE * > getLstBranches()
Definition: rec_squelette_opt.cpp:1811
REC_SQUELETTE_OPT::affichage_voisinage_seg
void affichage_voisinage_seg(TPL_MAP_ENTITE< MG_SEGMENT * > *MapSeg)
Definition: rec_squelette_opt.cpp:1747
REC_SQUELETTE_OPT::calcul_sections_jonc
void calcul_sections_jonc(MG_MAILLAGE *mai_peau, MG_MAILLAGE *mai_sq, int NbPtsInterp=7, int theta=60)
Definition: rec_squelette_opt.cpp:1454
OT_VECTEUR_3DD::get_longueur
virtual double2 get_longueur(void)
Definition: ot_mathematique.cpp:1173
OT_ALGORITHME_GEOMETRIQUE::Proj3D_Point_Plan
static void Proj3D_Point_Plan(double *norm, double *root, double *pnt, double *proj_pnt)
Definition: ot_algorithme_geometrique.cpp:309
REC_SQUELETTE_OPT::creation_espaces_voisinage
void creation_espaces_voisinage(MG_MAILLAGE *mai_peau)
Definition: rec_squelette_opt.cpp:358
SQ_RACCORD
Definition: sq_raccord.h:27
MG_TRIANGLE
Definition: mg_triangle.h:38
MG_VOLUME
Definition: mg_volume.h:33
MG_COQUILLE
Definition: mg_coquille.h:34
SQ_INTERFACE::ajouter_section
void ajouter_section(std::vector< MG_NOEUD * > Section)
Definition: sq_interface.cpp:157
MG_GESTIONNAIRE
Definition: mg_gestionnaire.h:57
OT_VECTEUR_3D::get_x
virtual double get_x(void) const
Definition: ot_mathematique.cpp:417
REC_SQUELETTE_OPT::calcul_guides
void calcul_guides(MG_MAILLAGE *mai_peau, MG_MAILLAGE *mai_nd)
Definition: rec_squelette_opt.cpp:1076
MG_NOEUD::change_z
virtual void change_z(double zz)
Definition: mg_noeud.cpp:128
MG_MAILLAGE::get_premier_segment
MG_SEGMENT * get_premier_segment(LISTE_MG_SEGMENT::iterator &)
Definition: mg_maillage.cpp:630
SQ_RACCORD::get_interface1
SQ_INTERFACE * get_interface1()
Definition: sq_raccord.cpp:58
REC_SQUELETTE_OPT::calcul_positions_sections
std::vector< SQ_NOEUD * > calcul_positions_sections(SQ_BRANCHE *Bran, int NbSecs)
Definition: rec_squelette_opt.cpp:974
SQ_NOEUD::change_dir
void change_dir(OT_VECTEUR_3D vec)
Definition: sq_noeud.cpp:79
SQ_RACCORD::set_indice2
void set_indice2(int ind2)
Definition: sq_raccord.cpp:121
SQ_NOEUD
Definition: sq_noeud.h:28
SQ_RACCORD::get_interface2
SQ_INTERFACE * get_interface2()
Definition: sq_raccord.cpp:65
V2
bool V2(MCBody *_mcBody, MG_ELEMENT_TOPOLOGIQUE *topo)
Definition: CAD4FE_MCBody.cpp:804
SQ_JONCTION::get_nb_interfaces
int get_nb_interfaces()
Definition: sq_jonction.cpp:74
MG_VOLUME::get_mg_coquille
virtual MG_COQUILLE * get_mg_coquille(int num)
Definition: mg_volume.cpp:70
MG_ELEMENT_TOPOLOGIQUE::get_lien_maillage
virtual TPL_SET< MG_ELEMENT_MAILLAGE * > * get_lien_maillage(void)
Definition: mg_element_topologique.cpp:62
REC_SQUELETTE_OPT::affichage_sections2
void affichage_sections2(MG_MAILLAGE *mai_sq)
Definition: rec_squelette_opt.cpp:1044
TPL_LISTE_ENTITE::est_dans_la_liste
virtual int est_dans_la_liste(X x)
Definition: tpl_liste_entite.h:82
MG_NOEUD::change_y
virtual void change_y(double yy)
Definition: mg_noeud.cpp:123
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
REC_SQUELETTE_OPT::GrilleTri
TPL_GRILLE< MG_TRIANGLE * > GrilleTri
Definition: rec_squelette_opt.h:80
SQ_BRANCHE
Definition: sq_branche.h:30
REC_SQUELETTE_OPT::supp_squelette_nondesign
void supp_squelette_nondesign(MG_MAILLAGE *mai_sq, MG_MAILLAGE *mai_nd)
Definition: rec_squelette_opt.cpp:66
double2
Definition: ot_doubleprecision.h:29
MG_GESTIONNAIRE::ajouter_mg_maillage
int ajouter_mg_maillage(MG_MAILLAGE *mgmai)
Definition: mg_gestionnaire.cpp:521
SQ_INTERFACE::get_lien_projection
double * get_lien_projection(int i)
Definition: sq_interface.cpp:129
OT_REFERENCE::get_nb_reference
int get_nb_reference(void)
Definition: ot_reference.cpp:50
SQ_JONCTION::get_nb_raccords
int get_nb_raccords()
Definition: sq_jonction.cpp:88
REC_SQUELETTE_OPT::inter_segment_triangle
int inter_segment_triangle(MG_NOEUD *noeud1, MG_NOEUD *noeud2, MG_NOEUD *noeud3, MG_NOEUD *noeud4, MG_NOEUD *noeud5)
Definition: rec_squelette_opt.cpp:1192
REC_SQUELETTE_OPT::calcul_branches
void calcul_branches(MG_MAILLAGE *mai_peau, double param_dist=1.3, double angle_seuil=178., double lambda=0.8)
Definition: rec_squelette_opt.cpp:553
REC_SQUELETTE_OPT::prolongation_guide
void prolongation_guide(std::vector< MG_NOEUD * > *guide, int num_bran, double eps)
Definition: rec_squelette_opt.cpp:1333
REC_SQUELETTE_OPT::calcul_sections2
void calcul_sections2(MG_MAILLAGE *mai_peau, int NbSecs, int NbPtsInterp)
Definition: rec_squelette_opt.cpp:746
REC_SQUELETTE_OPT::calcul_section
void calcul_section(TPL_MAP_ENTITE< MG_SEGMENT * > *MapSeg, double O[3], double V[3], double eps, std::vector< MG_NOEUD * > *section)
Definition: rec_squelette_opt.cpp:899
REC_SQUELETTE_OPT::getLstJonctions
std::vector< SQ_JONCTION * > getLstJonctions()
Definition: rec_squelette_opt.cpp:1818
REC_SQUELETTE_OPT::point_appartient_volume
int point_appartient_volume(double *xyz, TPL_LISTE_ENTITE< MG_TRIANGLE * > *lsttrifront, int numvol)
Definition: rec_squelette_opt.cpp:129
REC_SQUELETTE_OPT::inter_droite_triangle
int inter_droite_triangle(double *xyz, double *dir, MG_TRIANGLE *tri, double *t)
Definition: rec_squelette_opt.cpp:200
OT_VECTEUR_3DD::get_z
virtual double2 get_z(void) const
Definition: ot_mathematique.cpp:1199
REC_SQUELETTE_OPT::LstBranches
std::vector< SQ_BRANCHE * > LstBranches
Definition: rec_squelette_opt.h:82
MG_NOEUD::change_x
virtual void change_x(double xx)
Definition: mg_noeud.cpp:118
MG_MAILLAGE::get_premier_triangle
MG_TRIANGLE * get_premier_triangle(LISTE_MG_TRIANGLE::iterator &it)
Definition: mg_maillage.cpp:912
OT_VECTEUR_3DD::get_x
virtual double2 get_x(void) const
Definition: ot_mathematique.cpp:1183
OT_ALGORITHME_GEOMETRIQUE::Intr3D_Plane_Plane
static int Intr3D_Plane_Plane(double __N1[3], double __P1[3], double __N2[3], double __P2[3], double __D[3])
Definition: ot_algorithme_geometrique.cpp:145
SQ_JONCTION::get_raccord
SQ_RACCORD * get_raccord(int i)
Definition: sq_jonction.cpp:81
REC_SQUELETTE_OPT::calcul_normales
void calcul_normales(SQ_BRANCHE *Bran)
Definition: rec_squelette_opt.cpp:538
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
OT_VECTEUR_3DD
Definition: ot_mathematique.h:350
MG_SEGMENT::get_lien_triangle
TPL_LISTE_ENTITE< class MG_TRIANGLE * > * get_lien_triangle(void)
Definition: mg_segment.cpp:243
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_NOEUD::get_lien_segment
TPL_LISTE_ENTITE< class MG_SEGMENT * > * get_lien_segment(void)
Definition: mg_noeud.cpp:141
OPERATEUR::egal
static int egal(double a, double b, double eps)
Definition: ot_mathematique.cpp:1629
SQ_INTERFACE::get_no_central
SQ_NOEUD * get_no_central()
Definition: sq_interface.cpp:73
MG_EXPORT::gmsh
void gmsh(class MG_MAILLAGE *mai, std::string fichier)
Definition: mg_export.cpp:803
MG_NOEUD
Definition: mg_noeud.h:41
TPL_SET::get_nb
int get_nb(void)
Definition: tpl_set.h:78
SQ_NOEUD::change_normal_section
void change_normal_section(OT_VECTEUR_3D norm)
Definition: sq_noeud.cpp:71
SQ_INTERFACE::get_nb_sections
int get_nb_sections()
Definition: sq_interface.cpp:101
OT_MATRICE_3D
Definition: ot_mathematique.h:160
TPL_GRILLE::rechercher
virtual void rechercher(BOITE_3D bt, TPL_MAP_ENTITE< A > &liste_entite_trouve)
Definition: tpl_grille.h:202
REC_SQUELETTE_OPT::REC_SQUELETTE_OPT
REC_SQUELETTE_OPT()
Definition: rec_squelette_opt.cpp:26
OT_VECTEUR_3D::get_xyz
virtual double * get_xyz(void)
Definition: ot_mathematique.cpp:449
SQ_BRANCHE::get_branche
std::vector< SQ_NOEUD * > get_branche()
Definition: sq_branche.cpp:60
MG_MAILLAGE::get_suivant_segment
MG_SEGMENT * get_suivant_segment(LISTE_MG_SEGMENT::iterator &)
Definition: mg_maillage.cpp:638
V
void V(MCAA *mcaa)
Definition: CAD4FE_MCAA.cpp:1794
SQ_INTERFACE::get_jonction
SQ_JONCTION * get_jonction()
Definition: sq_interface.cpp:58
TPL_LISTE_ENTITE::ajouter
virtual void ajouter(X x)
Definition: tpl_liste_entite.h:38
REC_SQUELETTE_OPT::affichage_sections_jonc
void affichage_sections_jonc(MG_MAILLAGE *mai_sq)
Definition: rec_squelette_opt.cpp:1629
MG_NOEUD::get_coord
virtual double * get_coord(void)
Definition: mg_noeud.cpp:92
SQ_INTERFACE::get_section
std::vector< MG_NOEUD * > get_section(int i)
Definition: sq_interface.cpp:94
TPL_MAP_ENTITE::ITERATEUR
std::map< unsigned long, X, std::less< unsigned long > >::iterator ITERATEUR
Definition: tpl_map_entite.h:38
OT_ALGORITHME_GEOMETRIQUE
Definition: ot_algorithme_geometrique.h:32
REC_SQUELETTE_OPT::proj_noeud_triangulation
MG_NOEUD * proj_noeud_triangulation(SQ_NOEUD *no_sq, TPL_MAP_ENTITE< MG_TRIANGLE * > *MapTri)
Definition: rec_squelette_opt.cpp:1150
TPL_LISTE_ENTITE::get_nb
virtual int get_nb(void)
Definition: tpl_liste_entite.h:67
OT_VECTEUR_3D::norme
virtual void norme(void)
Definition: ot_mathematique.cpp:494
SQ_BRANCHE::get_branche_guide
std::vector< SQ_NOEUD * > get_branche_guide()
Definition: sq_branche.cpp:67
REC_SQUELETTE_OPT::inter_segment_segment1
int inter_segment_segment1(MG_NOEUD *A, MG_NOEUD *B, MG_NOEUD *C, MG_NOEUD *D)
Definition: rec_squelette_opt.cpp:1259
MG_TRIANGLE::get_noeud2
virtual MG_NOEUD * get_noeud2(void)
Definition: mg_triangle.cpp:131
TPL_LISTE_ENTITE::get
virtual X get(int num)
Definition: tpl_liste_entite.h:72
BOITE_3D::get_ymax
double get_ymax(void)
Definition: ot_boite_3d.cpp:119
OT_VECTEUR_3D::get_y
virtual double get_y(void) const
Definition: ot_mathematique.cpp:423
SQ_INTERFACE::get_nb_branchements
int get_nb_branchements()
Definition: sq_interface.cpp:80
MG_NOEUD::get_x
virtual double get_x(void)
Definition: mg_noeud.cpp:77
acos
double2 acos(double2 &val)
Definition: ot_doubleprecision.cpp:224
OT_VECTEUR_3D
Definition: ot_mathematique.h:94
REC_SQUELETTE_OPT::affichage_sections
void affichage_sections(MG_MAILLAGE *mai_sq)
Definition: rec_squelette_opt.cpp:1013
REC_SQUELETTE_OPT::liaison_squelette_interface_nondesign
void liaison_squelette_interface_nondesign(MG_MAILLAGE *mai_sq, MG_MAILLAGE *mai_peau)
Definition: rec_squelette_opt.cpp:258
TPL_SET::get
X get(int num)
Definition: tpl_set.h:84
MG_GEOMETRIE::get_nb_mg_volume
unsigned int get_nb_mg_volume(void)
Definition: mg_geometrie.cpp:1712
SQ_INTERFACE::ajouter_lien
void ajouter_lien(double *P, SQ_INTERFACE *Interface)
Definition: sq_interface.cpp:178
MG_TRIANGLE::get_noeud1
virtual MG_NOEUD * get_noeud1(void)
Definition: mg_triangle.cpp:126
BOITE_3D
Definition: ot_boite_3d.h:27
REC_SQUELETTE_OPT::determine_dir_guide
void determine_dir_guide(int i)
Definition: rec_squelette_opt.cpp:1173
REC_SQUELETTE_OPT::milieu_branche
SQ_NOEUD * milieu_branche(std::vector< SQ_NOEUD * > *branche)
Definition: rec_squelette_opt.cpp:841
REC_SQUELETTE_OPT::LstJonctions
std::vector< SQ_JONCTION * > LstJonctions
Definition: rec_squelette_opt.h:83
SQ_BRANCHE::get_rayon_max
double get_rayon_max()
Definition: sq_branche.cpp:81
SQ_JONCTION::get_interface
SQ_INTERFACE * get_interface(int i)
Definition: sq_jonction.cpp:67
REC_SQUELETTE_OPT::affichage_voisinage_tri
void affichage_voisinage_tri(TPL_MAP_ENTITE< MG_TRIANGLE * > *MapTri)
Definition: rec_squelette_opt.cpp:1774
OT_VECTEUR_3DD::get_y
virtual double2 get_y(void) const
Definition: ot_mathematique.cpp:1191
MG_MAILLAGE::get_mg_geometrie
MG_GEOMETRIE * get_mg_geometrie(void)
Definition: mg_maillage.cpp:410
TPL_GRILLE::get_boite
virtual BOITE_3D get_boite(void)
Definition: tpl_grille.h:333
SQ_INTERFACE::get_nb_liens
int get_nb_liens()
Definition: sq_interface.cpp:136
SQ_JONCTION
Definition: sq_jonction.h:30
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
MG_MAILLAGE::get_nb_mg_noeud
unsigned int get_nb_mg_noeud(void)
Definition: mg_maillage.cpp:476
OT_VECTEUR_3D::get_z
virtual double get_z(void) const
Definition: ot_mathematique.cpp:429
REC_SQUELETTE_OPT::creation_LstJonctions
void creation_LstJonctions(MG_MAILLAGE *mai_sq)
Definition: rec_squelette_opt.cpp:1395
SQ_INTERFACE::get_lien_interface
SQ_INTERFACE * get_lien_interface(int i)
Definition: sq_interface.cpp:122
OT_VECTEUR_3D::diff
virtual double diff(void)
Definition: ot_mathematique.cpp:656
MG_MAILLAGE::get_suivant_triangle
MG_TRIANGLE * get_suivant_triangle(LISTE_MG_TRIANGLE::iterator &it)
Definition: mg_maillage.cpp:920
OT_VECTEUR_3D::get_longueur
virtual double get_longueur(void) const
Definition: ot_mathematique.cpp:483
REC_SQUELETTE_OPT::cree_liste_frontiere
void cree_liste_frontiere(MG_MAILLAGE *mai, TPL_LISTE_ENTITE< MG_TRIANGLE * > *lsttrifront)
Definition: rec_squelette_opt.cpp:101
MG_MAILLAGE
Definition: mg_maillage.h:62
TPL_LISTE_ENTITE< MG_TRIANGLE * >
MG_COQUILLE::get_nb_mg_coface
virtual int get_nb_mg_coface(void)
Definition: mg_coquille.cpp:76
MG_COQUILLE::get_mg_coface
virtual MG_COFACE * get_mg_coface(int num)
Definition: mg_coquille.cpp:90
res
#define res(i, j)
MG_FACE
Definition: mg_face.h:34
BOITE_3D::change_grosseur
void change_grosseur(double f)
Definition: ot_boite_3d.cpp:176
EPS_BASE_RELATIVE
#define EPS_BASE_RELATIVE
MG_ELEMENT_MAILLAGE::get_origine
virtual int get_origine(void)
Definition: mg_element_maillage.cpp:91
MG_MAILLAGE::get_mg_triangleid
MG_TRIANGLE * get_mg_triangleid(unsigned long num)
Definition: mg_maillage.cpp:772
TPL_MAP_ENTITE::get_suivant
virtual X get_suivant(ITERATEUR &it)
Definition: tpl_map_entite.h:120
OT_ALGORITHME_GEOMETRIQUE::Intr3D_Segment_Plan
static int Intr3D_Segment_Plan(double P0[3], double P1[3], double O[3], double V[3], double *p_coef, double EPSILON=1E-8)
Definition: ot_algorithme_geometrique.cpp:321
MAGIC::ORIGINE::TRIANGULATION
@ TRIANGULATION
Definition: mg_definition.h:79
cos
double2 cos(double2 &val)
Definition: ot_doubleprecision.cpp:206
TPL_LISTE_ENTITE::supprimer
virtual void supprimer(X x)
Definition: tpl_liste_entite.h:42
REC_SQUELETTE_OPT::rayon_max
double rayon_max(std::vector< MG_NOEUD * > *section, SQ_NOEUD *no_sq)
Definition: rec_squelette_opt.cpp:886
TPL_GRILLE::initialiser
virtual void initialiser(double xmin, double ymin, double zmin, double xmax, double ymax, double zmax, int nb_pasx, int nb_pasy, int nb_pasz)
Definition: tpl_grille.h:142
REC_SQUELETTE_OPT::~REC_SQUELETTE_OPT
~REC_SQUELETTE_OPT()
Definition: rec_squelette_opt.cpp:32
P
#define P(i, j)
MG_MAILLAGE::get_suivant_noeud
MG_NOEUD * get_suivant_noeud(LISTE_MG_NOEUD::iterator &it)
Definition: mg_maillage.cpp:556
REC_SQUELETTE_OPT::determine_dirs_interf
void determine_dirs_interf(SQ_INTERFACE *interf, double DistMax)
Definition: rec_squelette_opt.cpp:1702
REC_SQUELETTE_OPT::lissage_branche
void lissage_branche(SQ_BRANCHE *Bran, double angle_seuil, double lambda)
Definition: rec_squelette_opt.cpp:708
SQ_JONCTION::change_no_jonction
void change_no_jonction(SQ_NOEUD *nojonction)
Definition: sq_jonction.cpp:116
MG_GEOMETRIE::get_mg_volume
MG_VOLUME * get_mg_volume(unsigned int num)
Definition: mg_geometrie.cpp:1683
REC_SQUELETTE_OPT::rayon_moyen
double rayon_moyen(std::vector< MG_NOEUD * > *section, SQ_NOEUD *no_sq)
Definition: rec_squelette_opt.cpp:872
SQ_NOEUD::get_dir
OT_VECTEUR_3D get_dir()
Definition: sq_noeud.cpp:64
REC_SQUELETTE_OPT::recherche_contour
void recherche_contour(std::vector< MG_NOEUD * > *Contour, TPL_LISTE_ENTITE< MG_NOEUD * > *LstNoInter)
Definition: rec_squelette_opt.cpp:398
SQ_JONCTION::ajouter_branche
void ajouter_branche(SQ_BRANCHE *branche)
Definition: sq_jonction.cpp:123
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
sin
double2 sin(double2 &val)
Definition: ot_doubleprecision.cpp:250
SQ_RACCORD::ajouter_section_intermediaire
void ajouter_section_intermediaire(std::vector< MG_NOEUD * > SecInter)
Definition: sq_raccord.cpp:128