MAGiC  V5.0
Mailleurs Automatiques de Géometries intégrés à la Cao
ot_algorithme_geometrique.h
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 //####// ot_algorithme_geometrique.h
15 //####//
16 //####//------------------------------------------------------------
17 //####//------------------------------------------------------------
18 //####// COPYRIGHT 2000-2024
19 //####// jeu 13 jun 2024 11:53:59 EDT
20 //####//------------------------------------------------------------
21 //####//------------------------------------------------------------
22 
23 #ifndef ot_algorithme_geometriqueH
24 #define ot_algorithme_geometriqueH
25 
26 
27 #include <math.h>
28 
29 
30 
31 
33 public:
41  static void Rot3D_Point_Axe_Angle
42 (double p[3],double theta, double r[3], double q[3]);
43  static double Dist3D_Point_Plane
44 (double *norm, double *root, double *pnt);
45  static double Dist3D_Point_Plan
46 (double *norm, double *root, double *pnt);
47 
48  static void Proj3D_Point_Plan(double *norm, double *root, double *pnt, double *proj_pnt);
49 
50 /*idem*/
51  static double Closest_Point_to_Plane_3d(double *norm, double *root, double *pnt, double *res);
52 
53  static int Intr3D_Plane_Plane(double __N1[3],double __P1[3],double __N2[3],double __P2[3],double __D[3]);
54  static int Closest_Point_to_Line_3d (double __lineOrigin[3], double __lineDirection[3], double __p[3], double _r[3]);
55  static int Closest_Point_to_Segment_3d (double a[3], double b[3], double c[3], double d[3]);
56  static int Closest_Point_to_Segment_3d (double a[3], double b[3], double c[3], double d[3], double *t);
57 
58  static int Closest_Point_to_Segment_2d( double * SP0, double * SP1, double * P, double * t, double result[2]);
59  static double Dist2D_Point_Segment (double a[2], double b[2], double c[2]);
60 
61  static int intersect2D_SegSeg( double S1P0[2], double S1P1[2], double S2P0[2], double S2P1[2], double __intrPoint[2], double __intrEndPointSeg[2]);
62  static double Dist3D_Point_Segment
63 (double a[3], double b[3], double c[3]);
64  static int Intr3D_Segment_Plan
65 (double P0[3], double P1[3], double O[3], double V[3], double *p_coef, double EPSILON=1E-8);
66  static int Dist3D_Segment_Plan
67 (double P0[3], double P1[3], double O[3], double V[3], double *p_coef, double *distance, double EPSILON);
68 
69  static void Dist3D_Segment_Segment( double *S11, double *S12, double *S21, double *S22, double *dist, double *P1, double *P2);
70 
71  inline static void CROSS_PROD3(double a[3], double b[3], double c[3]) {
72  c[0] = a[1]*b[2]-a[2]*b[1];
73  c[1] = -a[0]*b[2]+a[2]*b[0];
74  c[2] = +a[0]*b[1]-a[1]*b[0];
75  }
76  inline static void VEC3_CROSS_VEC3(double a[3], double b[3], double c[3]) {
77  c[0] = a[1]*b[2]-a[2]*b[1];
78  c[1] = -a[0]*b[2]+a[2]*b[0];
79  c[2] = +a[0]*b[1]-a[1]*b[0];
80  }
81  inline static void VEC3_MINUS_VEC3(double a[3], double b[3], double c[3]) {
82  c[0] = a[0]-b[0];
83  c[1] = a[1]-b[1];
84  c[2] = a[2]-b[2];
85  }
86  inline static void VEC3_PLUS_VEC3(double a[3], double b[3], double c[3]) {
87  c[0] = a[0]+b[0];
88  c[1] = a[1]+b[1];
89  c[2] = a[2]+b[2];
90  }
91  inline static double VEC3_DOT_VEC3(double a[3], double b[3]) {
92  return a[0]*b[0]+ a[1]*b[1]+ a[2]*b[2];
93  }
94  inline static double VEC3_NORM(double a[3]) {
95  return sqrt(a[0]*a[0]+a[1]*a[1]+a[2]*a[2]);
96  }
97  inline static double VEC3_NORM2(double a[3]) {
98  return (a[0]*a[0]+a[1]*a[1]+a[2]*a[2]);
99  }
100  inline static void VEC3_NORMALIZE(double a[3]) {
101  double norm_vec3_normalize = 1/sqrt(a[0]*a[0]+a[1]*a[1]+a[2]*a[2]);
102  a[0]*=norm_vec3_normalize;
103  a[1]*=norm_vec3_normalize;
104  a[2]*=norm_vec3_normalize;
105  }
106  inline static void VEC3_ASSIGN_VEC3(double a[3], double b[3]) {
107  b[0]=a[0];
108  b[1]=a[1];
109  b[2]=a[2];
110  }
111  inline static void VEC3_DIVIDE_SCALAR(double a[3], double b, double c[3]) {
112  double tmp_inv_divide = 1/b;
113  c[0]=a[0]*tmp_inv_divide;
114  c[1]=a[1]*tmp_inv_divide;
115  c[2]=a[2]*tmp_inv_divide;
116  }
117  inline static void VEC3_MULTIPLY_SCALAR(double a[3], double b, double c[3]) {
118  c[0]=a[0]*b;
119  c[1]=a[1]*b;
120  c[2]=a[2]*b;
121  }
122  inline static void VEC3_REVERSE(double a[3]) {
123  a[0]=-a[0];
124  a[1]=-a[1];
125  a[2]=-a[2];
126  }
127  inline static double VEC3_DISTANCE_VEC3(double a[3],double b[3]) {
128  double sqaredDist = (a[0]-b[0])*(a[0]-b[0]) + (a[1]-b[1])*(a[1]-b[1]) + (a[2]-b[2])*(a[2]-b[2]);
129  if (sqaredDist != 0.0) return sqrt(sqaredDist);
130  else return 0;
131  }
132  inline static double VEC3_DISTANCE2_VEC3(double a[3],double b[3]) {
133  return ((a[0]-b[0])*(a[0]-b[0]) + (a[1]-b[1])*(a[1]-b[1]) + (a[2]-b[2])*(a[2]-b[2]));
134  }
135 
136  inline static double PERP_PROD2(double a[2], double b[2]) {
137  return a[0]*b[1]-a[1]*b[0];
138  }
139  inline static void VEC2_MINUS_VEC2(double a[2], double b[2], double c[2]) {
140  c[0] = a[0]-b[0];
141  c[1] = a[1]-b[1];
142  }
143  inline static void VEC2_PLUS_VEC2(double a[2], double b[2], double c[2]) {
144  c[0] = a[0]+b[0];
145  c[1] = a[1]+b[1];
146  }
147  inline static double VEC2_DOT_VEC2(double a[2], double b[2]) {
148  return a[0]*b[0]+ a[1]*b[1];
149  }
150  inline static double VEC2_NORM(double a[2]) {
151  return sqrt(a[0]*a[0]+a[1]*a[1]);
152  }
153  inline static double VEC2_NORM2(double a[2]) {
154  return (a[0]*a[0]+a[1]*a[1]);
155  }
156  inline static void VEC2_NORMALIZE(double a[2]) {
157  double norm_vec2_normalize = 1/sqrt(a[0]*a[0]+a[1]*a[1]);
158  a[0]*=norm_vec2_normalize;
159  a[1]*=norm_vec2_normalize;
160  }
161  inline static void VEC2_ASSIGN_VEC2(double a[2], double b[2]) {
162  b[0]=a[0];
163  b[1]=a[1];
164  }
165  inline static void VEC2_DIVIDE_SCALAR(double a[2], double b, double c[2]) {
166  double tmp_inv_divide = 1/b;
167  c[0]=a[0]*tmp_inv_divide;
168  c[1]=a[1]*tmp_inv_divide;
169  }
170  inline static void VEC2_MULTIPLY_SCALAR(double a[2], double b, double c[2]) {
171  c[0]=a[0]*b;
172  c[1]=a[1]*b;
173  }
174  inline static void VEC2_REVERSE(double a[2]) {
175  a[0]=-a[0];
176  a[1]=-a[1];
177  }
178  inline static double VEC2_DISTANCE_VEC2(double a[2],double b[2]) {
179  return sqrt(pow(a[0]-b[0],2) + pow(a[1]-b[1],2));
180  }
181  inline static double VEC2_DISTANCE2_VEC2(double a[2],double b[2]) {
182  return (pow(a[0]-b[0],2) + pow(a[1]-b[1],2));
183  }
184  inline static double VEC2_ABSOLUTE_ANGLE_VEC2(double __uv1[2], double __uv2[2]) {
185  return acos(fabs(__uv1[0]*__uv2[0]+__uv1[1]*__uv2[1])/(sqrt(__uv1[0]*__uv1[0]+__uv1[1]*__uv1[1])*sqrt(__uv2[0]*__uv2[0]+__uv2[1]*__uv2[1])));
186  }
187 
188 
189  static void PROJECT2D_POINT_SEGMENT(double seg_u0, double seg_v0, double seg_u1, double seg_v1, double pt_u, double pt_v, double * coef) ;
190 
191  static double pbase_Plane( double P[3], double planeNormal[3], double planeRootPoint[3], double B[3]);
192 
193 
194  static double Angle3D_Segment_Segment
195 (double __v0[3], double __v1[3], double __v2[3]);
196 
197  static int intersect_RayTriangle( double RP0[3], double dir[3], double TV0[3], double TV1[3], double TV2[3], double I[3], double *IT=0 );
198 
199 
200  static int project_PointTriangle( double P0[3], double TV0[3], double TV1[3], double TV2[3], double I[3], double *IT=0 );
201 
202  static int intersect_SegTriangle( double SP0[3], double SP1[3], double TV0[3], double TV1[3], double TV2[3], double I[3], double *IT=0 );
203 
204  static double Area_Triangle(double TV0[3], double TV1[3], double TV2[3]);
205 
206 };
207 
208 #endif
209 
OT_ALGORITHME_GEOMETRIQUE::Dist2D_Point_Segment
static double Dist2D_Point_Segment(double a[2], double b[2], double c[2])
Definition: ot_algorithme_geometrique.cpp:288
OT_ALGORITHME_GEOMETRIQUE::VEC2_DISTANCE2_VEC2
static double VEC2_DISTANCE2_VEC2(double a[2], double b[2])
Definition: ot_algorithme_geometrique.h:181
OT_ALGORITHME_GEOMETRIQUE::CROSS_PROD3
static void CROSS_PROD3(double a[3], double b[3], double c[3])
Definition: ot_algorithme_geometrique.h:71
OT_ALGORITHME_GEOMETRIQUE::VEC2_NORMALIZE
static void VEC2_NORMALIZE(double a[2])
Definition: ot_algorithme_geometrique.h:156
OT_ALGORITHME_GEOMETRIQUE::Closest_Point_to_Segment_2d
static int Closest_Point_to_Segment_2d(double *SP0, double *SP1, double *P, double *t, double result[2])
Definition: ot_algorithme_geometrique.cpp:246
OT_ALGORITHME_GEOMETRIQUE::VEC2_DIVIDE_SCALAR
static void VEC2_DIVIDE_SCALAR(double a[2], double b, double c[2])
Definition: ot_algorithme_geometrique.h:165
OT_ALGORITHME_GEOMETRIQUE::VEC3_CROSS_VEC3
static void VEC3_CROSS_VEC3(double a[3], double b[3], double c[3])
Definition: ot_algorithme_geometrique.h:76
a
#define a(i, j)
OT_ALGORITHME_GEOMETRIQUE::intersect_RayTriangle
static int intersect_RayTriangle(double RP0[3], double dir[3], double TV0[3], double TV1[3], double TV2[3], double I[3], double *IT=0)
Definition: ot_algorithme_geometrique.cpp:609
OT_ALGORITHME_GEOMETRIQUE::VEC3_PLUS_VEC3
static void VEC3_PLUS_VEC3(double a[3], double b[3], double c[3])
Definition: ot_algorithme_geometrique.h:86
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
OT_ALGORITHME_GEOMETRIQUE::Dist3D_Point_Segment
static double Dist3D_Point_Segment(double a[3], double b[3], double c[3])
Definition: ot_algorithme_geometrique.cpp:299
OT_ALGORITHME_GEOMETRIQUE::VEC2_MULTIPLY_SCALAR
static void VEC2_MULTIPLY_SCALAR(double a[2], double b, double c[2])
Definition: ot_algorithme_geometrique.h:170
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
OT_ALGORITHME_GEOMETRIQUE::VEC2_DOT_VEC2
static double VEC2_DOT_VEC2(double a[2], double b[2])
Definition: ot_algorithme_geometrique.h:147
OT_ALGORITHME_GEOMETRIQUE::VEC3_DOT_VEC3
static double VEC3_DOT_VEC3(double a[3], double b[3])
Definition: ot_algorithme_geometrique.h:91
OT_ALGORITHME_GEOMETRIQUE::Closest_Point_to_Line_3d
static int Closest_Point_to_Line_3d(double __lineOrigin[3], double __lineDirection[3], double __p[3], double _r[3])
Definition: ot_algorithme_geometrique.cpp:163
OT_ALGORITHME_GEOMETRIQUE::Angle3D_Segment_Segment
static double Angle3D_Segment_Segment(double __v0[3], double __v1[3], double __v2[3])
Definition: ot_algorithme_geometrique.cpp:458
OT_ALGORITHME_GEOMETRIQUE::VEC3_DIVIDE_SCALAR
static void VEC3_DIVIDE_SCALAR(double a[3], double b, double c[3])
Definition: ot_algorithme_geometrique.h:111
OT_ALGORITHME_GEOMETRIQUE::Dist3D_Point_Plane
static double Dist3D_Point_Plane(double *norm, double *root, double *pnt)
Definition: ot_algorithme_geometrique.cpp:32
OT_ALGORITHME_GEOMETRIQUE::Area_Triangle
static double Area_Triangle(double TV0[3], double TV1[3], double TV2[3])
Definition: ot_algorithme_geometrique.cpp:754
OT_ALGORITHME_GEOMETRIQUE::VEC3_NORM
static double VEC3_NORM(double a[3])
Definition: ot_algorithme_geometrique.h:94
OT_ALGORITHME_GEOMETRIQUE::VEC2_PLUS_VEC2
static void VEC2_PLUS_VEC2(double a[2], double b[2], double c[2])
Definition: ot_algorithme_geometrique.h:143
OT_ALGORITHME_GEOMETRIQUE::VEC3_NORMALIZE
static void VEC3_NORMALIZE(double a[3])
Definition: ot_algorithme_geometrique.h:100
OT_ALGORITHME_GEOMETRIQUE::pbase_Plane
static double pbase_Plane(double P[3], double planeNormal[3], double planeRootPoint[3], double B[3])
Definition: ot_algorithme_geometrique.cpp:433
OT_ALGORITHME_GEOMETRIQUE::VEC2_ASSIGN_VEC2
static void VEC2_ASSIGN_VEC2(double a[2], double b[2])
Definition: ot_algorithme_geometrique.h:161
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
OT_ALGORITHME_GEOMETRIQUE::VEC2_MINUS_VEC2
static void VEC2_MINUS_VEC2(double a[2], double b[2], double c[2])
Definition: ot_algorithme_geometrique.h:139
OT_ALGORITHME_GEOMETRIQUE::PROJECT2D_POINT_SEGMENT
static void PROJECT2D_POINT_SEGMENT(double seg_u0, double seg_v0, double seg_u1, double seg_v1, double pt_u, double pt_v, double *coef)
OT_ALGORITHME_GEOMETRIQUE::Closest_Point_to_Segment_3d
static int Closest_Point_to_Segment_3d(double a[3], double b[3], double c[3], double d[3])
Definition: ot_algorithme_geometrique.cpp:177
OT_ALGORITHME_GEOMETRIQUE::VEC2_ABSOLUTE_ANGLE_VEC2
static double VEC2_ABSOLUTE_ANGLE_VEC2(double __uv1[2], double __uv2[2])
Definition: ot_algorithme_geometrique.h:184
OT_ALGORITHME_GEOMETRIQUE::intersect_SegTriangle
static int intersect_SegTriangle(double SP0[3], double SP1[3], double TV0[3], double TV1[3], double TV2[3], double I[3], double *IT=0)
Definition: ot_algorithme_geometrique.cpp:709
OT_ALGORITHME_GEOMETRIQUE::VEC3_MULTIPLY_SCALAR
static void VEC3_MULTIPLY_SCALAR(double a[3], double b, double c[3])
Definition: ot_algorithme_geometrique.h:117
OT_ALGORITHME_GEOMETRIQUE::Rot3D_Point_Axe_Angle
static void Rot3D_Point_Axe_Angle(double p[3], double theta, double r[3], double q[3])
Definition: ot_algorithme_geometrique.cpp:489
V
void V(MCAA *mcaa)
Definition: CAD4FE_MCAA.cpp:1794
OT_ALGORITHME_GEOMETRIQUE
Definition: ot_algorithme_geometrique.h:32
OT_ALGORITHME_GEOMETRIQUE::VEC3_REVERSE
static void VEC3_REVERSE(double a[3])
Definition: ot_algorithme_geometrique.h:122
acos
double2 acos(double2 &val)
Definition: ot_doubleprecision.cpp:224
OT_ALGORITHME_GEOMETRIQUE::Dist3D_Segment_Segment
static void Dist3D_Segment_Segment(double *S11, double *S12, double *S21, double *S22, double *dist, double *P1, double *P2)
Definition: ot_algorithme_geometrique.cpp:58
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
OT_ALGORITHME_GEOMETRIQUE::VEC2_DISTANCE_VEC2
static double VEC2_DISTANCE_VEC2(double a[2], double b[2])
Definition: ot_algorithme_geometrique.h:178
OT_ALGORITHME_GEOMETRIQUE::VEC2_NORM2
static double VEC2_NORM2(double a[2])
Definition: ot_algorithme_geometrique.h:153
OT_ALGORITHME_GEOMETRIQUE::Dist3D_Point_Plan
static double Dist3D_Point_Plan(double *norm, double *root, double *pnt)
Definition: ot_algorithme_geometrique.cpp:156
OT_ALGORITHME_GEOMETRIQUE::VEC3_DISTANCE2_VEC3
static double VEC3_DISTANCE2_VEC3(double a[3], double b[3])
Definition: ot_algorithme_geometrique.h:132
res
#define res(i, j)
OT_ALGORITHME_GEOMETRIQUE::VEC2_REVERSE
static void VEC2_REVERSE(double a[2])
Definition: ot_algorithme_geometrique.h:174
OT_ALGORITHME_GEOMETRIQUE::VEC3_NORM2
static double VEC3_NORM2(double a[3])
Definition: ot_algorithme_geometrique.h:97
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
OT_ALGORITHME_GEOMETRIQUE::VEC2_NORM
static double VEC2_NORM(double a[2])
Definition: ot_algorithme_geometrique.h:150
P
#define P(i, j)
OT_ALGORITHME_GEOMETRIQUE::VEC3_ASSIGN_VEC3
static void VEC3_ASSIGN_VEC3(double a[3], double b[3])
Definition: ot_algorithme_geometrique.h:106
OT_ALGORITHME_GEOMETRIQUE::VEC3_DISTANCE_VEC3
static double VEC3_DISTANCE_VEC3(double a[3], double b[3])
Definition: ot_algorithme_geometrique.h:127
OT_ALGORITHME_GEOMETRIQUE::VEC3_MINUS_VEC3
static void VEC3_MINUS_VEC3(double a[3], double b[3], double c[3])
Definition: ot_algorithme_geometrique.h:81
OT_ALGORITHME_GEOMETRIQUE::intersect2D_SegSeg
static int intersect2D_SegSeg(double S1P0[2], double S1P1[2], double S2P0[2], double S2P1[2], double __intrPoint[2], double __intrEndPointSeg[2])
Definition: ot_algorithme_geometrique.cpp:513
OT_ALGORITHME_GEOMETRIQUE::Dist3D_Segment_Plan
static int Dist3D_Segment_Plan(double P0[3], double P1[3], double O[3], double V[3], double *p_coef, double *distance, double EPSILON)
Definition: ot_algorithme_geometrique.cpp:367
OT_ALGORITHME_GEOMETRIQUE::PERP_PROD2
static double PERP_PROD2(double a[2], double b[2])
Definition: ot_algorithme_geometrique.h:136