Prusa Slicer 2.6.0
Loading...
Searching...
No Matches
raytri.c File Reference
#include <math.h>
+ Include dependency graph for raytri.c:
+ This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Macros

#define IGL_RAY_TRI_C
 
#define IGL_RAY_TRI_EPSILON   0.000001
 
#define IGL_RAY_TRI_CROSS(dest, v1, v2)
 
#define IGL_RAY_TRI_DOT(v1, v2)   (v1[0]*v2[0]+v1[1]*v2[1]+v1[2]*v2[2])
 
#define IGL_RAY_TRI_SUB(dest, v1, v2)
 

Functions

int intersect_triangle (double orig[3], double dir[3], double vert0[3], double vert1[3], double vert2[3], double *t, double *u, double *v)
 
int intersect_triangle1 (double orig[3], double dir[3], double vert0[3], double vert1[3], double vert2[3], double *t, double *u, double *v)
 
int intersect_triangle2 (double orig[3], double dir[3], double vert0[3], double vert1[3], double vert2[3], double *t, double *u, double *v)
 
int intersect_triangle3 (double orig[3], double dir[3], double vert0[3], double vert1[3], double vert2[3], double *t, double *u, double *v)
 

Macro Definition Documentation

◆ IGL_RAY_TRI_C

#define IGL_RAY_TRI_C

◆ IGL_RAY_TRI_CROSS

#define IGL_RAY_TRI_CROSS (   dest,
  v1,
  v2 
)
Value:
dest[0]=v1[1]*v2[2]-v1[2]*v2[1]; \
dest[1]=v1[2]*v2[0]-v1[0]*v2[2]; \
dest[2]=v1[0]*v2[1]-v1[1]*v2[0];

◆ IGL_RAY_TRI_DOT

#define IGL_RAY_TRI_DOT (   v1,
  v2 
)    (v1[0]*v2[0]+v1[1]*v2[1]+v1[2]*v2[2])

◆ IGL_RAY_TRI_EPSILON

#define IGL_RAY_TRI_EPSILON   0.000001

◆ IGL_RAY_TRI_SUB

#define IGL_RAY_TRI_SUB (   dest,
  v1,
  v2 
)
Value:
dest[0]=v1[0]-v2[0]; \
dest[1]=v1[1]-v2[1]; \
dest[2]=v1[2]-v2[2];

Function Documentation

◆ intersect_triangle()

int intersect_triangle ( double  orig[3],
double  dir[3],
double  vert0[3],
double  vert1[3],
double  vert2[3],
double *  t,
double *  u,
double *  v 
)
inline
33{
34 double edge1[3], edge2[3], tvec[3], pvec[3], qvec[3];
35 double det,inv_det;
36
37 /* find vectors for two edges sharing vert0 */
38 IGL_RAY_TRI_SUB(edge1, vert1, vert0);
39 IGL_RAY_TRI_SUB(edge2, vert2, vert0);
40
41 /* begin calculating determinant - also used to calculate U parameter */
42 IGL_RAY_TRI_CROSS(pvec, dir, edge2);
43
44 /* if determinant is near zero, ray lies in plane of triangle */
45 det = IGL_RAY_TRI_DOT(edge1, pvec);
46
47 if (det > -IGL_RAY_TRI_EPSILON && det < IGL_RAY_TRI_EPSILON)
48 return 0;
49 inv_det = 1.0 / det;
50
51 /* calculate distance from vert0 to ray origin */
52 IGL_RAY_TRI_SUB(tvec, orig, vert0);
53
54 /* calculate U parameter and test bounds */
55 *u = IGL_RAY_TRI_DOT(tvec, pvec) * inv_det;
56 if (*u < 0.0 || *u > 1.0)
57 return 0;
58
59 /* prepare to test V parameter */
60 IGL_RAY_TRI_CROSS(qvec, tvec, edge1);
61
62 /* calculate V parameter and test bounds */
63 *v = IGL_RAY_TRI_DOT(dir, qvec) * inv_det;
64 if (*v < 0.0 || *u + *v > 1.0)
65 return 0;
66
67 /* calculate t, ray intersects triangle */
68 *t = IGL_RAY_TRI_DOT(edge2, qvec) * inv_det;
69
70 return 1;
71}
#define IGL_RAY_TRI_DOT(v1, v2)
Definition raytri.c:23
#define IGL_RAY_TRI_EPSILON
Definition raytri.c:18
#define IGL_RAY_TRI_SUB(dest, v1, v2)
Definition raytri.c:24
#define IGL_RAY_TRI_CROSS(dest, v1, v2)
Definition raytri.c:19

