MAGiC  V5.0
Mailleurs Automatiques de Géometries intégrés à la Cao
CAD4FE_Geometric_Tools.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_Geometric_Tools.cpp
15 //####//
16 //####//------------------------------------------------------------
17 //####//------------------------------------------------------------
18 //####// COPYRIGHT 2000-2024
19 //####// jeu 13 jun 2024 11:58:56 EDT
20 //####//------------------------------------------------------------
21 //####//------------------------------------------------------------
22 
23 #pragma hdrstop
24 
25 #include "gestionversion.h"
26 #include <mg_face.h>
28 #include <CAD4FE_MCFace.h>
29 #include <CAD4FE_MCEdge.h>
30 #include <CAD4FE_MCVertex.h>
31 #include <CAD4FE_PolySurface.h>
32 #include <CAD4FE_PolyCurve.h>
33 
34 
35 #include "CAD4FE_Geometric_Tools.h"
36 
37 
38 #pragma package(smart_init)
39 
40 using namespace CAD4FE;
41 
42 bool CAD4FE::GeometricTools::IsInteriorDir(MG_FACE * __face, MG_ARETE * __edge, double __t, double __direction[3])
43 {
44  double tEdge = __t;
45  OT_VECTEUR_3D coedgeDerT, faceEdgeInteriorDir, vecTpCoedgeDerT, vecTpFaceEdgeInteriorDir;
46  OT_VECTEUR_3D direction(__direction);
47 
48  double uv[2], xyz[3];
49  __edge->evaluer(tEdge,xyz);
50  __face->inverser(uv, xyz);
51  OT_MATRICE_3D tangentPlaneFrame = TangentPlaneFrame( __face, uv );
52  OT_MATRICE_3D tangentPlaneTranform = tangentPlaneFrame.inverse();
53  OT_VECTEUR_3D vecTpDirection = tangentPlaneTranform*direction;
54  vecTpDirection[2]=0; // project the direction in the tangent plane
55  vecTpDirection.norme();
56 
57  MG_COARETE * coedge1=0;
58  double coedge1T;
59  int nb_coedge=__edge->get_nb_mg_coarete();
60  for (int it_coe=0;it_coe<nb_coedge;it_coe++)
61  {
62  MG_COARETE *coedge = __edge->get_mg_coarete(it_coe);
63  MG_FACE * adjacent_face = coedge->get_boucle()->get_mg_face();
64 
65  if (adjacent_face == __face)
66  {
67  coedge1 = coedge; coedge1T = __t;
68  break;
69  }
70  }
71 
72  double angle_coedge1_testdirection, cs_angle_coedge1_testdirection, sn_angle_coedge1_testdirection;
73  OT_VECTEUR_3D coedge1DerT, coedge2DerT, vecTpCoedge1DerT, vecTpCoedge2DerT;
74  coedge1->get_arete()->deriver(coedge1T, coedge1DerT);
75  coedge1DerT *= coedge1->get_orientation();
76  vecTpCoedge1DerT = tangentPlaneTranform*coedge1DerT;
77  vecTpCoedge1DerT.norme();
78 
79  cs_angle_coedge1_testdirection = vecTpCoedge1DerT*vecTpDirection;
80  sn_angle_coedge1_testdirection = -vecTpCoedge1DerT[1]*vecTpDirection[0]+vecTpCoedge1DerT[0]*vecTpDirection[1];
81  if (cs_angle_coedge1_testdirection>1) cs_angle_coedge1_testdirection=1;
82  if (cs_angle_coedge1_testdirection < -1) cs_angle_coedge1_testdirection=-1;
83  angle_coedge1_testdirection = acos(cs_angle_coedge1_testdirection);
84  if (sn_angle_coedge1_testdirection < 0 ) angle_coedge1_testdirection *= -1;
85 
86  if ( angle_coedge1_testdirection < 0 )
87  return false;
88  else
89  return true;
90 }
91 
92 bool CAD4FE::GeometricTools::MCFace_MCTopoDir_IsInterior(MCFace * __mcFace, MG_ELEMENT_TOPOLOGIQUE * __mcTopo, double __xyz[3], double __direction[3])
93 {
94  bool result = false;
95  switch (__mcTopo->get_dimension())
96  {
97  case 1:
98  {
99  MCEdge * mcEdge = (MCEdge *) __mcTopo;
100  double s;
101  mcEdge->inverser(s,__xyz);
102  result = MCFace_MCEdgeDir_IsInterior(__mcFace, mcEdge, s, __direction);
103  break;
104  }
105  case 0:
106  {
107  MCVertex * mcVertex = (MCVertex*) __mcTopo;
108  result = MCFace_MCVertexDir_IsInterior(__mcFace, mcVertex, __direction);
109  break;
110  }
111  default:
112  {
113  result = false;
114  break;
115  }
116  }
117  return result;
118 }
119 
120 bool CAD4FE::GeometricTools::MCFace_MCEdgeDir_IsInterior(MCFace * __mcFace, MCEdge * __mcEdge, double __s, double __direction[3])
121 {
122  PolySurface * polysurface = __mcFace->GetPolySurface();
123  PolyCurve * polycurve = __mcEdge->GetPolyCurve();
124  MG_ARETE * edge;
125  double tEdge, dtEdge;
126  polycurve->Parameter_SToRefEdgeT(__s, &edge, &tEdge, &dtEdge, false);
127 
128  int nb_coedge=edge->get_nb_mg_coarete();
129  for (int it_coe=0;it_coe<nb_coedge;it_coe++)
130  {
131  MG_FACE * adjacentFace = edge->get_mg_coarete(it_coe)->get_boucle()->get_mg_face();
132  if ( polysurface->Contains(adjacentFace) )
133  {
134  if (IsInteriorDir(adjacentFace, edge, tEdge, __direction))
135  return true;
136  }
137  }
138 
139  return false;
140 }
141 
142 bool CAD4FE::GeometricTools::MCFace_MCVertexDir_IsInterior(MCFace * __mcFace, MCVertex * __mcVertex, double __direction[3])
143 {
144  MG_SOMMET * vertex = __mcVertex->GetRefVertex();
145  PolySurface * polysurface = __mcFace->GetPolySurface();
146 
147  std::set<MG_FACE*> adjacentFaces; MG_SOMMET_GetAdjacent_MG_FACE(vertex, adjacentFaces);
148  for (std::set<MG_FACE*>::iterator itF = adjacentFaces.begin();
149  itF != adjacentFaces.end(); itF++)
150  {
151  MG_FACE * adjacentFace = *itF;
152  if ( polysurface->Contains(adjacentFace) )
153  {
154  if (IsInteriorDir(adjacentFace, vertex, __direction))
155  return true;
156  }
157  }
158 
159  return false;
160 }
161 
162 
163 bool CAD4FE::GeometricTools::IsInteriorDir(MG_FACE * __face, MG_SOMMET * __vertex, double __direction[3])
164 {
165  OT_VECTEUR_3D coedgeDerT, faceEdgeInteriorDir, vecTpCoedgeDerT, vecTpFaceEdgeInteriorDir;
166  OT_VECTEUR_3D direction(__direction);
167 
168  double xyz[3], uv[2];
169  __vertex->get_point()->evaluer(xyz);
170  __face->inverser(uv, xyz);
171  OT_MATRICE_3D tangentPlaneFrame = TangentPlaneFrame( __face, uv );
172  OT_MATRICE_3D tangentPlaneTranform = tangentPlaneFrame.inverse();
173  OT_VECTEUR_3D vecTpDirection = tangentPlaneTranform*direction;
174  vecTpDirection[2]=0; // project the direction in the tangent plane
175  vecTpDirection.norme();
176 
177  MG_COARETE * coedge1=0, * coedge2=0;
178  double coedge1T, coedge2T;
179  for (int it_cov = 0; it_cov < __vertex->get_nb_mg_cosommet(); it_cov++)
180  {
181  MG_COSOMMET * covertex = __vertex->get_mg_cosommet(it_cov);
182  MG_ARETE * edge = covertex->get_arete();
183  unsigned nb_adjacent_face = edge->get_nb_mg_coarete();
184  for (unsigned i=0; i<nb_adjacent_face; i++)
185  {
186  MG_COARETE *coedge = edge->get_mg_coarete(i);
187  MG_FACE * adjacent_face = coedge->get_boucle()->get_mg_face();
188 
189  if (adjacent_face == __face)
190  {
191  MG_SOMMET *v1 = edge->get_cosommet1()->get_sommet();
192  MG_SOMMET *v2 = edge->get_cosommet2()->get_sommet();
193  if (coedge->get_orientation() == -1 )
194  std::swap(v1,v2);
195  {
196  if (__vertex==v1) {coedge2 = coedge; coedge2->get_arete()->inverser(coedge2T,xyz); }
197  if (__vertex==v2) {coedge1 = coedge; coedge1->get_arete()->inverser(coedge1T,xyz); }
198  }
199  }
200  }
201  }
202 
203  double angle_coedge1_coedge2, cs_angle_coedge1_coedge2, sn_angle_coedge1_coedge2;
204  double angle_coedge1_testdirection, cs_angle_coedge1_testdirection, sn_angle_coedge1_testdirection;
205  OT_VECTEUR_3D coedge1DerT, coedge2DerT, vecTpCoedge1DerT, vecTpCoedge2DerT;
206  coedge1->get_arete()->deriver(coedge1T, coedge1DerT);
207  coedge1DerT *= coedge1->get_orientation();
208  vecTpCoedge1DerT = tangentPlaneTranform*coedge1DerT;
209  vecTpCoedge1DerT.norme();
210  coedge2->get_arete()->deriver(coedge2T, coedge2DerT);
211  coedge2DerT *= coedge2->get_orientation();
212  vecTpCoedge2DerT = tangentPlaneTranform*coedge2DerT;
213  vecTpCoedge2DerT.norme();
214 
215  cs_angle_coedge1_coedge2 = vecTpCoedge1DerT*vecTpCoedge2DerT;
216  if (cs_angle_coedge1_coedge2>1) cs_angle_coedge1_coedge2=1;
217  if (cs_angle_coedge1_coedge2<-1) cs_angle_coedge1_coedge2=-1;
218  sn_angle_coedge1_coedge2 = -vecTpCoedge1DerT[1]*vecTpCoedge2DerT[0]+vecTpCoedge1DerT[0]*vecTpCoedge2DerT[1];
219  angle_coedge1_coedge2 = acos(cs_angle_coedge1_coedge2);
220  if (sn_angle_coedge1_coedge2<0) angle_coedge1_coedge2 *= -1;
221  cs_angle_coedge1_testdirection = vecTpCoedge1DerT*vecTpDirection;
222  sn_angle_coedge1_testdirection = -vecTpCoedge1DerT[1]*vecTpDirection[0]+vecTpCoedge1DerT[0]*vecTpDirection[1];
223  if (cs_angle_coedge1_testdirection>1) cs_angle_coedge1_testdirection=1;
224  if (cs_angle_coedge1_testdirection<-1) cs_angle_coedge1_testdirection=-1;
225  angle_coedge1_testdirection = acos(cs_angle_coedge1_testdirection);
226  if (sn_angle_coedge1_testdirection< 0) angle_coedge1_testdirection *= -1;
227 
228  if ( angle_coedge1_testdirection > M_PI || angle_coedge1_testdirection < angle_coedge1_coedge2)
229  return false;
230  else
231  return true;
232 }
233 
234 void GeometricTools::Surface_MoveParamInDomain(MG_FACE * __face, double * __uv, double * __xyz)
235 {
236 bool bEval = false;
237 double uvmax[2];
238 double uvmin[2];
239 uvmax[0]=__face->get_surface()->get_umax();
240 uvmin[0]=__face->get_surface()->get_umin();
241 uvmax[1]=__face->get_surface()->get_vmax();
242 uvmin[1]=__face->get_surface()->get_vmin();
243 double uvperiod[2];
244 uvperiod[0]=__face->get_surface()->get_periode_u();
245 uvperiod[1]=__face->get_surface()->get_periode_v();
246 for (int i=0; i<2; i++)
247 {
248  if (uvperiod[i] != 0.0)
249  {
250  if (__uv[i] > uvmax[i])
251  __uv[i] -= uvmax[i]-uvmin[i];
252  else
253  if (__uv[i] < uvmin[i])
254  __uv[i] += uvmax[i]-uvmin[i];
255  }
256  else
257  {
258  if (__uv[i] > uvmax[i])
259  { __uv[i] = uvmax[i]; bEval = true; }
260  else
261  if (__uv[i] < uvmin[i])
262  { __uv[i] = uvmin[i]; bEval = true; }
263  }
264 }
265 if (bEval)
266  __face->evaluer(__uv,__xyz);
267 }
268 
269 /*MCNode * GeometricTools::FindNextPointInDirection(MG_FACE * __face, std::set<MCNode*> & __candidateEndPt, double __uv[2], double __tpDir[3], double __minDist, MCNode * __endPt )
270 {
271  OT_DECALAGE_PARAMETRE ot_decalage(__face->get_surface()->get_periode_u(), __face->get_surface()->get_periode_v());
272  std::set <MCNode *>::iterator it_LCI;
273  MCNode * xn = 0;
274 
275  double decal_u=ot_decalage.calcul_decalage_parametre_u(__uv[0]);
276  double decal_v=ot_decalage.calcul_decalage_parametre_v(__uv[1]);
277  OT_VECTEUR_3D decal_uv, decal_uvc;
278  decal_uv[0]=ot_decalage.decalage_parametre_u(__uv[0],decal_u);
279  decal_uv[1]=ot_decalage.decalage_parametre_v(__uv[1],decal_v);
280 
281  double Du = __tpDir[0];
282  double Dv = __tpDir[1];
283  OT_VECTEUR_3D tpDir(__tpDir[0],__tpDir[1],0);
284 
285  double xyz[3];
286  __face->evaluer(__uv,xyz);
287 
288  double minT = 1E99;
289  for (it_LCI = __candidateEndPt.begin();
290  it_LCI != __candidateEndPt.end();
291  it_LCI++)
292  {
293  // projection of it_LCI on line passing by x[i] -- x[i]+Dt2d
294  MCNode * xc = *it_LCI;
295  double * xc_uv = xc->UV(__face);
296 
297  decal_uvc[0]=ot_decalage.decalage_parametre_u(xc_uv[0],decal_u);
298  decal_uvc[1]=ot_decalage.decalage_parametre_v(xc_uv[1],decal_v);
299 
300  double c1 = (decal_uvc[0]-decal_uv[0])*Du + (decal_uvc[1]-decal_uv[1])*Dv;
301  double c2 = Du*Du + Dv*Dv;
302  double xct = c1/c2;
303 
304 
305  if ( xct > 0 && fabs(xct) < fabs(minT) )
306  {
307  double decal_proj[2];
308  for (int i=0; i<2; i++) decal_proj[i]=decal_uv[i]+(__tpDir[i])*xct;
309  double xc_proj_uv[2], xc_proj_xyz[3];
310  xc_proj_uv[0] = ot_decalage.decalage_parametre_u(decal_proj[0],-decal_u);
311  xc_proj_uv[1] = ot_decalage.decalage_parametre_v(decal_proj[1],-decal_v);
312  Surface_MoveParamInDomain(__face,xc_proj_uv);
313  __face->evaluer(xc_proj_uv, xc_proj_xyz);
314  double distXcProjXc = OT_ALGORITHME_GEOMETRIQUE::VEC3_DISTANCE_VEC3(xc->get_coord(), xc_proj_xyz);
315  double distX0ProjXc = OT_ALGORITHME_GEOMETRIQUE::VEC3_DISTANCE_VEC3(xc_proj_xyz, xyz );
316  double distX0Xc = OT_ALGORITHME_GEOMETRIQUE::VEC3_DISTANCE_VEC3(xc->get_coord(), xyz);
317  if ( distXcProjXc < __minDist )
318  {
319  if ( xc->GetRefEdgeMapping().size() > 0)
320  {
321  OT_VECTEUR_3D xc_vecWDir;
322  OT_MATRICE_3D xc_matTpFrame = TangentPlaneFrame(__face, xc_uv);
323  xc_vecWDir = xc_matTpFrame*tpDir;
324 
325  if ( !IsInteriorDir ( __face, xc, xc_vecWDir ) || xc == __endPt )
326  {
327  minT = xct;
328  xn = xc;
329  }
330  }
331  else
332  {
333  minT = xct;
334  xn = xc;
335  }
336  }
337  }
338  }
339 
340  return xn;
341 }
342 */
343 
345 {
346  OT_MATRICE_3D M;
347  OT_VECTEUR_3D DerU, DerV, Normal;
348  __sigma->deriver(uv,DerU,DerV);
349  Normal = DerU & DerV;
350 
351  M.change_vecteur1(DerU);
352  M.change_vecteur2(DerV);
353  M.change_vecteur3(Normal);
354 
355  return M;
356 }
357 
359 {
360  OT_VECTEUR_3D DerU, DerV, Normal;
361  OT_VECTEUR_3D DerUU, DerVV, DerUV;
362  __sigma->deriver_seconde(uv, DerUU, DerUV, DerVV, xyz, DerU, DerV);
363  Normal = DerU & DerV;
364 
365  M.change_vecteur1(DerU);
366  M.change_vecteur2(DerV);
367  M.change_vecteur3(Normal);
368 
369  C.change_vecteur1(.5*DerUU);
370  C.change_vecteur2(.5*DerVV);
371  C.change_vecteur3(DerUV);
372 
373  return M;
374 }
375 
376 bool GeometricTools::GetIntersectingPlaneDirection(MG_FACE * __face, double __uv[2], double __planeNormal[3], double __directionUV[2])
377 {
378 
379  OT_MATRICE_3D matTpFrame, tangentPlaneTransform;
380  OT_VECTEUR_3D vecWDir, vecTpDir, vecWOrigin, planeRootPoint;
381 
382  __face->evaluer(__uv, planeRootPoint);
383 
384  matTpFrame = TangentPlaneFrame(__face, __uv);
385  tangentPlaneTransform = matTpFrame.inverse();
386  Intr3D_Surface_Plane_Get_LocalTangentPlane_Direction(__face, __planeNormal, planeRootPoint, __uv, matTpFrame, vecWDir);
387  vecTpDir=tangentPlaneTransform*vecWDir;
388 
389  for (int i=0; i<2; i++)
390  __directionUV[i] = vecTpDir[i];
391 
392  return true;
393 }
394 
396 MG_FACE * __sigma,
397 double __N1[3], double __P1[3], double __uv[2], OT_MATRICE_3D & __tangentPlaneFrame, OT_VECTEUR_3D & __intrLineDirWorld)
398 {
399  // tangent plane origin = surface point at UV
400  double afTpOrigin[3];
401  __sigma->evaluer(__uv, afTpOrigin);
402 
403  // Compute the plane #1 / tangent plane
404  // intersection line
405  OT_VECTEUR_3D afTpNormal = __tangentPlaneFrame.get_vecteur3();
406 
407  int intrLineResult = OT_ALGORITHME_GEOMETRIQUE::Intr3D_Plane_Plane(afTpNormal, afTpOrigin, __N1, __P1, __intrLineDirWorld);
408 
409  return intrLineResult;
410 }
411 
413 {
414 OT_VECTEUR_3D dir1, dir2;
415 OT_VECTEUR_3D normal(__planeNormal);
416 normal.norme();
417 if (!(OPERATEUR::egal(normal.get_x(),0.,0.000001)))
418  {
419  dir1[0]=normal.get_y();
420  dir1[1]=(-normal.get_x());
421  dir1[2]=0.;
422  }
423  else if (!(OPERATEUR::egal(normal.get_y(),0.,0.000001)))
424  {
425  dir1[0]=0.;
426  dir1[1]=(-normal.get_z());
427  dir1[2]=normal.get_y();
428  }
429  else
430  {
431  dir1[0]=normal.get_z();
432  dir1[1]=0.;
433  dir1[2]=0.;
434  }
435 dir1.norme();
436 dir2=normal&dir1;
437 return OT_MATRICE_3D(dir1, dir2, normal);
438 }
439 
440 double GeometricTools::AngleInPlane(double *__axisX, double *__direction)
441 {
442  double angle;
443  double directionNorm = sqrt(__direction[0]*__direction[0]+__direction[1]*__direction[1]);
444  double axisXNorm = sqrt(__axisX[0]*__axisX[0]+__axisX[1]*__axisX[1]);
445  //double axisYNorm = sqrt(__axisY[0]*__axisY[0]+__axisY[1]*__axisY[1]);
446  double cs = (+__direction[0]*__axisX[0] + __direction[1]*__axisX[1]) / (axisXNorm*directionNorm);
447  double sn = (-__direction[0]*__axisX[1] + __direction[1]*__axisX[0]);// / (axisYNorm*directionNorm);
448  if (cs > 1) cs=1;
449  if (cs < -1) cs=-1;
450  if (sn < 0) return -acos(cs);
451  else return acos(cs);
452 }
453 
454 
456 {
457  for (int itE = 0; itE < v->get_nb_mg_cosommet(); itE++)
458  {
459  MG_ARETE * edge = v->get_mg_cosommet(itE)->get_arete();
460  for (int itF = 0; itF < edge->get_nb_mg_coarete(); itF++)
461  {
462  MG_FACE * face = edge->get_mg_coarete(itF)->get_boucle()->get_mg_face();
463  if (face == __face)
464  return true;
465  }
466  }
467  return false;
468 }
469 
471 {
472  int nb_coedge=e->get_nb_mg_coarete();
473  for (int it_coe=0;it_coe<nb_coedge;it_coe++)
474  if ( e->get_mg_coarete(it_coe)->get_boucle()->get_mg_face() == __face )
475  return true;
476 
477  return false;
478 }
479 
481 {
482  MG_SOMMET * v1 = __edge->get_cosommet1()->get_sommet();
483  if (v1 == __vertex) return true;
484  MG_SOMMET * v2 = __edge->get_cosommet2()->get_sommet();
485  if (v2 == __vertex) return true;
486  return false;
487 }
488 
490 {
491  int nb_covertex = __refVertex->get_nb_mg_cosommet();
492  for (int it_cov=0;it_cov<nb_covertex;it_cov++)
493  {
494  MG_COSOMMET * cov = __refVertex->get_mg_cosommet(it_cov);
495  MG_ARETE * e = cov->get_arete();
496  int nb_coedge = e->get_nb_mg_coarete();
497  for (int it_coe=0;it_coe<nb_coedge;it_coe++)
498  {
499  MG_FACE * refFace = e->get_mg_coarete(it_coe)->get_boucle()->get_mg_face();
500  if (__polysurface->Contains(refFace))
501  return true;
502  }
503  }
504  return false;
505 }
506 
507 void GeometricTools::MG_SOMMET_GetAdjacent_MG_FACE(MG_SOMMET * __refVertex, std::set<MG_FACE*> & __adjacentfaces)
508 {
509  int nb_covertex = __refVertex->get_nb_mg_cosommet();
510  for (int it_cov=0;it_cov<nb_covertex;it_cov++)
511  {
512  MG_COSOMMET * cov = __refVertex->get_mg_cosommet(it_cov);
513  MG_ARETE * e = cov->get_arete();
514  int nb_coedge = e->get_nb_mg_coarete();
515  for (int it_coe=0;it_coe<nb_coedge;it_coe++)
516  {
517  MG_FACE * refFace = e->get_mg_coarete(it_coe)->get_boucle()->get_mg_face();
518  __adjacentfaces.insert(refFace);
519  }
520  }
521 }
522 
523 double GeometricTools::FacePointCorrection(MG_FACE * __face, double __xyz[3], double __uv[2])
524 {
525  OT_MATRICE_3D matTpFrame, tpTrans;
526  OT_VECTEUR_3D d_uvn(1,1,1);
527  int i=0;
528  double error;
529  OT_VECTEUR_3D xyz(__xyz);
530  OT_VECTEUR_3D xyzEval,xyzEval2,dx2;
531  __face->valide_parametre_u(__uv[0]);
532  __face->valide_parametre_v(__uv[1]);
533  __face->evaluer(__uv, xyzEval);
534  OT_VECTEUR_3D dx=xyz-xyzEval;
535 
536 
537  for (i=0;
538  i<10 &&
539  dx.get_longueur2() > 1E-28 &&
540  (d_uvn[0]*d_uvn[0])+(d_uvn[1]*d_uvn[1]) > 1E-8*d_uvn[2]*d_uvn[2] // dx perpendicular to tangent plane ?
541  ;
542  i++)
543  {
544  matTpFrame=TangentPlaneFrame(__face,__uv);
545  tpTrans=matTpFrame.inverse();
546  d_uvn=tpTrans*dx;
547  __uv[0]+=d_uvn[0];
548  __uv[1]+=d_uvn[1];
549  __face->valide_parametre_u(__uv[0]);
550  __face->valide_parametre_v(__uv[1]);
551  __face->evaluer(__uv, xyzEval);
552  dx=xyz-xyzEval;
553  }
554  error=dx.get_longueur();
555 
556  return error;
557 }
558 
559 double GeometricTools::Vector_UV_To_3D_Plane(MG_FACE *__face, double *__planeNormal, double * __planeRootPoint, double * __uv1, double * __uv12)
560 {
561  OT_VECTEUR_3D P1, P2, vec_UV1_UV2, vec_P1_P2;
562 
563  // Compute the distance vector between a P(uv) and the plane
564  __face->evaluer(__uv1, P1);
565  OT_VECTEUR_3D vecP1P2;
566  double distance3D = OT_ALGORITHME_GEOMETRIQUE::Closest_Point_to_Plane_3d(__planeNormal, __planeRootPoint, P1, P2);
567  vec_P1_P2 = P2 - P1;
568 
569  // Compute tangent plane tranformation matrix
570  OT_MATRICE_3D tangentPlaneFrame3D = GeometricTools::TangentPlaneFrame(__face, __uv1);
571  OT_MATRICE_3D tangentPlaneTransform = tangentPlaneFrame3D.inverse();
572 
573  // compute the value of the vector in the tangent plane frame of the face
574  vec_UV1_UV2 = tangentPlaneTransform * vec_P1_P2;
575 
576  for (int i=0;i<2;i++)
577  __uv12[i] = vec_UV1_UV2[i];
578 
579  return distance3D;
580 }
581 
582 
583 double GeometricTools::MoveParamInPlane(MG_FACE * __face, double __planeNormal[3], double __planeRootPoint[3], double deltamax3D, int nbPointToPlaneResidueCorrection, double __uv[2], double __xyz[3])
584 {
585  OT_MATRICE_3D tangentPlaneFrame3D, tangentPlaneTransform;
586  OT_VECTEUR_3D uv1(__uv);
587  OT_VECTEUR_3D uv2;
588  OT_VECTEUR_3D P1(__xyz);
589  OT_VECTEUR_3D P2, vec_UV1_UV2, vec_P1_P2;
590  OT_VECTEUR_3D vecP1P2;
591  int nbPlaneCorrections=0;
592  double error;
593 
594  error=OT_ALGORITHME_GEOMETRIQUE::Closest_Point_to_Plane_3d(__planeNormal, __planeRootPoint, P1, P2);
595  for(nbPlaneCorrections = 0;
596  nbPlaneCorrections < nbPointToPlaneResidueCorrection && deltamax3D<error;
597  nbPlaneCorrections ++)
598  {
599  tangentPlaneFrame3D = GeometricTools::TangentPlaneFrame(__face, uv1);
600  tangentPlaneTransform = tangentPlaneFrame3D.inverse();
601  vec_P1_P2 = P2 - P1;
602  vec_UV1_UV2 = tangentPlaneTransform*vec_P1_P2;
603  uv2 = uv1 + vec_UV1_UV2;
604  uv1=uv2;
605  Surface_MoveParamInDomain(__face, uv1, P1);
606  __face->evaluer(uv1,P1);
607  error=OT_ALGORITHME_GEOMETRIQUE::Closest_Point_to_Plane_3d(__planeNormal, __planeRootPoint, P1, P2);
608  }
609 
610  for (int i=0; i<2; i++)
611  __uv[i] = uv1[i];
612 
613  for (int i=0; i<3; i++)
614  __xyz[i] = P1[i];
615 
616  return error;
617 }
618 
619 double GeometricTools::Segment2dCurvilinearLength(MG_FACE * __face, double __uv1[2], double __uv2[2], unsigned __nbNubdivisions)
620 {
621  double E,F,G;
622  double decal_uv2[2],decal_uv1[2],duv[2],uv[2],decal[2]={0,0};
623  double period[2];period[0]=__face->get_surface()->get_periode_u();period[1]=__face->get_surface()->get_periode_v();
624  OT_DECALAGE_PARAMETRE d(period[0],period[1]);
625 
626  decal[0]=d.calcul_decalage_parametre_u(__uv1[0]);
627  decal[1]=d.calcul_decalage_parametre_v(__uv1[1]);
628  decal_uv1[0]=d.decalage_parametre_u(__uv1[0],decal[0]);
629  decal_uv1[1]=d.decalage_parametre_v(__uv1[1],decal[1]);
630  decal_uv2[0]=d.decalage_parametre_u(__uv2[0],decal[0]);
631  decal_uv2[1]=d.decalage_parametre_v(__uv2[1],decal[1]);
632 
633  duv[0]=1.0/__nbNubdivisions*(decal_uv2[0]-decal_uv1[0]);
634  duv[1]=1.0/__nbNubdivisions*(decal_uv2[1]-decal_uv1[1]);
635 
636  double length=0;
637  for (unsigned i=0; i<=__nbNubdivisions; i++)
638  {
639  uv[0]=d.decalage_parametre_u(decal_uv1[0]+i*duv[0],-decal[0]);
640  uv[1]=d.decalage_parametre_v(decal_uv1[1]+i*duv[1],-decal[1]);
641  __face->valide_parametre_u(uv[0]);
642  __face->valide_parametre_v(uv[1]);
643 
644  __face->get_EFG(uv, E, F, G);
645  if (i > 0)
646  {
647  double dist2=duv[0]*duv[0]*E+duv[1]*duv[1]*G+duv[1]*duv[0]*F;
648  double dist=0;
649  if ( dist2 > 1E-308)
650  dist=sqrt(dist2);
651  length += dist;
652  }
653  }
654 
655  return length;
656 }
657 
658 
660 {
661  OT_VECTEUR_3D normal[2];
662 
663  for (int i=0;i<2;i++)
664  {
665  OT_VECTEUR_3D s[2];
666 
667  for (int j=0;j<2;j++)
668  for (int k=0;k<3;k++)
669  s[j][k]=__tri[i][j+1]->get_coord()[k]-__tri[i][j]->get_coord()[k];
670 
671  normal[i]=s[1]&s[0];
672 
673  if (normal[i].get_longueur2() == 0) // degenerated triangle
674  return 1E308;
675 
676  normal[i].norme();
677  }
678 
679  double cs = normal[0]*normal[1];
680  if (cs>1)cs=1;
681  if (cs<-1)cs=-1;
682  double angle = acos(cs);
683 
684  return angle;
685 }
686 
688 {
689 couleur=0;
690 int nbccf=ele->get_nb_ccf();
691 for (int k=0;k<nbccf;k++)
692  {
693  char typeccf[10];
694  ele->get_type_ccf(k,typeccf);
695  if ((typeccf[0]=='C') && (typeccf[1]=='c'))
696  {
697  couleur = ele->get_valeur_ccf(k);
698  return 1;
699  }
700  }
701 return 0;
702 }
703 
705 {
706  double val;
707  int result = MG_TOPO_GetColor(ele, val);
708 
709  // if there is no color information
710  if (result == 0)
711  {
712  rgba = -1;
713  return result;
714  }
715 
716  // Codage couleur : 4 octets dans un double (8 octets)
717  // -0-1-2-3-4-5-6-7-
718  // |R|G|B|A|0|0|0|0|
719  rgba = 0;
720  unsigned char *p=(unsigned char*)&val;
721  rgba += (*p);p++;
722  rgba += ((*p)<<8);p++;
723  rgba += ((*p)<<16);p++;
724  rgba += ((*p)<<24);
725  return result;
726 }
727 
729 {
730  double val;
731  int result = MG_TOPO_GetColor(ele, val);
732 
733  // Codage couleur : 4 octets dans un double (8 octets)
734  // -0-1-2-3-4-5-6-7-
735  // |R|G|B|A|0|0|0|0|
736  unsigned char *p=(unsigned char*)&val;
737  rgba = 0;
738  rgba += (*p);p++;
739  rgba += ((*p)<<8);p++;
740  rgba += ((*p)<<16);p++;
741  rgba += ((*p)<<24);
742  return result;
743 }
744 
746 {
747  double val;
748  int result = MG_TOPO_GetColor(ele, val);
749  ccf_double_to_uc4(val, rgba);
750  return result;
751 }
752 
753 void GeometricTools::ccf_uc4_to_double(unsigned char rgba[4], double & val)
754 {
755  val = 0;
756  unsigned char *p=(unsigned char*)&val;
757  for (int i=0; i<4; i++)
758  p[i] = rgba[i];
759 }
760 
761 
762 void GeometricTools::ccf_double_to_uc4(double val, unsigned char rgba[4])
763 {
764  // Codage couleur : 4 octets dans un double (8 octets)
765  // -0-1-2-3-4-5-6-7-
766  // |R|G|B|A|0|0|0|0|
767  unsigned char *p=(unsigned char*)&val;
768  for (int i=0; i<4; i++)
769  rgba[i] = p[i];
770 }
771 
772 
773 
775 {
776  double couleur = 0;
777  ccf_uc4_to_double(rgba, couleur);
778  MG_TOPO_SetColor(ele, couleur);
779 }
780 
782 {
783  ele->ajouter_ccf((char*)"Cc", d);
784 }
785 
786 void GeometricTools::MG_TOPO_SetColor(MG_ELEMENT_TOPOLOGIQUE* ele, unsigned char r, unsigned char g, unsigned char b, unsigned char a)
787 {
788  unsigned char rgba[4] = {r,g,b,a};
789  MG_TOPO_SetColor(ele, rgba);
790 }
791 
792 
MG_SOMMET::get_mg_cosommet
virtual MG_COSOMMET * get_mg_cosommet(int num)
Definition: mg_sommet.cpp:88
CAD4FE::GeometricTools::Segment2dCurvilinearLength
static double Segment2dCurvilinearLength(MG_FACE *__face, double __uv1[2], double __uv2[2], unsigned __nbNubdivisions)
Definition: CAD4FE_Geometric_Tools.cpp:619
MG_ARETE::get_cosommet2
virtual class MG_COSOMMET * get_cosommet2(void)
Definition: mg_arete.cpp:85
CAD4FE::GeometricTools::Vector_UV_To_3D_Plane
static double Vector_UV_To_3D_Plane(MG_FACE *__face, double *__planeNormal, double *__planeRootPoint, double *__uv1, double *__uv12)
Definition: CAD4FE_Geometric_Tools.cpp:559
CAD4FE::GeometricTools::GetIntersectingPlaneDirection
static bool GetIntersectingPlaneDirection(MG_FACE *__face, double __uv[2], double __planeNormal[3], double __directionUV[2])
Definition: CAD4FE_Geometric_Tools.cpp:376
OT_MATRICE_3D::change_vecteur3
void change_vecteur3(OT_VECTEUR_3D v)
Definition: ot_mathematique.cpp:810
MG_ELEMENT_TOPOLOGIQUE::ajouter_ccf
virtual void ajouter_ccf(char *nom, double val, std::string suiv="NS")
Definition: mg_element_topologique.cpp:159
gestionversion.h
MG_SURFACE::get_periode_u
virtual double get_periode_u(void)=0
CAD4FE::GeometricTools::MG_TOPO_SetColor
static void MG_TOPO_SetColor(MG_ELEMENT_TOPOLOGIQUE *ele, unsigned char r, unsigned char g, unsigned char b, unsigned char a)
Definition: CAD4FE_Geometric_Tools.cpp:786
MG_ARETE::evaluer
virtual void evaluer(double t, double *xyz)
Definition: mg_arete.cpp:143
CAD4FE::GeometricTools::MG_FACE_Contains_MG_ARETE
static bool MG_FACE_Contains_MG_ARETE(MG_FACE *__face, MG_ARETE *e)
Definition: CAD4FE_Geometric_Tools.cpp:470
CAD4FE::PolySurface::Contains
bool Contains(MG_FACE *__refFace)
Definition: CAD4FE_PolySurface.cpp:167
CAD4FE::PolySurface
Definition: CAD4FE_PolySurface.h:43
CAD4FE::GeometricTools::MCFace_MCTopoDir_IsInterior
static bool MCFace_MCTopoDir_IsInterior(MCFace *__mcFace, MG_ELEMENT_TOPOLOGIQUE *__mcTopo, double __xyz[3], double __direction[3])
Definition: CAD4FE_Geometric_Tools.cpp:92
CAD4FE::PolyCurve
Definition: CAD4FE_PolyCurve.h:38
CAD4FE::GeometricTools::Surface_MoveParamInDomain
static void Surface_MoveParamInDomain(MG_FACE *__face, double *__uv, double *__xyz)
Definition: CAD4FE_Geometric_Tools.cpp:234
OT_VECTEUR_3D::get_longueur2
virtual double get_longueur2(void) const
Definition: ot_mathematique.cpp:488
MG_COSOMMET
Definition: mg_cosommet.h:31
CAD4FE::GeometricTools::GetPlaneFrame
static OT_MATRICE_3D GetPlaneFrame(OT_VECTEUR_3D &__planeNormal)
Definition: CAD4FE_Geometric_Tools.cpp:412
a
#define a(i, j)
CAD4FE::MCFace::GetPolySurface
PolySurface * GetPolySurface()
Definition: CAD4FE_MCFace.cpp:113
MG_COARETE
Definition: mg_coarete.h:31
CAD4FE::GeometricTools::MCFace_MCVertexDir_IsInterior
static bool MCFace_MCVertexDir_IsInterior(MCFace *__mcFace, MCVertex *__mcVertex, double __direction[3])
Definition: CAD4FE_Geometric_Tools.cpp:142
MG_COARETE::get_boucle
virtual MG_BOUCLE * get_boucle(void)
Definition: mg_coarete.cpp:53
MG_ELEMENT_TOPOLOGIQUE::get_dimension
virtual int get_dimension(void)=0
CAD4FE::GeometricTools::ccf_double_to_uc4
static void ccf_double_to_uc4(double val, unsigned char rgba[4])
Definition: CAD4FE_Geometric_Tools.cpp:762
OT_VECTEUR_3D::get_x
virtual double get_x(void) const
Definition: ot_mathematique.cpp:417
swap
void swap(double2 &a, double2 &b)
Definition: ot_fonctions.cpp:106
MG_SOMMET::get_nb_mg_cosommet
virtual int get_nb_mg_cosommet(void)
Definition: mg_sommet.cpp:64
MG_SURFACE::get_vmax
virtual double get_vmax()
Definition: mg_surface.cpp:71
MG_FACE::deriver
virtual void deriver(double *uv, double *xyzdu, double *xyzdv)
Definition: mg_face.cpp:199
MG_ELEMENT_TOPOLOGIQUE::get_type_ccf
virtual void get_type_ccf(int num, char *nom)
Definition: mg_element_topologique.cpp:95
MG_ELEMENT_TOPOLOGIQUE
Definition: mg_element_topologique.h:51
MG_FACE::inverser
virtual void inverser(double *uv, double *xyz, double precision=1e-6)
Definition: mg_face.cpp:228
MG_ARETE::inverser
virtual void inverser(double &t, double *xyz, double precision=1e-6)
Definition: mg_arete.cpp:173
CAD4FE::GeometricTools::IsInteriorDir
static bool IsInteriorDir(MG_FACE *__face, MG_ARETE *__edge, double __t, double __direction[3])
Definition: CAD4FE_Geometric_Tools.cpp:42
CAD4FE::GeometricTools::MoveParamInPlane
static double MoveParamInPlane(MG_FACE *__face, double __planeNormal[3], double __planeRootPoint[3], double deltamax3D, int nbPointToPlaneResidueCorrection, double __uv[2], double __xyz[3])
Definition: CAD4FE_Geometric_Tools.cpp:583
CAD4FE::GeometricTools::TangentPlaneFrame_SecondDersTransform
static OT_MATRICE_3D TangentPlaneFrame_SecondDersTransform(MG_FACE *__sigma, double uv[2], OT_MATRICE_3D &M, OT_MATRICE_3D &C, OT_VECTEUR_3D &xyz)
Definition: CAD4FE_Geometric_Tools.cpp:358
MG_ARETE::get_nb_mg_coarete
virtual int get_nb_mg_coarete(void)
Definition: mg_arete.cpp:106
CAD4FE::MCVertex::GetRefVertex
MG_SOMMET * GetRefVertex()
Definition: CAD4FE_MCVertex.cpp:47
MG_FACE::evaluer
virtual void evaluer(double *uv, double *xyz)
Definition: mg_face.cpp:192
MG_FACE::valide_parametre_u
virtual int valide_parametre_u(double &u)
Definition: mg_face.cpp:150
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
OPERATEUR::egal
static int egal(double a, double b, double eps)
Definition: ot_mathematique.cpp:1629
MG_ELEMENT_TOPOLOGIQUE::get_nb_ccf
virtual int get_nb_ccf(void)
Definition: mg_element_topologique.cpp:154
MG_NOEUD
Definition: mg_noeud.h:41
MG_FACE::deriver_seconde
virtual void deriver_seconde(double *uv, double *xyzduu, double *xyzduv, double *xyzdvv, double *xyz=NULL, double *xyzdu=NULL, double *xyzdv=NULL)
Definition: mg_face.cpp:212
OT_MATRICE_3D
Definition: ot_mathematique.h:160
CAD4FE::GeometricTools::MCFace_MCEdgeDir_IsInterior
static bool MCFace_MCEdgeDir_IsInterior(MCFace *__mcFace, MCEdge *__mcEdge, double __s, double __direction[3])
Definition: CAD4FE_Geometric_Tools.cpp:120
MG_COSOMMET::get_arete
virtual MG_ARETE * get_arete(void)
Definition: mg_cosommet.cpp:88
CAD4FE::GeometricTools::Intr3D_Surface_Plane_Get_LocalTangentPlane_Direction
static int Intr3D_Surface_Plane_Get_LocalTangentPlane_Direction(MG_FACE *__sigma, double __N1[3], double __P1[3], double __uv[2], OT_MATRICE_3D &__tangentPlaneFrame, OT_VECTEUR_3D &__intrLineDirWorld)
Definition: CAD4FE_Geometric_Tools.cpp:395
CAD4FE::MCVertex
Definition: CAD4FE_MCVertex.h:35
OT_MATRICE_3D::get_vecteur3
OT_VECTEUR_3D & get_vecteur3(void)
Definition: ot_mathematique.cpp:822
CAD4FE::GeometricTools::AngleInPlane
static double AngleInPlane(double *__axisX, double *__direction)
Definition: CAD4FE_Geometric_Tools.cpp:440
MG_NOEUD::get_coord
virtual double * get_coord(void)
Definition: mg_noeud.cpp:92
MG_FACE::valide_parametre_v
virtual int valide_parametre_v(double &v)
Definition: mg_face.cpp:172
CAD4FE_MCVertex.h
CAD4FE_PolySurface.h
MG_BOUCLE::get_mg_face
virtual MG_FACE * get_mg_face(void)
Definition: mg_boucle.cpp:102
OT_MATRICE_3D::change_vecteur2
void change_vecteur2(OT_VECTEUR_3D v)
Definition: ot_mathematique.cpp:806
MG_COARETE::get_orientation
virtual int get_orientation(void)
Definition: mg_coarete.cpp:71
MG_SOMMET::get_point
virtual MG_POINT * get_point(void)
Definition: mg_sommet.cpp:52
OT_VECTEUR_3D::norme
virtual void norme(void)
Definition: ot_mathematique.cpp:494
CAD4FE::GeometricTools::ccf_uc4_to_double
static void ccf_uc4_to_double(unsigned char rgba[4], double &val)
Definition: CAD4FE_Geometric_Tools.cpp:753
CAD4FE::GeometricTools::MG_FACE_Contains_MG_SOMMET
static bool MG_FACE_Contains_MG_SOMMET(MG_FACE *__face, MG_SOMMET *v)
Definition: CAD4FE_Geometric_Tools.cpp:455
CAD4FE::GeometricTools::PolySurface_Contains_RefVertex
static bool PolySurface_Contains_RefVertex(PolySurface *__polysurface, MG_SOMMET *__refVertex)
Definition: CAD4FE_Geometric_Tools.cpp:489
MG_COSOMMET::get_sommet
virtual MG_SOMMET * get_sommet(void)
Definition: mg_cosommet.cpp:83
OT_DECALAGE_PARAMETRE::decalage_parametre_u
double decalage_parametre_u(double par, double dpar)
Definition: ot_decalage_parametre.cpp:51
CAD4FE_MCEdge.h
OT_VECTEUR_3D::get_y
virtual double get_y(void) const
Definition: ot_mathematique.cpp:423
acos
double2 acos(double2 &val)
Definition: ot_doubleprecision.cpp:224
OT_VECTEUR_3D
Definition: ot_mathematique.h:94
CAD4FE::MCEdge
Definition: CAD4FE_MCEdge.h:48
CAD4FE_Geometric_Tools.h
MG_SURFACE::get_umax
virtual double get_umax()
Definition: mg_surface.cpp:61
sqrt
double2 sqrt(double2 &val)
Definition: ot_doubleprecision.cpp:345
OT_ALGORITHME_GEOMETRIQUE::Closest_Point_to_Plane_3d
static double Closest_Point_to_Plane_3d(double *norm, double *root, double *pnt, double *res)
Definition: ot_algorithme_geometrique.cpp:38
CAD4FE_PolyCurve.h
OT_DECALAGE_PARAMETRE::calcul_decalage_parametre_v
double calcul_decalage_parametre_v(double par)
Definition: ot_decalage_parametre.cpp:43
MG_SURFACE::get_periode_v
virtual double get_periode_v(void)=0
CAD4FE::GeometricTools::ComputeDiedralAngle
static double ComputeDiedralAngle(MG_NOEUD *__tri[2][3])
Definition: CAD4FE_Geometric_Tools.cpp:659
CAD4FE::PolyCurve::Parameter_SToRefEdgeT
void Parameter_SToRefEdgeT(double __s, unsigned *__iEdge, double *__t, double *__dt, bool __curvilinearLength)
Definition: CAD4FE_PolyCurve.cpp:445
ot_algorithme_geometrique.h
MG_SURFACE::get_vmin
virtual double get_vmin()
Definition: mg_surface.cpp:66
CAD4FE::GeometricTools::MG_TOPO_GetColor
static int MG_TOPO_GetColor(MG_ELEMENT_TOPOLOGIQUE *ele, double &)
Definition: CAD4FE_Geometric_Tools.cpp:687
OT_DECALAGE_PARAMETRE::calcul_decalage_parametre_u
double calcul_decalage_parametre_u(double par)
Definition: ot_decalage_parametre.cpp:35
OT_VECTEUR_3D::get_z
virtual double get_z(void) const
Definition: ot_mathematique.cpp:429
CAD4FE::GeometricTools::MG_ARETE_Contains_MG_SOMMET
static bool MG_ARETE_Contains_MG_SOMMET(MG_ARETE *__edge, MG_SOMMET *__vertex)
Definition: CAD4FE_Geometric_Tools.cpp:480
CAD4FE
Definition: CAD4FE_ClosestPoint_Segment_MG_ARETE.h:34
OT_VECTEUR_3D::get_longueur
virtual double get_longueur(void) const
Definition: ot_mathematique.cpp:483
CAD4FE::MCEdge::GetPolyCurve
PolyCurve * GetPolyCurve()
Definition: CAD4FE_MCEdge.cpp:98
OT_DECALAGE_PARAMETRE::decalage_parametre_v
double decalage_parametre_v(double par, double dpar)
Definition: ot_decalage_parametre.cpp:75
CAD4FE::GeometricTools::TangentPlaneFrame
static OT_MATRICE_3D TangentPlaneFrame(MG_FACE *__sigma, double uv[2])
Definition: CAD4FE_Geometric_Tools.cpp:344
MG_ARETE::deriver
virtual void deriver(double t, double *xyz)
Definition: mg_arete.cpp:149
MG_ARETE
Definition: mg_arete.h:36
MG_FACE
Definition: mg_face.h:34
CAD4FE::MCFace
Definition: CAD4FE_MCFace.h:50
MG_ELEMENT_TOPOLOGIQUE::get_valeur_ccf
virtual bool get_valeur_ccf(char *nom, double &val)
Definition: mg_element_topologique.cpp:310
CAD4FE_MCFace.h
MG_ARETE::get_cosommet1
virtual class MG_COSOMMET * get_cosommet1(void)
Definition: mg_arete.cpp:81
MG_SOMMET
Definition: mg_sommet.h:35
CAD4FE::GeometricTools::FacePointCorrection
static double FacePointCorrection(MG_FACE *__face, double __xyz[3], double __uv1[2])
Definition: CAD4FE_Geometric_Tools.cpp:523
OT_MATRICE_3D::inverse
OT_MATRICE_3D inverse() const
Definition: ot_mathematique.cpp:767
MG_COARETE::get_arete
virtual MG_ARETE * get_arete(void)
Definition: mg_coarete.cpp:58
mg_face.h
OT_DECALAGE_PARAMETRE
Definition: ot_decalage_parametre.h:28
MG_FACE::get_EFG
virtual void get_EFG(double *uv, double &E, double &F, double &G)
Definition: mg_face.cpp:264
MG_SURFACE::get_umin
virtual double get_umin()
Definition: mg_surface.cpp:56
MG_POINT::evaluer
virtual void evaluer(double *xyz)=0
MG_FACE::get_surface
virtual MG_SURFACE * get_surface(void)
Definition: mg_face.cpp:109
OT_MATRICE_3D::change_vecteur1
void change_vecteur1(OT_VECTEUR_3D v)
Definition: ot_mathematique.cpp:802
MG_ARETE::get_mg_coarete
virtual MG_COARETE * get_mg_coarete(int num)
Definition: mg_arete.cpp:228
CAD4FE::GeometricTools::MG_SOMMET_GetAdjacent_MG_FACE
static void MG_SOMMET_GetAdjacent_MG_FACE(MG_SOMMET *__refVertex, std::set< MG_FACE * > &__adjacentfaces)
Definition: CAD4FE_Geometric_Tools.cpp:507