#include <math.h>
Go to the source code of this file.
|
| 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) |
| |
◆ 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];
◆ 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
40
41
43
44
46
48 return 0;
49 inv_det = 1.0 / det;
50
51
53
54
56 if (*u < 0.0 || *u > 1.0)
57 return 0;
58
59
61
62
64 if (*v < 0.0 || *u + *v > 1.0)
65 return 0;
66
67
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
86
87
89
90
92
94 {
95
97
98
100 if (*u < 0.0 || *u > det)
101 return 0;
102
103
105
106
108 if (*v < 0.0 || *u + *v > det)
109 return 0;
110
111 }
113 {
114
116
117
119
120
121 if (*u > 0.0 || *u < det)
122 return 0;
123
124
126
127
129 if (*v > 0.0 || *u + *v < det)
130 return 0;
131 }
132 else return 0;
133
134
135 inv_det = 1.0 / det;
136
137
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().
◆ 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
157
158
160
161
163
164
166 inv_det = 1.0 / det;
167
169 {
170
172 if (*u < 0.0 || *u > det)
173 return 0;
174
175
177
178
180 if (*v < 0.0 || *u + *v > det)
181 return 0;
182
183 }
185 {
186
188 if (*u > 0.0 || *u < det)
189 return 0;
190
191
193
194
196 if (*v > 0.0 || *u + *v < det)
197 return 0;
198 }
199 else return 0;
200
201
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
222
223
225
226
228
229
231 inv_det = 1.0 / det;
232
234
236 {
238 if (*u < 0.0 || *u > det)
239 return 0;
240
241
243 if (*v < 0.0 || *u + *v > det)
244 return 0;
245
246 }
248 {
249
251 if (*u > 0.0 || *u < det)
252 return 0;
253
254
256 if (*v > 0.0 || *u + *v < det)
257 return 0;
258 }
259 else return 0;
260
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.