References IGL_RAY_TRI_CROSS, IGL_RAY_TRI_DOT, IGL_RAY_TRI_EPSILON, and IGL_RAY_TRI_SUB.

◆ intersect_triangle1()

int intersect_triangle1 ( double  orig[3],
double  dir[3],
double  vert0[3],
double  vert1[3],
double  vert2[3],
double *  t,
double *  u,
double *  v 
)
inline
79{
80 double edge1[3], edge2[3], tvec[3], pvec[3], qvec[3];
81 double det,inv_det;
82
83 /* find vectors for two edges sharing vert0 */
84 IGL_RAY_TRI_SUB(edge1, vert1, vert0);
85 IGL_RAY_TRI_SUB(edge2, vert2, vert0);
86
87 /* begin calculating determinant - also used to calculate U parameter */
88 IGL_RAY_TRI_CROSS(pvec, dir, edge2);
89
90 /* if determinant is near zero, ray lies in plane of triangle */
91 det = IGL_RAY_TRI_DOT(edge1, pvec);
92
93 if (det > IGL_RAY_TRI_EPSILON)
94 {
95 /* calculate distance from vert0 to ray origin */
96 IGL_RAY_TRI_SUB(tvec, orig, vert0);
97
98 /* calculate U parameter and test bounds */
99 *u = IGL_RAY_TRI_DOT(tvec, pvec);
100 if (*u < 0.0 || *u > det)
101 return 0;
102
103 /* prepare to test V parameter */
104 IGL_RAY_TRI_CROSS(qvec, tvec, edge1);
105
106 /* calculate V parameter and test bounds */
107 *v = IGL_RAY_TRI_DOT(dir, qvec);
108 if (*v < 0.0 || *u + *v > det)
109 return 0;
110
111 }
112 else if(det < -IGL_RAY_TRI_EPSILON)
113 {
114 /* calculate distance from vert0 to ray origin */
115 IGL_RAY_TRI_SUB(tvec, orig, vert0);
116
117 /* calculate U parameter and test bounds */
118 *u = IGL_RAY_TRI_DOT(tvec, pvec);
119/* printf("*u=%f\n",(float)*u); */
120/* printf("det=%f\n",det); */
121 if (*u > 0.0 || *u < det)
122 return 0;
123
124 /* prepare to test V parameter */
125 IGL_RAY_TRI_CROSS(qvec, tvec, edge1);
126
127 /* calculate V parameter and test bounds */
128 *v = IGL_RAY_TRI_DOT(dir, qvec) ;
129 if (*v > 0.0 || *u + *v < det)
130 return 0;
131 }
132 else return 0; /* ray is parallel to the plane of the triangle */
133
134
135 inv_det = 1.0 / det;
136
137 /* calculate t, ray intersects triangle */
138 *t = IGL_RAY_TRI_DOT(edge2, qvec) * inv_det;
139 (*u) *= inv_det;
140 (*v) *= inv_det;
141
142 return 1;
143}

References IGL_RAY_TRI_CROSS, IGL_RAY_TRI_DOT, IGL_RAY_TRI_EPSILON, and IGL_RAY_TRI_SUB.

Referenced by igl::ray_mesh_intersect().

+ Here is the caller graph for this function:

◆ intersect_triangle2()

