MAGiC  V5.0
Mailleurs Automatiques de Géometries intégrés à la Cao
CAD4FE_mailleur2d_outil.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 //####// CAD4FE_mailleur2d_outil.cpp
15 //####//
16 //####//------------------------------------------------------------
17 //####//------------------------------------------------------------
18 //####// COPYRIGHT 2000-2024
19 //####// jeu 13 jun 2024 11:58:56 EDT
20 //####//------------------------------------------------------------
21 //####//------------------------------------------------------------
22 
23 #include <vector>
24 using namespace std;
25 #include "gestionversion.h"
26 #include <math.h>
27 #include "CAD4FE_mailleur2d.h"
28 #include "ot_mathematique.h"
29 #include "ot_boite_3d.h"
30 #include "ot_boite_2d.h"
31 #include "tpl_map_entite.h"
32 #include "CAD4FE_m3d_MCTriangle.h"
33 
35 #include "CAD4FE_MCNodePolyline.h"
39 #include "CAD4FE_PolySurface.h"
40 #include "CAD4FE_Geometric_Tools.h"
45 #include "tpl_set.h"
46 #include <fstream>
47 
48 
49 using namespace CAD4FE;
50 
51 
53 {
54 return noeud_est_dans_triangle(noeud,(MCNode*)triangle->get_noeud1(),(MCNode*)triangle->get_noeud2(),(MCNode*)triangle->get_noeud3());
55 }
56 
57 /*
58 int MAILLEUR2D::noeud_est_dans_triangle(MG_NOEUD* noeud,MG_NOEUD *noeud1,MG_NOEUD *noeud2,MG_NOEUD *noeud3)
59 {
60 double du=decalage->calcul_decalage_parametre_u(noeud1->get_u());
61 double dv=decalage->calcul_decalage_parametre_v(noeud1->get_v());
62 
63 double u1=decalage->decalage_parametre_u(noeud1->get_u(),du);
64 double v1=decalage->decalage_parametre_v(noeud1->get_v(),dv);
65 double u2=decalage->decalage_parametre_u(noeud2->get_u(),du);
66 double v2=decalage->decalage_parametre_v(noeud2->get_v(),dv);
67 double u3=decalage->decalage_parametre_u(noeud3->get_u(),du);
68 double v3=decalage->decalage_parametre_v(noeud3->get_v(),dv);
69 double u=decalage->decalage_parametre_u(noeud->get_u(),du);
70 double v=decalage->decalage_parametre_v(noeud->get_v(),dv);
71 double eps=0.0001;
72 double delta=(u2-u1)*(v3-v1)-(v2-v1)*(u3-u1);
73 double precision=std::max(fabs(u1),fabs(v1));
74 precision=std::max(precision,fabs(u2));
75 precision=std::max(precision,fabs(v2));
76 precision=std::max(precision,fabs(u3));
77 precision=std::max(precision,fabs(v3));
78 precision=std::max(precision,fabs(u));
79 precision=std::max(precision,fabs(v));
80 if (OPERATEUR::egal(delta,0.0,precision*eps)) return(0);
81 double xsi=1.0/delta*((v3-v1)*(u-u1)-(u3-u1)*(v-v1));
82 double eta=1.0/delta*((u2-u1)*(v-v1)-(v2-v1)*(u-u1));
83 if (!((eta > eps) && (xsi > eps) && ((eta+xsi) < 1.0-eps))) return(0);
84 return (1);
85 } */
86 
87 
88 int MAILLEUR2D::noeud_est_dans_triangle(MCNode* noeud,MCNode *noeud1,MCNode *noeud2,MCNode *noeud3)
89 {
90  // (1) la projection normale du noeud sur le triangle existe
91 
92  // the 3 triangle's vertices
93  OT_VECTEUR_3D TV0(noeud1->get_coord());
94  OT_VECTEUR_3D TV1(noeud2->get_coord());
95  OT_VECTEUR_3D TV2(noeud3->get_coord());
96 
97  int res_projectionNoeudTriangle = 0;
98  double pt_projectionNoeudTriangle[3];
99  double signedDist_projectionNoeudTriangle;
100  res_projectionNoeudTriangle = OT_ALGORITHME_GEOMETRIQUE::project_PointTriangle(noeud->get_coord(),TV0,TV1,TV2,pt_projectionNoeudTriangle,&signedDist_projectionNoeudTriangle);
101 
102  if (res_projectionNoeudTriangle == 0 // disjoint
103  )
104  return 0;
105 
106  OT_VECTEUR_3D TV0TV1=TV1-TV0;
107  OT_VECTEUR_3D TV1TV2=TV2-TV1;
108  OT_VECTEUR_3D TV2TV0=TV0-TV2;
109  double x = (TV0TV1&TV1TV2).get_longueur();
110  x /= (TV0TV1.get_longueur()+TV1TV2.get_longueur()+TV2TV0.get_longueur());
111 
112  if (fabs(signedDist_projectionNoeudTriangle) > x)
113  return 0;
114 
115  return 1;
116 }
117 
118 int MAILLEUR2D::insere_segment(MCFace *__mcFace,MCSegment **nv_segment,MCNode* noeud1,MCNode* noeud2,int type_validation, double __tolerance)
119 {
120 OT_VECTEUR_3D noeud1_xyz(noeud1->get_coord());
121 OT_VECTEUR_3D noeud2_xyz(noeud2->get_coord());
122 OT_VECTEUR_3D milieu_segment_xyz = .5*noeud1_xyz + .5*noeud2_xyz;
123 double longueur = (noeud2_xyz - noeud1_xyz).get_longueur();
124 
125 MCSegment * segment_candidat = new MCSegment(__mcFace,noeud1,noeud2,0);
126 /*BOITE_3D boite_candidat = segment_candidat->get_boite_3D();
127 {
128  double offset=.5*segment_candidat->get_longueur();
129  double xmin=boite_candidat.get_xmin()-offset;
130  double ymin=boite_candidat.get_ymin()-offset;
131  double zmin=boite_candidat.get_zmin()-offset;
132  double xmax=boite_candidat.get_xmax()+offset;
133  double ymax=boite_candidat.get_ymax()+offset;
134  double zmax=boite_candidat.get_zmax()+offset;
135  boite_candidat.reinit(xmin,ymin,zmin,xmax,ymax,zmax);
136 } */
137 
138 
139 if (type_validation==TOUS_SEGMENT )
140  {
141  TPL_MAP_ENTITE<MCSegment*> liste_trouvee;
143  grille_de_segment->rechercher(milieu_segment_xyz(0),milieu_segment_xyz(1),milieu_segment_xyz(2),longueur,liste_trouvee);
144  for (MCSegment* segment_trouve=liste_trouvee.get_premier(it_seg); segment_trouve; segment_trouve=liste_trouvee.get_suivant(it_seg))
145  {
146  if ( ((noeud1==segment_trouve->get_noeud1()) && (noeud2==segment_trouve->get_noeud2())) || ((noeud1==segment_trouve->get_noeud2()) && (noeud2==segment_trouve->get_noeud1())))
147  {
148  delete segment_candidat;
149  return 0;
150  }
151 
152  if ( (noeud1==segment_trouve->get_noeud1()&&noeud2!=segment_trouve->get_noeud2())
153  || (noeud1==segment_trouve->get_noeud2()&&noeud2!=segment_trouve->get_noeud1())
154  || (noeud2==segment_trouve->get_noeud2()&&noeud1!=segment_trouve->get_noeud1())
155  || (noeud2==segment_trouve->get_noeud1()&&noeud1!=segment_trouve->get_noeud2()) )
156  continue;
157 
158  /* BOITE_3D boite_trouve = segment_trouve->get_boite_3D();
159  if (boite_candidat.intersecte(boite_trouve) == 0)
160  continue;*/
161 
162  double uvIntersectionFace[2];
163  MG_FACE * intersectionFace;
164 
165  // des intersections : voir bugs et livre Maillages George&Frey page 226 la remarque 6.11
166  if ( Intersection_MCSegment_MCSegment_tolerance(segment_trouve, segment_candidat, uvIntersectionFace, &intersectionFace, __tolerance*segment_trouve->get_longueur()) )
167  {
168  delete segment_candidat;
169  return 0;
170  }
171 
172  }
173  }
174 if (type_validation==TOUS_FRONT)
175  {
176  TPL_MAP_ENTITE<MG_FRONT_2D*> liste_trouvee;
178  grille_de_front->rechercher(milieu_segment_xyz(0),milieu_segment_xyz(1),milieu_segment_xyz(2),longueur,liste_trouvee);
179  for (MG_FRONT_2D* ft=liste_trouvee.get_premier(it_ft);ft;ft=liste_trouvee.get_suivant(it_ft))
180  {
181  MCSegment* segment_trouve=ft->get_segment();
182  if ( ((noeud1==segment_trouve->get_noeud1()) && (noeud2==segment_trouve->get_noeud2())) || ((noeud1==segment_trouve->get_noeud2()) && (noeud2==segment_trouve->get_noeud1())))
183  {
184  delete segment_candidat;
185  return 0;
186  }
187 
188  if ( (noeud1==segment_trouve->get_noeud1()&&noeud2!=segment_trouve->get_noeud2())
189  || (noeud1==segment_trouve->get_noeud2()&&noeud2!=segment_trouve->get_noeud1())
190  || (noeud2==segment_trouve->get_noeud2()&&noeud1!=segment_trouve->get_noeud1())
191  || (noeud2==segment_trouve->get_noeud1()&&noeud1!=segment_trouve->get_noeud2()) )
192  continue;
193 
194  /* BOITE_3D boite_trouve = segment_trouve->get_boite_3D();
195  if (boite_candidat.intersecte(boite_trouve) == 0)
196  continue;*/
197 
198  double uvIntersectionFace[2];
199  MG_FACE * intersectionFace;
200  // des intersections : voir bugs et livre Maillages George&Frey page 226 la remarque 6.11
201  if ( Intersection_MCSegment_MCSegment_tolerance(segment_trouve, segment_candidat, uvIntersectionFace, &intersectionFace, __tolerance*segment_trouve->get_longueur()) )
202  {
203  delete segment_candidat;
204  return 0;
205  }
206 
207  }
208  }
209 
210 mg_maillage->ajouter_mg_segment(segment_candidat);
211 grille_de_segment->inserer(segment_candidat);
212 *nv_segment=segment_candidat;
213 return(1);
214 }
215 
216 
218 {
219 grille_de_segment->supprimer(__segment);
220 mg_maillage->supprimer_mg_segmentid(__segment->get_id());
221 }
222 
223 int MAILLEUR2D::genere_noeud(MCFace* __mcFace, MCNode *__interiorIsolatedNode, MG_FRONT_2D **front_rencontre,MCNode **noeud_solution)
224 {
225 MCNode * iiNode = __interiorIsolatedNode;
226 
227 double angle = M_PI * 44/180;
228 int nbRefFaces;
229 OT_VECTEUR_3D normale_face;
230 __mcFace->calcul_normale_unitaire(iiNode->GetRefFaceMapping(), normale_face, &nbRefFaces);
231 OT_MATRICE_3D planeFrame = GeometricTools::GetPlaneFrame(normale_face);
232 OT_VECTEUR_3D direction_placement = cos(angle)*planeFrame.get_vecteur1()+sin(angle)*planeFrame.get_vecteur2();
233 OT_VECTEUR_3D normale_plan_directeur = direction_placement & normale_face;
234 
235 double taille;
236 double density_tensor[9];
237 metrique->evaluer(iiNode->get_coord(), density_tensor);
238 taille = pow(density_tensor[0],-0.5);
239 double longueur_desiree=0.8660254037844386*taille;
240 
241 Intersection_Plane_PolySurface ot_trajectoire_placement(iiNode, normale_plan_directeur, __mcFace, NULL);
242 ot_trajectoire_placement.MakeOffset(iiNode, direction_placement, longueur_desiree);
243 MCNode * noeud_decale = ot_trajectoire_placement.GetEndPoint();
244 OT_VECTEUR_3D xdecale(noeud_decale->get_coord());
245 
246 TPL_MAP_ENTITE<MG_FRONT_2D*> liste_trouvee;
247 double longueur_recherche=1.1547*longueur_desiree;
248 OT_VECTEUR_3D normale_face_front=normale_face;
249 
250 grille_de_front->rechercher(xdecale.get_x(),xdecale.get_y(),xdecale.get_z(),longueur_recherche,liste_trouvee);
252 
253 std::multimap <double, MCNode *> map_noeud_trouve;
254 std::map <MCNode *, MG_FRONT_2D*> map_front_trouve;
255  for ( MG_FRONT_2D* front_courant=liste_trouvee.get_premier(it_liste_trouvee);
256  front_courant;
257  front_courant=liste_trouvee.get_suivant(it_liste_trouvee)
258  )
259  {
260 
261  MCNode* noeud_front1=(MCNode*)front_courant->get_noeud1();
262  MCNode* noeud_front2=front_courant->get_noeud2();
263  OT_VECTEUR_3D xnoeudfront1(noeud_front1->get_coord());
264  OT_VECTEUR_3D xnoeudfront2(noeud_front2->get_coord());
265 
266  double distanceEuclidMPf = OT_ALGORITHME_GEOMETRIQUE::VEC3_DISTANCE_VEC3(xnoeudfront1, iiNode->get_coord());
267  double distanceEuclidPcPf = OT_ALGORITHME_GEOMETRIQUE::VEC3_DISTANCE_VEC3(xnoeudfront1, xdecale);
268  if ( distanceEuclidPcPf <= 1.1547*longueur_desiree && distanceEuclidMPf <= 1.5*longueur_desiree)
269  if (map_front_trouve.find(noeud_front1) == map_front_trouve.end())
270  {
271  refresh();
272  map_noeud_trouve.insert(std::make_pair(distanceEuclidPcPf,noeud_front1));
273  map_front_trouve[noeud_front1]=front_courant;
274  }
275  }
276 
277 int nb_front_essaye=0;
278 for (std::multimap<double,MCNode*>::iterator itMCNode = map_noeud_trouve.begin();
279  itMCNode != map_noeud_trouve.end();
280  itMCNode++ )
281 {
282  double distance_reference = itMCNode->first;
283  MCNode * noeud = itMCNode->second;
284  MG_FRONT_2D * front_reference = map_front_trouve[noeud];
285 
286  if (distance_reference > longueur_desiree*1.1547) break;
287  nb_front_essaye++;
288 
289  double distanceEuclidMPf = OT_ALGORITHME_GEOMETRIQUE::VEC3_DISTANCE_VEC3(noeud->get_coord(), iiNode->get_coord());
290  double distanceEuclidPcPf = OT_ALGORITHME_GEOMETRIQUE::VEC3_DISTANCE_VEC3(noeud->get_coord(), noeud_decale->get_coord());
291 
292  if ( distanceEuclidPcPf > 1.1547*longueur_desiree || distanceEuclidMPf > 1.5*longueur_desiree)
293  continue;
294 
295  ShortestPathByClosestPointOnEdge operateur_dist_MPf(__mcFace,noeud,iiNode,distanceEuclidMPf);
296  double distanceMPf = operateur_dist_MPf.Find();
297  if ( distanceMPf > 1.5*longueur_desiree )
298  continue;
299 
300  ShortestPathByClosestPointOnEdge operateur_dist_PcPf(__mcFace,noeud,iiNode,distanceEuclidPcPf);
301  double distancePcPf = operateur_dist_PcPf.Find();
302  if ( distancePcPf > 1.1547*longueur_desiree )
303  continue;
304 
305  (*front_rencontre)=front_reference;
306  (*noeud_solution)=noeud;
307 
308  if (debug) // Begin Log
309  {
310  std::ostringstream out;
311  out << "genere_noeud: found front segment " << front_reference->get_segment()->get_id() << " and connected isolated interior node " << __interiorIsolatedNode->get_id() << " to node " << noeud->get_id();
312  WriteLog(out.str());
313  } // End log
314 
315  return FRONT_RENCONTRE;
316 }
317 
318 mg_maillage->ajouter_mg_noeud(noeud_decale);
319 if (debug) // Begin Log
320 {
321  std::ostringstream out;
322  out << "genere_noeud: Node " << noeud_decale->get_id() << " created from interior isolated node " << __interiorIsolatedNode->get_id();
323  WriteLog(out.str());
324 } // End log
325 noeud_decale->incrementer();
326 noeud_decale->Creator = MCNode::mailleur_2d;
327 (*noeud_solution)=noeud_decale;
328 (*front_rencontre)=NULL;
329 return NOEUD_CREE;
330 }
331 
332 int MAILLEUR2D::genere_noeud(MCFace* __mcFace,MG_FRONT_2D* front,MG_FRONT_2D **front_rencontre,MCNode **noeud_rencontre)
333 {
334 MCNode* noeud1=front->get_noeud1();
335 MCNode* noeud2=front->get_noeud2();
336 
337 MCNode * milieu_front=MCSegment_Middle(front->get_segment());
338 OT_VECTEUR_3D x1(noeud1->get_coord());
339 OT_VECTEUR_3D x2(noeud2->get_coord());
340 OT_VECTEUR_3D normale_plan_directeur = x2-x1;
341 OT_VECTEUR_3D normale_face(0,0,0);
342 int nbRefFaces;
343 __mcFace->calcul_normale_unitaire(milieu_front->GetRefFaceMapping(), normale_face, &nbRefFaces);
344 /*if (nbRefFaces == 0)
345 {
346  double minDist=1E307;
347  OT_VECTEUR_3D segMid=.5*(x1+x2);
348  double minT=1E300;
349  for (double t=0;t<=1;t+=.1)
350  {
351  delete milieu_front;
352  milieu_front = new MCNode;
353  front->get_segment()->evaluer_geo(t,milieu_front);
354  int nbRefFacesTmp = 0;
355  for (MCNode::FMapIterator itF = milieu_front->GetRefFaceMapping().begin();
356  itF != milieu_front->GetRefFaceMapping().end();
357  itF++)
358  {
359  MG_FACE * f = itF->first;
360  if (__mcFace->GetPolySurface()->Contains(f))
361  nbRefFacesTmp++;
362  }
363  if (nbRefFacesTmp == 0)
364  {
365  continue;
366  }
367  OT_VECTEUR_3D xTmp(milieu_front->get_coord());
368  double dist = (segMid-xTmp).get_longueur();
369  if (dist<minDist)
370  {
371  minT=t;
372  minDist=dist;
373  }
374  }
375  delete milieu_front;
376  if (minDist < 1E9)
377  {
378  front->get_segment()->evaluer_geo(minT,milieu_front);
379  }
380 } */
381 OT_VECTEUR_3D direction_placement=normale_face&normale_plan_directeur;
382 
383 double longueur_segment=front->get_segment()->get_longueur();
384 double taille;
385 double density_tensor[9];
386 metrique->evaluer(milieu_front->get_coord(), density_tensor);
387 taille = pow(density_tensor[0],-0.5);
388 double longueur_desiree=0.8660254037844386*(MAILLEUR2D::priorite_metrique*taille+longueur_segment*(1-MAILLEUR2D::priorite_metrique));
389 longueur_desiree = longueur_desiree/front->get_ifail();
390 
391 Intersection_Plane_PolySurface ot_trajectoire_placement(milieu_front,normale_plan_directeur,__mcFace,NULL);
392 ot_trajectoire_placement.MakeOffset(milieu_front, direction_placement, longueur_desiree);
393 MCNode * noeud_decale = ot_trajectoire_placement.GetEndPoint();
394 OT_VECTEUR_3D xdecale(noeud_decale->get_coord());
395 
396 TPL_MAP_ENTITE<MG_FRONT_2D*> liste_trouvee;
397 double longueur_recherche=1.1547*longueur_desiree;
398 
399 OT_VECTEUR_3D normale_face_front=normale_face;
400 
401 grille_de_front->rechercher(xdecale.get_x(),xdecale.get_y(),xdecale.get_z(),longueur_recherche,liste_trouvee);
403 
404 std::multimap <double, MCNode *> map_noeud_trouve;
405 std::map <MCNode *, MG_FRONT_2D*> map_front_trouve;
406 std::map <MCNode *, double> map_angle_front_trouve;
407  for ( MG_FRONT_2D* front_courant=liste_trouvee.get_premier(it_liste_trouvee);
408  front_courant;
409  front_courant=liste_trouvee.get_suivant(it_liste_trouvee)
410  )
411  {
412 
413  MCNode* noeud_front1=(MCNode*)front_courant->get_noeud1();
414  MCNode* noeud_front2=front_courant->get_noeud2();
415  OT_VECTEUR_3D xnoeudfront1(noeud_front1->get_coord());
416  OT_VECTEUR_3D xnoeudfront2(noeud_front2->get_coord());
417 
418  double distanceEuclidMPf = OT_ALGORITHME_GEOMETRIQUE::VEC3_DISTANCE_VEC3(xnoeudfront1, milieu_front->get_coord());
419  double distanceEuclidPcPf = OT_ALGORITHME_GEOMETRIQUE::VEC3_DISTANCE_VEC3(xnoeudfront1, xdecale);
420  if ( distanceEuclidPcPf <= 1.1547*longueur_desiree && distanceEuclidMPf <= 1.5*longueur_desiree)
421  if (noeud_front1->get_id()!=noeud1->get_id())
422  if (noeud_front1->get_id()!=noeud2->get_id())
423  if ( !(noeud_front1->get_id()==noeud2->get_id() && noeud_front2->get_id()==noeud1->get_id()) )
424  if (map_front_trouve.find(noeud_front1) != map_front_trouve.end())
425  {
426  refresh();
427  /*{int nbRefFaces;
428  __mcFace->calcul_normale_unitaire(noeud_front1->GetRefFaceMapping(), normale_face_front, &nbRefFaces);}*/
429  noeud_front1->NormalMCFace(__mcFace,normale_face_front);
430  //OT_VECTEUR_3D vecteur_baseu(u1-unoeudfront1,v1-vnoeudfront1,0.);
431  OT_VECTEUR_3D vecteur_baseu = x1 - xnoeudfront1;
432  //OT_VECTEUR_3D vecteur_front(unoeudfront2-unoeudfront1,vnoeudfront2-vnoeudfront1,0.);
433  OT_VECTEUR_3D vecteur_front = xnoeudfront2 - xnoeudfront1;
434  // OT_VECTEUR_3D vecteur_basev=w&vecteur_baseu;
435  OT_VECTEUR_3D vecteur_basev = normale_face_front & vecteur_baseu;
436  vecteur_baseu.norme();
437  vecteur_basev.norme();
438  vecteur_front.norme();
439  double cosangle=vecteur_baseu*vecteur_front;
440  double sinangle=vecteur_basev*vecteur_front;
441  sinangle=-sinangle;
442  if (cosangle>1.) cosangle=1.;
443  if (cosangle<-1.) cosangle=(-1.);
444  double angle=acos(cosangle);
445  if (sinangle<(-0.0001)) angle=(-angle);
446  if (angle<0.) angle=angle+2.*M_PI;
447  if (angle<map_angle_front_trouve[noeud_front1])
448  {
449  map_angle_front_trouve[noeud_front1]=angle;
450  map_front_trouve[noeud_front1]=front_courant;
451  }
452  }
453  else
454  {
455  refresh();
456  /*{int nbRefFaces;
457  __mcFace->calcul_normale_unitaire(noeud_front1->GetRefFaceMapping(), normale_face_front, &nbRefFaces);}*/
458  noeud_front1->NormalMCFace(__mcFace,normale_face_front);
459  // OT_VECTEUR_3D vecteur_baseu(u1-unoeudfront1,v1-vnoeudfront1,0.);
460  OT_VECTEUR_3D vecteur_baseu = x1 - xnoeudfront1;
461  // OT_VECTEUR_3D vecteur_front(unoeudfront2-unoeudfront1,vnoeudfront2-vnoeudfront1,0.);
462  OT_VECTEUR_3D vecteur_front = xnoeudfront2 - xnoeudfront1;
463  // OT_VECTEUR_3D vecteur_basev=w&vecteur_baseu;
464  OT_VECTEUR_3D vecteur_basev = normale_face_front & vecteur_baseu;
465  vecteur_baseu.norme();
466  vecteur_basev.norme();
467  vecteur_front.norme();
468  double cosangle=vecteur_baseu*vecteur_front;
469  double sinangle=vecteur_basev*vecteur_front;
470  sinangle=-sinangle;
471  if (cosangle>1.) cosangle=1.;
472  if (cosangle<-1.) cosangle=(-1.);
473  double angle=acos(cosangle);
474  if (sinangle<(-0.0001)) angle=(-angle);
475  if (angle<0.) angle=angle+2.*M_PI;
476  map_noeud_trouve.insert(std::make_pair(distanceEuclidMPf,noeud_front1));
477  map_front_trouve[noeud_front1]=front_courant;
478  map_angle_front_trouve[noeud_front1]=angle;
479  }
480  }
481 
482 
483 
484 
485 int nb_front_essaye=0;
486 for (std::multimap<double,MCNode*>::iterator itMCNode = map_noeud_trouve.begin();
487  itMCNode != map_noeud_trouve.end();
488  itMCNode++ )
489 {
490  double distance_reference = itMCNode->first;
491  MCNode * noeud = itMCNode->second;
492  MG_FRONT_2D * front_reference = map_front_trouve[noeud];
493 
494  if (distance_reference > 1.1547*longueur_desiree) break;
495  nb_front_essaye++;
496 
497  double distanceEuclidMPf = OT_ALGORITHME_GEOMETRIQUE::VEC3_DISTANCE_VEC3(noeud->get_coord(), milieu_front->get_coord());
498  double distanceEuclidPcPf = OT_ALGORITHME_GEOMETRIQUE::VEC3_DISTANCE_VEC3(noeud->get_coord(), noeud_decale->get_coord());
499 
500  if ( distanceEuclidPcPf > 1.1547*longueur_desiree || distanceEuclidMPf > 1.5*longueur_desiree)
501  continue;
502 
503  std::vector< MCNode * > shortestPathNodes;
504  std::vector< MG_ELEMENT_TOPOLOGIQUE * > shortestPathTopo;
505 
506  ShortestPathByClosestPointOnEdge operateur_dist_MPf(__mcFace,noeud,milieu_front,distanceEuclidMPf);
507  double distanceMPf = operateur_dist_MPf.Find(&shortestPathNodes, &shortestPathTopo);
508  if ( distanceMPf > 2 * distanceEuclidMPf )
509  continue;
510 
511  // verify that the shortest path M-Pf does not intersect an interior MC Edge
512  bool test_operateur_dist_MPf_Intersect_MCEdge = false;
513  {
514  for (int k=1; k+1<shortestPathNodes.size(); k++)
515  {
516  MCNode * mcNode_tmp = shortestPathNodes[k];
517  if (mcNode_tmp->get_lien_topologie()->get_dimension() == 1)
518  {
519  test_operateur_dist_MPf_Intersect_MCEdge = true;
520  break;
521  }
522  }
523  }
524  if (test_operateur_dist_MPf_Intersect_MCEdge)
525  continue;
526 
527  ShortestPathByClosestPointOnEdge operateur_dist_PcPf(__mcFace,noeud,noeud_decale,distanceEuclidPcPf);
528  double distancePcPf = operateur_dist_PcPf.Find();
529  if ( distancePcPf > 1.1547*longueur_desiree )
530  continue;
531 
532  if ( triangles_sont_dans_meme_sens( __mcFace, noeud1, noeud, noeud_decale, noeud2 ) == 0)
533  continue;
534 
535  {
536  MG_SEGMENT * segment1 = mg_maillage->get_mg_segment(noeud1->get_id(),noeud->get_id());
537  if ( segment1 && front_reference->get_segment() != segment1 && segment1->get_lien_triangle()->get_nb() == 2 )
538  continue;
539  MG_SEGMENT * segment2 = mg_maillage->get_mg_segment(noeud2->get_id(),noeud->get_id());
540  if ( segment2 && front_reference->get_segment() != segment2 && segment2->get_lien_triangle()->get_nb() == 2 )
541  continue;
542  }
543 
544  (*front_rencontre)=front_reference;
545  (*noeud_rencontre)=noeud;
546  if (debug) // Begin Log
547  {
548  std::ostringstream out;
549  out << "genere_noeud: found front [ " << front_reference->get_noeud1()->get_id() << " - " << front_reference->get_noeud2()->get_id() << " ] and from candidate front [ " << front->get_segment()->get_noeud1()->get_id() << " - " << front->get_segment()->get_noeud2()->get_id() << " ] " << " to segment [ " << front->get_segment()->get_noeud1()->get_id() << " - " << front->get_segment()->get_noeud2()->get_id() << " ] ";
550  WriteLog(out.str());
551  } // End log
552  return FRONT_RENCONTRE;
553 }
554 mg_maillage->ajouter_mg_noeud(noeud_decale);
555 noeud_decale->incrementer();
556 noeud_decale->Creator = MCNode::mailleur_2d;
557 if (debug) // Begin Log
558 {
559  std::ostringstream out;
560  out << "genere_noeud: created node " << noeud_decale->get_id() << " from candidate front [ " << front->get_noeud1()->get_id() << " - " << front->get_noeud2()->get_id() << " ] ";
561  WriteLog(out.str());
562 } // End log
563 (*noeud_rencontre)=noeud_decale;
564 (*front_rencontre)=NULL;
565 return NOEUD_CREE;
566 }
567 
568 /*
569 double MAILLEUR2D::calcule_longueur_segment_metrique(MG_FACE* mgface,MG_SEGMENT* mgsegment)
570 {
571 MG_NOEUD* noeud1=mgsegment->get_noeud1();
572 MG_NOEUD* noeud2=mgsegment->get_noeud2();
573 
574 double du=decalage->calcul_decalage_parametre_u(noeud1->get_u());
575 double dv=decalage->calcul_decalage_parametre_v(noeud1->get_v());
576 double u1=decalage->decalage_parametre_u(noeud1->get_u(),du);
577 double v1=decalage->decalage_parametre_v(noeud1->get_v(),dv);
578 double u2=decalage->decalage_parametre_u(noeud2->get_u(),du);
579 double v2=decalage->decalage_parametre_v(noeud2->get_v(),dv);
580 return calcule_distance_metrique(mgface,u1,v1,u2,v2,du,dv);
581 } */
582 
583 
584 double MAILLEUR2D::calcule_distance_metrique(MG_FACE* mgface,double u1,double v1,double u2,double v2,double du,double dv)
585 {
586 double longueur_calculee=0.;
587 double param_debut[2]={u1-du,v1-dv};
588 double E,F,G;
589 mgface->get_EFG(param_debut,E,F,G);
590 
591 double dt=0.03125;
592 double ti;
593 double tii=0;
594 
595 while (tii<1.)
596  {
597  refresh();
598  ti=tii;
599  tii=ti+dt;
600  if (tii>1.) tii=1.;
601  double t=0.7886751345*ti+0.2113248654*tii;
602  double u=u1+t*(u2-u1);
603  double v=v1+t*(v2-v1);
604  double ut=u2-u1;
605  double vt=v2-v1;
606  double param_integration1[2]={u-du,v-dv};
607  double tenseur_metrique[9];
608  double xyzdu[3];
609  double xyzdv[3];
610  if (creation_metrique) metrique->evaluer(param_integration1,tenseur_metrique);
611  else
612  {
613  double xyz[3];
614  mgface->evaluer(param_integration1,xyz);
615  metrique->evaluer(xyz,tenseur_metrique);
616  }
617  mgface->deriver(param_integration1,xyzdu,xyzdv);
618  double t3 = xyzdu[0]*ut+xyzdv[0]*vt;
619  double t7 = xyzdu[1]*ut+xyzdv[1]*vt;
620  double t11 = xyzdu[2]*ut+xyzdv[2]*vt;
621  double t13 = t3*tenseur_metrique[0]+t7*tenseur_metrique[3]+t11*tenseur_metrique[6];
622  double t18 = t3*tenseur_metrique[1]+t7*tenseur_metrique[4]+t11*tenseur_metrique[7];
623  double t23 = t3*tenseur_metrique[2]+t7*tenseur_metrique[5]+t11*tenseur_metrique[8];
624  double facteur = (t13*xyzdu[0]+t18*xyzdu[1]+t23*xyzdu[2])*ut+(t13*xyzdv[0]+t18*xyzdv[1]+t23*xyzdv[2])*vt;
625  longueur_calculee=longueur_calculee+0.5*(tii-ti)*sqrt(facteur);
626  t=0.7886751345*tii+0.2113248654*ti;
627  u=u1+t*(u2-u1);
628  v=v1+t*(v2-v1);
629  double param_integration2[2]={u-du,v-dv};
630  if (creation_metrique) metrique->evaluer(param_integration2,tenseur_metrique);
631  else
632  {
633  double xyz[3];
634  mgface->evaluer(param_integration2,xyz);
635  metrique->evaluer(xyz,tenseur_metrique);
636  }
637  mgface->deriver(param_integration2,xyzdu,xyzdv);
638  t3 = xyzdu[0]*ut+xyzdv[0]*vt;
639  t7 = xyzdu[1]*ut+xyzdv[1]*vt;
640  t11 = xyzdu[2]*ut+xyzdv[2]*vt;
641  t13 = t3*tenseur_metrique[0]+t7*tenseur_metrique[3]+t11*tenseur_metrique[6];
642  t18 = t3*tenseur_metrique[1]+t7*tenseur_metrique[4]+t11*tenseur_metrique[7];
643  t23 = t3*tenseur_metrique[2]+t7*tenseur_metrique[5]+t11*tenseur_metrique[8];
644  facteur = (t13*xyzdu[0]+t18*xyzdu[1]+t23*xyzdu[2])*ut+(t13*xyzdv[0]+t18*xyzdv[1]+t23*xyzdv[2])*vt;
645  longueur_calculee=longueur_calculee+0.5*(tii-ti)*sqrt(facteur);
646  }
647 return longueur_calculee;
648 }
649 
650 
652 {
653 int i=0;
654 MCSegment* mgsegment[3];
655 MCNode *mgnoeud[3]={mgnoeud1,mgnoeud2,mgnoeud3};
656 for (i=0;i<3;i++)
657 {
658  mgsegment[i]=(MCSegment*)mg_maillage->get_mg_segment(mgnoeud[i]->get_id(),mgnoeud[(i+1)%3]->get_id());
659  if (mgsegment[i]==NULL)
660  {
661  printf("Pb : le segment n'existe pas pour inserer le triangle!!!\n");
662  mgsegment[i] = new MCSegment(topo,mgnoeud[i],mgnoeud[(i+1)%3]);
663  mg_maillage->ajouter_mg_segment(mgsegment[i]);
664  }
665 }
666 M3D_MCTriangle* mtriangle=new M3D_MCTriangle(topo,mgnoeud1,mgnoeud2,mgnoeud3,mgsegment[0],mgsegment[1],mgsegment[2]);
667 mg_maillage->ajouter_mg_triangle(mtriangle);
668 _nbTriangles[topo]++;
669 double qual=OPERATEUR::qualite_triangle(mgnoeud1->get_coord(),mgnoeud2->get_coord(),mgnoeud3->get_coord());
670 mtriangle->change_qualite(qual);
671 std::pair<const double,M3D_MCTriangle*> tmp(mtriangle->get_qualite(),mtriangle);
672 lst_tri_qual.insert(tmp);
673 return mtriangle;
674 }
675 
676 
677 int MAILLEUR2D::triangles_sont_dans_meme_sens(MCFace* face,MCNode* noeud1,MCNode *noeud2,MCNode *noeud2bis,MCNode *noeud3)
678 {
679 double* xyz1=noeud1->get_coord();
680 double* xyz2=noeud2->get_coord();
681 double* xyz2bis=noeud2bis->get_coord();
682 double* xyz3=noeud3->get_coord();
683 OT_VECTEUR_3D n1n3(xyz1,xyz3);
684 OT_VECTEUR_3D n1n2(xyz1,xyz2);
685 OT_VECTEUR_3D n1n2bis(xyz1,xyz2bis);
686 
687 OT_VECTEUR_3D normal1=n1n3&n1n2;
688 OT_VECTEUR_3D normal1bis=n1n3&n1n2bis;
689 
690 if (normal1 * normal1bis < 0) return 0;
691 return 1;
692 }
693 
695 {
696 double* xyz1=noeud1->get_coord();
697 double* xyz2=noeud2->get_coord();
698 double* xyz3=noeud3->get_coord();
699 OT_VECTEUR_3D n1n3(xyz1,xyz3);
700 OT_VECTEUR_3D n1n2(xyz1,xyz2);
701 
702 OT_VECTEUR_3D normal1(0,0,0);
703 noeud1->NormalMCFace(face, normal1);
704 OT_VECTEUR_3D nmat=normal1&n1n3;
705 nmat.norme();
706 n1n2.norme();
707 if (nmat*n1n2<0) return 0;
708 return 1;
709 }
710 
711 int MAILLEUR2D::bouge_point(MCFace* __mcFace, MCNode *mg_noeud, double& crit, MCNode **__result)
712 {
713 if (mg_noeud->Creator != MCNode::mailleur_2d)
714  return 0;
715 
716  //double du=decalage->calcul_decalage_parametre_u(mg_noeud->get_u());
717 OT_VECTEUR_3D xyz1(mg_noeud->get_coord());
718 
719 OT_VECTEUR_3D xyzopt(0,0,0);
720 double qual_dep=1.;
721 int nb_tri=mg_noeud->get_lien_triangle()->get_nb();
722 for (int i=0;i<nb_tri;i++)
723 {
724  M3D_MCTriangle* tri=(M3D_MCTriangle*)mg_noeud->get_lien_triangle()->get(i);
725  qual_dep=std::min(qual_dep,tri->get_qualite());
726  MG_NOEUD* no1=tri->get_noeud1();
727  MG_NOEUD* no2=tri->get_noeud2();
728  MG_NOEUD* no3=tri->get_noeud3();
729  MG_NOEUD *noeud1=NULL,*noeud2=NULL;
730  if (no1==mg_noeud)
731  {
732  noeud1=no2;
733  noeud2=no3;
734  }
735  else if (no2==mg_noeud)
736  {
737  noeud1=no1;
738  noeud2=no3;
739  }
740  else if (no3==mg_noeud)
741  {
742  noeud1=no1;
743  noeud2=no2;
744  }
745  OT_VECTEUR_3D noeud1_xyz(noeud1->get_coord());
746  OT_VECTEUR_3D noeud2_xyz(noeud2->get_coord());
747  xyzopt += noeud1_xyz;
748  xyzopt += noeud2_xyz;
749  //double u2=noeud1->get_u()+du;
750  //double v2=noeud1->get_v()+dv;
751  //uopt=uopt+u2;
752  //vopt=vopt+v2;
753  //u2=noeud2->get_u()+du;
754  //v2=noeud2->get_v()+dv;
755  //uopt=uopt+u2;
756  //vopt=vopt+v2;
757  }
758 xyzopt /= 2*nb_tri;
759 
760 double ddeb=(xyzopt-xyz1).get_longueur();
761 double alpha=0.5;
762 double d=alpha*ddeb;
763 double qual=qual_dep;
764 double testu[8]={1.,-1.,0.,0.,0.707106781,-0.707106781,-0.707106781,0.707106781};
765 double testv[8]={0.,0.,1.,-1.,0.707106781,0.707106781,-0.707106781,-0.707106781};
766 MCNode *xi=mg_noeud;
767 MCNode *xii;
768 MCNode *x=NULL;
769 while (alpha>0.09)
770  {
771  double qualcoq=0.;
772  OT_VECTEUR_3D xyznormal;
773  int nbRefFaces;
774  __mcFace->calcul_normale_unitaire(xi->GetRefFaceMapping(),xyznormal,&nbRefFaces);
775  if (xyznormal.get_longueur() == 0) return 0;
776  OT_MATRICE_3D planeFrame=GeometricTools::GetPlaneFrame(xyznormal);
777  for (int nb_essai=0;nb_essai<8;nb_essai++)
778  {
779  //double uv[2];
780  OT_VECTEUR_3D uv(0,0,0);
781  //double xyz[3];
782  OT_VECTEUR_3D xyz(0,0,0);
783  //uv[0]=uu+d*testu[nb_essai]-du;
784  //uv[1]=vv+d*testv[nb_essai]-dv;
785  uv[0]=testu[nb_essai];
786  uv[1]=testv[nb_essai];
787  //int valide1=mgface->valide_parametre_u(uv[0]);
788  //int valide2=mgface->valide_parametre_v(uv[1]);
789  //if (!((valide1) && (valide2) )) break;
790  //mgface->evaluer(uv,xyz);
791  OT_VECTEUR_3D direction_placement=planeFrame*uv;
792  OT_VECTEUR_3D normale_plan_directeur=direction_placement&xyznormal;
793  double longueur_desiree=d;
794  Intersection_Plane_PolySurface ot_trajectoire_placement(xi,normale_plan_directeur,__mcFace,NULL);
795  ot_trajectoire_placement.MakeOffset(xi, direction_placement, longueur_desiree);
796  xii = ot_trajectoire_placement.GetEndPoint();
797  xyz = xii->get_coord();
798 
799  double qual1=1.;
800  for (int i=0;i<nb_tri;i++)
801  {
802  M3D_MCTriangle* tri=(M3D_MCTriangle*)mg_noeud->get_lien_triangle()->get(i);
803  MG_NOEUD* no1=tri->get_noeud1();
804  MG_NOEUD* no2=tri->get_noeud2();
805  MG_NOEUD* no3=tri->get_noeud3();
806  double *xyz1=no1->get_coord();
807  double *xyz2=no2->get_coord();
808  double *xyz3=no3->get_coord();
809  if (no1==mg_noeud) xyz1=xyz;
810  if (no2==mg_noeud) xyz2=xyz;
811  if (no3==mg_noeud) xyz3=xyz;
812  double qualtmp=OPERATEUR::qualite_triangle(xyz1,xyz2,xyz3);
813  OT_VECTEUR_3D n1n3(xyz1,xyz3);
814  OT_VECTEUR_3D n1n2(xyz1,xyz2);
815  //double xyznormal[3];
816  //mgface->calcul_normale_unitaire(uv,xyznormal);
817  OT_VECTEUR_3D normalface(xyznormal);
818  OT_VECTEUR_3D normal=normalface&n1n3;
819  normal.norme();
820  n1n2.norme();
821  if (normal*n1n2<0.0001) qualtmp=0.;
822  if (qualtmp<qual1) qual1=qualtmp;
823  }
824  if (qual1>qualcoq)
825  {
826  qualcoq=qual1;
827  crit=qualcoq;
828 
829  if ( x && xi != x )
830  x->decrementer();
831 
832  if ( x && xi != x && x->get_nb_reference() == 0 )
833  { delete x; x=0; }
834 
835  x=xii;
836  x->incrementer();
837  }
838  }
839 
840  if (qualcoq<qual+0.0001)
841  {
842  alpha=alpha-0.1;
843  }
844  else
845  {
846  qual=qualcoq;
847  if (xi != mg_noeud) xi->decrementer();
848  if (xi && xi != mg_noeud && xi->get_nb_reference() == 0 ) {delete xi; xi=0;}
849  xi=x;
850  }
851  d=ddeb*alpha;
852 
853  }
854 if (qual>qual_dep)
855  {
856  //u=decalage->decalage_parametre_u(u,-du);
857  //v=decalage->decalage_parametre_v(v,-dv);
858  //double uv[2];
859  //uv[0]=u;
860  //uv[1]=v;
861  //double xyz[3];
862  //mgface->evaluer(uv,xyz);
863  //x=xyz[0];
864  //y=xyz[1];
865  //z=xyz[2];
866  *__result = x;
867  x->Creator = MCNode::mailleur_2d_bouge_point;
868  return 1;
869  }
870 return 0;
871 }
872 
873 int MAILLEUR2D::triangle_est_dans_bon_sens_front(MG_FRONT_2D * front,MCNode *noeud3)
874 {
875 MCNode* noeud1=front->get_noeud1();
876 MCNode* noeud2=front->get_noeud2();
877 
878 MCNode * milieu_front=MCSegment_Middle(front->get_segment());
879 OT_VECTEUR_3D x1(noeud1->get_coord());
880 OT_VECTEUR_3D x2(noeud2->get_coord());
881 OT_VECTEUR_3D x3(noeud3->get_coord());
882 OT_VECTEUR_3D xm(milieu_front->get_coord());
883 OT_VECTEUR_3D normale_plan_directeur = x2-x1;
884 OT_VECTEUR_3D normale_face(0,0,0);
885 int nbRefFaces;
886 _mcFace->calcul_normale_unitaire(milieu_front->GetRefFaceMapping(), normale_face, &nbRefFaces);
887 OT_VECTEUR_3D direction_placement=normale_face&normale_plan_directeur;
888 OT_VECTEUR_3D direction_placement_euclidien = x3 - xm;
889 
890 double longueur_segment=front->get_segment()->get_longueur();
891 double taille;
892 double density_tensor[9];
893 metrique->evaluer(milieu_front->get_coord(), density_tensor);
894 taille = pow(density_tensor[0],-0.5);
895 double longueur_desiree=0.8660254037844386*(MAILLEUR2D::priorite_metrique*taille+longueur_segment*(1-MAILLEUR2D::priorite_metrique));
896 longueur_desiree = longueur_desiree/front->get_ifail();
897 
898 MCSegment * segment_M_N3 = new MCSegment(0, _mcFace, milieu_front, noeud3, 2 * longueur_desiree);
899 OT_VECTEUR_3D tangente_milieu, courbure_milieu;
900 
901 std::vector <MG_ELEMENT_TOPOLOGIQUE*> topos = segment_M_N3->GetPolylineTopos();
902 std::vector <MG_ELEMENT_TOPOLOGIQUE*>::iterator topos_it;
903 MG_FACE * face1 = NULL;
904 for ( topos_it = topos.begin(); topos_it != topos.end(); topos_it ++)
905 {
906  MG_ELEMENT_TOPOLOGIQUE* topo = *topos_it;
907  if (topo->get_dimension() == 2)
908  {
909  face1 = (MG_FACE *) topo;
910  break;
911  }
912 }
913 
914 int is_interior = 1;
915 if (face1)
916 {
917  FaceBoundaryPoint p(milieu_front, face1);
918  is_interior = p.TestInteriorDirection (direction_placement_euclidien);
919 }
920 
921 delete segment_M_N3;
922 delete milieu_front;
923 
924 if (is_interior == 1)
925  return 1;
926 else
927  return 0;
928 }
929 
930 /*int MAILLEUR2D::bouge_point(MG_FACE* mgface,MG_NOEUD* mg_noeud,double& crit,double &u,double& v,double& x,double& y, double& z)
931 {
932 if (mg_noeud->get_lien_topologie()!=mgface) return 0;
933 double du=decalage->calcul_decalage_parametre_u(mg_noeud->get_u());
934 double dv=decalage->calcul_decalage_parametre_v(mg_noeud->get_v());
935 double u1=decalage->decalage_parametre_u(mg_noeud->get_u(),du);
936 double v1=decalage->decalage_parametre_v(mg_noeud->get_v(),dv);
937 
938 double uopt=0.;
939 double vopt=0.;
940 double qual_dep=1.;
941 int nb_tri=mg_noeud->get_lien_triangle()->get_nb();
942 for (int i=0;i<nb_tri;i++)
943  {
944  M3D_MCTriangle* tri=(M3D_MCTriangle*)mg_noeud->get_lien_triangle()->get(i);
945  qual_dep=std::min(qual_dep,tri->get_qualite());
946  MG_NOEUD* no1=tri->get_noeud1();
947  MG_NOEUD* no2=tri->get_noeud2();
948  MG_NOEUD* no3=tri->get_noeud3();
949  MG_NOEUD *noeud1,*noeud2;
950  if (no1==mg_noeud)
951  {
952  noeud1=no2;
953  noeud2=no3;
954  }
955  if (no2==mg_noeud)
956  {
957  noeud1=no1;
958  noeud2=no3;
959  }
960  if (no3==mg_noeud)
961  {
962  noeud1=no1;
963  noeud2=no2;
964  }
965  double u2=noeud1->get_u()+du;
966  double v2=noeud1->get_v()+dv;
967  uopt=uopt+u2;
968  vopt=vopt+v2;
969  u2=noeud2->get_u()+du;
970  v2=noeud2->get_v()+dv;
971  uopt=uopt+u2;
972  vopt=vopt+v2;
973  }
974 uopt=uopt/2./nb_tri;
975 vopt=vopt/2./nb_tri;
976 
977 double ddeb=sqrt((u1-uopt)*(u1-uopt)+(v1-vopt)*(v1-vopt));
978 double alpha=0.5;
979 double d=alpha*ddeb;
980 double qual=qual_dep;
981 double testu[8]={1.,-1.,0.,0.,0.707106781,-0.707106781,-0.707106781,0.707106781};
982 double testv[8]={0.,0.,1.,-1.,0.707106781,0.707106781,-0.707106781,-0.707106781};
983 double uu=u1;
984 double vv=v1;
985 while (alpha>0.09)
986  {
987  double qualcoq=0.;
988  for (int nb_essai=0;nb_essai<8;nb_essai++)
989  {
990  double uv[2];
991  double xyz[3];
992  uv[0]=uu+d*testu[nb_essai]-du;
993  uv[1]=vv+d*testv[nb_essai]-dv;
994  int valide1=mgface->valide_parametre_u(uv[0]);
995  int valide2=mgface->valide_parametre_v(uv[1]);
996  if (!((valide1) && (valide2) )) break;
997  mgface->evaluer(uv,xyz);
998  double qual1=1.;
999  for (int i=0;i<nb_tri;i++)
1000  {
1001  M3D_MCTriangle* tri=(M3D_MCTriangle*)mg_noeud->get_lien_triangle()->get(i);
1002  MG_NOEUD* no1=tri->get_noeud1();
1003  MG_NOEUD* no2=tri->get_noeud2();
1004  MG_NOEUD* no3=tri->get_noeud3();
1005  double *xyz1=no1->get_coord();
1006  double *xyz2=no2->get_coord();
1007  double *xyz3=no3->get_coord();
1008  if (no1==mg_noeud) xyz1=xyz;
1009  if (no2==mg_noeud) xyz2=xyz;
1010  if (no3==mg_noeud) xyz3=xyz;
1011  double qualtmp=OPERATEUR::qualite_triangle(xyz1,xyz2,xyz3);
1012  OT_VECTEUR_3D n1n3(xyz1,xyz3);
1013  OT_VECTEUR_3D n1n2(xyz1,xyz2);
1014  double xyznormal[3];
1015  mgface->calcul_normale_unitaire(uv,xyznormal);
1016  OT_VECTEUR_3D normalface(xyznormal);
1017  OT_VECTEUR_3D normal=normalface&n1n3;
1018  normal.norme();
1019  n1n2.norme();
1020  if (normal*n1n2<0.0001) qualtmp=0.;
1021  if (qualtmp<qual1) qual1=qualtmp;
1022  }
1023  if (qual1>qualcoq)
1024  {
1025  qualcoq=qual1;
1026  crit=qualcoq;
1027  u=uv[0]+du;
1028  v=uv[1]+dv;
1029  }
1030  }
1031 
1032  if (qualcoq<qual+0.0001) alpha=alpha-0.1;
1033  else
1034  {
1035  qual=qualcoq;
1036  uu=u;
1037  vv=v;
1038  }
1039  d=ddeb*alpha;
1040 
1041  }
1042 if (qual>qual_dep)
1043  {
1044  u=decalage->decalage_parametre_u(u,-du);
1045  v=decalage->decalage_parametre_v(v,-dv);
1046  double uv[2];
1047  uv[0]=u;
1048  uv[1]=v;
1049  double xyz[3];
1050  mgface->evaluer(uv,xyz);
1051  x=xyz[0];
1052  y=xyz[1];
1053  z=xyz[2];
1054  return 1;
1055  }
1056 return 0;
1057 } */
1058 
1059 
1060 
1061 
1062 
1063 
1064 
1065 
1066 
1067 
1068 
1069 
1070 /*
1071 
1072 
1073 
1074 #define PSCA(a,b) (a[0]*b[0]+a[1]*b[1]+a[2]*b[2])
1075 #define EGAL(x,y,eps) (float)fabs((double)(x-y))<eps
1076 #define DETER(a,b,c,d) (a*d-b*c)
1077 
1078 int MAILLEUR2D::intersection_segment_segment(MG_NOEUD* noeud1,MG_NOEUD* noeud2,MG_NOEUD* noeud3,MG_NOEUD* noeud4)
1079 {
1080 
1081 double du=decalage->calcul_decalage_parametre_u(noeud1->get_u());
1082 double dv=decalage->calcul_decalage_parametre_v(noeud1->get_v());
1083 double ua=decalage->decalage_parametre_u(noeud1->get_u(),du);
1084 double va=decalage->decalage_parametre_v(noeud1->get_v(),dv);
1085 double ub=decalage->decalage_parametre_u(noeud2->get_u(),du);
1086 double vb=decalage->decalage_parametre_v(noeud2->get_v(),dv);
1087 double um=decalage->decalage_parametre_u(noeud3->get_u(),du);
1088 double vm=decalage->decalage_parametre_v(noeud3->get_v(),dv);
1089 double un=decalage->decalage_parametre_u(noeud4->get_u(),du);
1090 double vn=decalage->decalage_parametre_v(noeud4->get_v(),dv);
1091 double ab[3];
1092 double nm[3];
1093 double am[3];
1094 ab[0]=ub-ua;
1095 ab[1]=vb-va;
1096 ab[2]=0.;
1097 nm[0]=um-un;
1098 nm[1]=vm-vn;
1099 nm[2]=0.;
1100 am[0]=um-ua;
1101 am[1]=vm-va;
1102 am[2]=0.;
1103 int equation[4];
1104 equation[0]=1; // etat de l'equation 0
1105 equation[1]=1;
1106 equation[2]=1;
1107 equation[3]=3; // cette variable comporte le bilan du nombre d'equation
1108 double eps2=PSCA(ab,ab);
1109 double eps=sqrt(eps2);
1110 eps=eps*0.0001;
1111 eps2=eps2*0.0001;
1112 if ( (EGAL(ab[0],0,eps)) && (EGAL(nm[0],0,eps)) )
1113  if (EGAL(am[0],0,eps)) equation[0]=0; else return(0);
1114 if ( (EGAL(ab[1],0,eps)) && (EGAL(nm[1],0,eps)) )
1115  if (EGAL(am[1],0,eps)) equation[1]=0; else return(0);
1116 if ( (EGAL(ab[2],0,eps)) && (EGAL(nm[2],0,eps)) )
1117  if (EGAL(am[2],0,eps)) equation[2]=0; else return(0);
1118 equation[3]=equation[0]+equation[1]+equation[2];
1119 if (equation[3]==3)
1120  {
1121  double det=DETER(ab[0],nm[0],ab[1],nm[1]);
1122  if (fabs(det)>eps2)
1123  {
1124  det=1/det;
1125  double sol1=det*DETER(am[0],nm[0],am[1],nm[1]);
1126  double sol2=det*DETER(ab[0],am[0],ab[1],am[1]);
1127  if ( (float)fabs((double)(sol1*ab[2]-sol2*nm[2]-am[2]))>eps2) return(0);
1128  return(examine_solution(sol1,sol2,1));
1129  }
1130  else
1131  {
1132  equation[0]=0;
1133  equation[3]=2;
1134  // on verifie la compatibilite des deux equations dont le det est nul
1135  double tmp;
1136  if (ab[0]!=0) tmp=ab[1]*am[0]/ab[0]; else tmp=nm[1]*am[0]/nm[0];
1137  if (!(EGAL(tmp,am[1],eps))) return(0);
1138  }
1139  }
1140 if (equation[3]==2)
1141  {
1142  // on repere les equations qui existent
1143  int ne1;
1144  int ne2;
1145  if (equation[0]!=0)
1146  {
1147  ne1=0;
1148  if (equation[1]!=0) ne2=1; else ne2=2;
1149  }
1150  else
1151  {
1152  ne1=1;
1153  ne2=2;
1154  }
1155 
1156  double det=DETER(ab[ne1],nm[ne1],ab[ne2],nm[ne2]);
1157  if (fabs(det)>eps2)
1158  {
1159  det=1/det;
1160  double sol1=det*DETER(am[ne1],nm[ne1],am[ne2],nm[ne2]);
1161  double sol2=det*DETER(ab[ne1],am[ne1],ab[ne2],am[ne2]);
1162  return(examine_solution(sol1,sol2,1));
1163  }
1164  else
1165  {
1166  equation[ne1]=0;
1167  equation[3]=1;
1168  // on verifie la compatibilite des deux equations dont le det est nul
1169  double tmp;
1170  if (ab[ne1]!=0) tmp=ab[ne2]*am[ne1]/ab[ne1]; else tmp=nm[ne2]*am[ne1]/nm[ne1];
1171  if (!(EGAL(tmp,am[ne2],eps))) return(0);
1172  }
1173 
1174  }
1175 if (equation[3]==1)
1176  {
1177  // on repere l' equation qui existe
1178  int ne1;
1179  if (equation[0]!=0) ne1=0; else
1180  if (equation[1]!=0) ne1=1; else ne1=2;
1181  double an[3];
1182  an[0]=un-ua;
1183  an[1]=vn-va;
1184  an[2]=0.;
1185  double tmp=1/ab[ne1];
1186  double sol1=am[ne1]*tmp;
1187  double sol2=an[ne1]*tmp;
1188  return(examine_solution(sol1,sol2,2));
1189  }
1190 return(0);
1191 }
1192 
1193 
1194 
1195 int MAILLEUR2D::examine_solution(double sol1,double sol2,int type)
1196 {
1197 double epsilon=0.0001;
1198 
1199 if (type==1)
1200  {
1201  if ( (sol1>epsilon) && ((sol1)<(1-epsilon)) && (sol2>epsilon) && ((sol2)<(1-epsilon)) ) return 1;
1202  if ( ( (EGAL(sol1,0,epsilon)) || (EGAL(sol1,1,epsilon))) && ( (sol2>epsilon) && ((sol2)<(1-epsilon)) ) ) return 1;
1203  if ( ( (EGAL(sol2,0,epsilon)) || (EGAL(sol2,1,epsilon))) && ( (sol1>epsilon) && ((sol1)<(1-epsilon)) ) ) return 1;
1204  if ( (sol1>epsilon) && ((sol1)<(1-epsilon)) && (sol2>(-0.1-epsilon)) && ((sol2)<(1.1-epsilon)) ) return 1;
1205  if ( (sol2>epsilon) && ((sol2)<(1-epsilon)) && (sol1>(-0.1-epsilon)) && ((sol1)<(1.1-epsilon)) ) return 1;
1206 
1207  }
1208 if (type==2)
1209  {
1210  if ( (sol1>epsilon) && ((sol1)<(1-epsilon)) ) return 1;
1211  if ( (sol2>epsilon) && ((sol2)<(1-epsilon)) ) return 1;
1212  if ( ((sol1)>(1+epsilon)) && ((-sol2)>epsilon) ) return 1;
1213  if ( ((sol2)>(1+epsilon)) && ((-sol1)>epsilon) ) return 1;
1214  }
1215 return 0;
1216 }
1217 #undef EGAL
1218 #undef PSCA
1219 #undef DETER
1220 
1221 */
CAD4FE::Intersection_Plane_PolySurface::GetEndPoint
MCNode * GetEndPoint()
Definition: CAD4FE_Intersection_Plane_PolySurface.cpp:84
TPL_MAP_ENTITE::get_premier
virtual X get_premier(ITERATEUR &it)
Definition: tpl_map_entite.h:112
CAD4FE_ShortestPathByClosestPointOnEdge.h
CAD4FE::FaceBoundaryPoint
Definition: CAD4FE_FaceBoundaryPoint.h:38
MG_SEGMENT
Definition: mg_segment.h:38
CAD4FE_InventorText_MG_MAILLAGE.h
MAILLEUR2D::supprime_segment
void supprime_segment(MG_SEGMENT *mgsegment)
Definition: mailleur2d_outil.cpp:140
CAD4FE::ShortestPath::Find
double Find(std::vector< MCNode * > *__shortestPathNodes=0, std::vector< MG_ELEMENT_TOPOLOGIQUE * > *__shortestPathTopo=0)
Definition: CAD4FE_ShortestPath.cpp:175
CAD4FE::MCSegment_Middle
MCNode * MCSegment_Middle(MCSegment *__seg)
Definition: CAD4FE_MCSegment_Middle.cpp:168
gestionversion.h
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
CAD4FE::MG_FRONT_2D::get_noeud1
MCNode * get_noeud1(void)
Definition: CAD4FE_mg_front_2D.cpp:45
FRONT_RENCONTRE
#define FRONT_RENCONTRE
Definition: CAD4FE_mailleur2d.h:69
CAD4FE::MG_FRONT_2D::get_ifail
int get_ifail(void)
Definition: CAD4FE_mg_front_2D.cpp:85
TPL_MAP_ENTITE
Definition: tpl_map_entite.h:35
MG_SEGMENT::get_noeud2
virtual MG_NOEUD * get_noeud2(void)
Definition: mg_segment.cpp:113
CAD4FE::Intersection_MCSegment_MCSegment_tolerance
bool Intersection_MCSegment_MCSegment_tolerance(MCSegment *__seg1, MCSegment *__seg2, double __uv[2], MG_FACE **__face, double __tolerance)
Definition: CAD4FE_Intersection_MCSegment_MCSegment.cpp:156
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
CAD4FE::MCSegment
Definition: CAD4FE_MCSegment.h:50
ot_boite_2d.h
CAD4FE::M3D_MCTriangle::get_qualite
virtual double get_qualite(void)
Definition: CAD4FE_m3d_MCTriangle.cpp:141
CAD4FE_mailleur2d.h
CAD4FE::Intersection_Plane_PolySurface::MakeOffset
MCNodePolyline * MakeOffset(MCNode *__startNode, OT_VECTEUR_3D __direction, double __offsetLength)
Definition: CAD4FE_Intersection_Plane_PolySurface.cpp:276
OT_ALGORITHME_GEOMETRIQUE::project_PointTriangle
static int project_PointTriangle(double P0[3], double TV0[3], double TV1[3], double TV2[3], double I[3], double *IT=0)
Definition: ot_algorithme_geometrique.cpp:675
MG_ELEMENT_TOPOLOGIQUE::get_dimension
virtual int get_dimension(void)=0
OT_MATRICE_3D::get_vecteur1
OT_VECTEUR_3D & get_vecteur1(void)
Definition: ot_mathematique.cpp:814
MG_TRIANGLE
Definition: mg_triangle.h:38
OT_VECTEUR_3D::get_x
virtual double get_x(void) const
Definition: ot_mathematique.cpp:417
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
CAD4FE::MG_FRONT_2D::get_noeud2
MCNode * get_noeud2(void)
Definition: CAD4FE_mg_front_2D.cpp:50
TOUS_SEGMENT
#define TOUS_SEGMENT
Definition: CAD4FE_mailleur2d.h:64
MAILLEUR2D::noeud_est_dans_triangle
int noeud_est_dans_triangle(MG_NOEUD *noeud, MG_TRIANGLE *triangle)
Definition: mailleur2d_outil.cpp:37
MG_FACE::deriver
virtual void deriver(double *uv, double *xyzdu, double *xyzdv)
Definition: mg_face.cpp:199
MG_ELEMENT_TOPOLOGIQUE
Definition: mg_element_topologique.h:51
CAD4FE_Intersection_MCSegment_MCSegment.h
CAD4FE::Intersection_Plane_PolySurface
Definition: CAD4FE_Intersection_Plane_PolySurface.h:41
OT_REFERENCE::get_nb_reference
int get_nb_reference(void)
Definition: ot_reference.cpp:50
CAD4FE_InventorText_MCSegment.h
MG_FACE::evaluer
virtual void evaluer(double *uv, double *xyz)
Definition: mg_face.cpp:192
CAD4FE_MCSegment_Middle.h
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
CAD4FE::ShortestPathByClosestPointOnEdge
Definition: CAD4FE_ShortestPathByClosestPointOnEdge.h:47
MG_NOEUD
Definition: mg_noeud.h:41
OT_MATRICE_3D
Definition: ot_mathematique.h:160
CAD4FE::M3D_MCTriangle
Definition: CAD4FE_m3d_MCTriangle.h:40
CAD4FE::MCTriangle
Definition: CAD4FE_MCTriangle.h:39
MG_NOEUD::get_coord
virtual double * get_coord(void)
Definition: mg_noeud.cpp:92
tpl_map_entite.h
CAD4FE_PolySurface.h
TPL_MAP_ENTITE::ITERATEUR
std::map< unsigned long, X, std::less< unsigned long > >::iterator ITERATEUR
Definition: tpl_map_entite.h:38
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
MG_TRIANGLE::get_noeud2
virtual MG_NOEUD * get_noeud2(void)
Definition: mg_triangle.cpp:131
CAD4FE_FaceBoundaryPoint.h
tpl_set.h
TPL_LISTE_ENTITE::get
virtual X get(int num)
Definition: tpl_liste_entite.h:72
ot_mathematique.h
CAD4FE::FaceBoundaryPoint::TestInteriorDirection
int TestInteriorDirection(double __direction[3])
Definition: CAD4FE_FaceBoundaryPoint.cpp:145
CAD4FE::M3D_MCTriangle::change_qualite
virtual void change_qualite(double val)
Definition: CAD4FE_m3d_MCTriangle.cpp:146
OT_VECTEUR_3D::get_y
virtual double get_y(void) const
Definition: ot_mathematique.cpp:423
CAD4FE::MCSegment::GetPolylineTopos
std::vector< MG_ELEMENT_TOPOLOGIQUE * > GetPolylineTopos()
Definition: CAD4FE_MCSegment.cpp:102
acos
double2 acos(double2 &val)
Definition: ot_doubleprecision.cpp:224
OT_REFERENCE::decrementer
void decrementer(void)
Definition: ot_reference.cpp:45
OT_VECTEUR_3D
Definition: ot_mathematique.h:94
MAILLEUR2D::triangle_est_dans_bon_sens
int triangle_est_dans_bon_sens(MG_FACE *face, MG_NOEUD *noeud1, MG_NOEUD *noeud2, MG_NOEUD *noeud3)
Definition: mailleur2d_outil.cpp:317
MG_TRIANGLE::get_noeud1
virtual MG_NOEUD * get_noeud1(void)
Definition: mg_triangle.cpp:126
CAD4FE_Geometric_Tools.h
CAD4FE_m3d_MCTriangle.h
sqrt
double2 sqrt(double2 &val)
Definition: ot_doubleprecision.cpp:345
ot_boite_3d.h
OT_MATRICE_3D::get_vecteur2
OT_VECTEUR_3D & get_vecteur2(void)
Definition: ot_mathematique.cpp:818
MG_ELEMENT_MAILLAGE::get_lien_topologie
MG_ELEMENT_TOPOLOGIQUE * get_lien_topologie(void)
Definition: mg_element_maillage.cpp:51
TOUS_FRONT
#define TOUS_FRONT
Definition: CAD4FE_mailleur2d.h:65
ot_algorithme_geometrique.h
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
OT_VECTEUR_3D::get_z
virtual double get_z(void) const
Definition: ot_mathematique.cpp:429
CAD4FE
Definition: CAD4FE_ClosestPoint_Segment_MG_ARETE.h:34
OT_REFERENCE::incrementer
void incrementer(void)
Definition: ot_reference.cpp:40
OT_VECTEUR_3D::get_longueur
virtual double get_longueur(void) const
Definition: ot_mathematique.cpp:483
CAD4FE_MCNodePolyline.h
CAD4FE_Intersection_Plane_PolySurface.h
CAD4FE::MCNode
Definition: CAD4FE_MCNode.h:47
CAD4FE::MCNode::GetRefFaceMapping
FMap & GetRefFaceMapping()
Definition: CAD4FE_MCNode.cpp:134
CAD4FE::MCNode::NormalMCFace
void NormalMCFace(MCFace *__mcFace, double *__normal)
Definition: CAD4FE_MCNode.cpp:340
MG_SEGMENT::get_longueur
virtual double get_longueur(void)
Definition: mg_segment.cpp:125
CAD4FE::MG_FRONT_2D::get_segment
MCSegment * get_segment(void)
Definition: CAD4FE_mg_front_2D.cpp:55
CAD4FE::MCNode::Creator
enum CAD4FE::MCNode::CreatorType Creator
CAD4FE::MG_FRONT_2D
Definition: CAD4FE_mg_front_2D.h:35
MG_FACE
Definition: mg_face.h:34
CAD4FE::MCFace
Definition: CAD4FE_MCFace.h:50
NOEUD_CREE
#define NOEUD_CREE
Definition: CAD4FE_mailleur2d.h:68
TPL_MAP_ENTITE::get_suivant
virtual X get_suivant(ITERATEUR &it)
Definition: tpl_map_entite.h:120
cos
double2 cos(double2 &val)
Definition: ot_doubleprecision.cpp:206
CAD4FE::MCFace::calcul_normale_unitaire
void calcul_normale_unitaire(double *uv, double *xyz)
Definition: CAD4FE_MCFace.h:67
MAILLEUR2D::genere_noeud
int genere_noeud(MG_FACE *mgface, MG_FRONT_2D *front, MG_FRONT_2D **front_rencontre, MG_NOEUD **noeud)
Definition: mailleur2d_outil.cpp:147
MAILLEUR::priorite_metrique
double priorite_metrique
Definition: mailleur.h:55
MG_FACE::get_EFG
virtual void get_EFG(double *uv, double &E, double &F, double &G)
Definition: mg_face.cpp:264
OT_ALGORITHME_GEOMETRIQUE::VEC3_DISTANCE_VEC3
static double VEC3_DISTANCE_VEC3(double a[3], double b[3])
Definition: ot_algorithme_geometrique.h:127
sin
double2 sin(double2 &val)
Definition: ot_doubleprecision.cpp:250