int intersect_triangle2 ( double  orig[3],
double  dir[3],
double  vert0[3],
double  vert1[3],
double  vert2[3],
double *  t,
double *  u,
double *  v 
)
inline
150{
151 double edge1[3], edge2[3], tvec[3], pvec[3], qvec[3];
152 double det,inv_det;
153
154 /* find vectors for two edges sharing vert0 */
155 IGL_RAY_TRI_SUB(edge1, vert1, vert0);
156 IGL_RAY_TRI_SUB(edge2, vert2, vert0);
157
158 /* begin calculating determinant - also used to calculate U parameter */
159 IGL_RAY_TRI_CROSS(pvec, dir, edge2);
160
161 /* if determinant is near zero, ray lies in plane of triangle */
162 det = IGL_RAY_TRI_DOT(edge1, pvec);
163
164 /* calculate distance from vert0 to ray origin */
165 IGL_RAY_TRI_SUB(tvec, orig, vert0);
166 inv_det = 1.0 / det;
167
168 if (det > IGL_RAY_TRI_EPSILON)
169 {
170 /* calculate U parameter and test bounds */
171 *u = IGL_RAY_TRI_DOT(tvec, pvec);
172 if (*u < 0.0 || *u > det)
173 return 0;
174
175 /* prepare to test V parameter */
176 IGL_RAY_TRI_CROSS(qvec, tvec, edge1);
177
178 /* calculate V parameter and test bounds */
179 *v = IGL_RAY_TRI_DOT(dir, qvec);
180 if (*v < 0.0 || *u + *v > det)
181 return 0;
182
183 }
184 else if(det < -IGL_RAY_TRI_EPSILON)
185 {
186 /* calculate U parameter and test bounds */
187 *u = IGL_RAY_TRI_DOT(tvec, pvec);
188 if (*u > 0.0 || *u < det)
189 return 0;
190
191 /* prepare to test V parameter */
192 IGL_RAY_TRI_CROSS(qvec, tvec, edge1);
193
194 /* calculate V parameter and test bounds */
195 *v = IGL_RAY_TRI_DOT(dir, qvec) ;
196 if (*v > 0.0 || *u + *v < det)
197 return 0;
198 }
199 else return 0; /* ray is parallel to the plane of the triangle */
200
201 /* calculate t, ray intersects triangle */
202 *t = IGL_RAY_TRI_DOT(edge2, qvec) * inv_det;
203 (*u) *= inv_det;
204 (*v) *= inv_det;
205
206 return 1;
207}

References IGL_RAY_TRI_CROSS, IGL_RAY_TRI_DOT, IGL_RAY_TRI_EPSILON, and IGL_RAY_TRI_SUB.

◆ intersect_triangle3()

int intersect_triangle3 ( double  orig[3],
double  dir[3],
double  vert0[3],
double  vert1[3],
double  vert2[3],
double *  t,
double *  u,
double *  v 
)
inline
215{
216 double edge1[3], edge2[3], tvec[3], pvec[3], qvec[3];
217 double det,inv_det;
218
219 /* find vectors for two edges sharing vert0 */
220 IGL_RAY_TRI_SUB(edge1, vert1, vert0);
221 IGL_RAY_TRI_SUB(edge2, vert2, vert0);
222
223 /* begin calculating determinant - also used to calculate U parameter */
224 IGL_RAY_TRI_CROSS(pvec, dir, edge2);
225
226 /* if determinant is near zero, ray lies in plane of triangle */
227 det = IGL_RAY_TRI_DOT(edge1, pvec);
228
229 /* calculate distance from vert0 to ray origin */
230 IGL_RAY_TRI_SUB(tvec, orig, vert0);
231 inv_det = 1.0 / det;
232
233 IGL_RAY_TRI_CROSS(qvec, tvec, edge1);
234
235 if (det > IGL_RAY_TRI_EPSILON)
236 {
237 *u = IGL_RAY_TRI_DOT(tvec, pvec);
238 if (*u < 0.0 || *u > det)
239 return 0;
240
241 /* calculate V parameter and test bounds */
242 *v = IGL_RAY_TRI_DOT(dir, qvec);
243 if (*v < 0.0 || *u + *v > det)
244 return 0;
245
246 }
247 else if(det < -IGL_RAY_TRI_EPSILON)
248 {
249 /* calculate U parameter and test bounds */
250 *u = IGL_RAY_TRI_DOT(tvec, pvec);
251 if (*u > 0.0 || *u < det)
252 return 0;
253
254 /* calculate V parameter and test bounds */
255 *v = IGL_RAY_TRI_DOT(dir, qvec) ;
256 if (*v > 0.0 || *u + *v < det)
257 return 0;
258 }
259 else return 0; /* ray is parallel to the plane of the triangle */
260
261 *t = IGL_RAY_TRI_DOT(edge2, qvec) * inv_det;
262 (*u) *= inv_det;
263 (*v) *= inv_det;
264
265 return 1;
266}

References IGL_RAY_TRI_CROSS, IGL_RAY_TRI_DOT, IGL_RAY_TRI_EPSILON, and IGL_RAY_TRI_SUB.