#include <math.h>
Go to the source code of this file.
Defines | |
#define | ADD(dest, v1, v2) dest[0]=v1[0]+v2[0]; dest[1]=v1[1]+v2[1]; dest[2]=v1[2]+v2[2]; |
#define | COMPUTE_INTERVALS(VV0, VV1, VV2, D0, D1, D2, D0D1, D0D2, isect0, isect1) |
#define | COMPUTE_INTERVALS_ISECTLINE(VERT0, VERT1, VERT2, VV0, VV1, VV2, D0, D1, D2, D0D1, D0D2, isect0, isect1, isectpoint0, isectpoint1) |
#define | CROSS(dest, v1, v2) |
#define | DOT(v1, v2) (v1[0]*v2[0]+v1[1]*v2[1]+v1[2]*v2[2]) |
#define | EDGE_AGAINST_TRI_EDGES(V0, V1, U0, U1, U2) |
#define | EDGE_EDGE_TEST(V0, U0, U1) |
#define | EPSILON 0.000001 |
#define | FABS(x) ((float)fabs(x)) |
#define | ISECT(VV0, VV1, VV2, D0, D1, D2, isect0, isect1) |
#define | MULT(dest, v, factor) dest[0]=factor*v[0]; dest[1]=factor*v[1]; dest[2]=factor*v[2]; |
#define | NEWCOMPUTE_INTERVALS(VV0, VV1, VV2, D0, D1, D2, D0D1, D0D2, A, B, C, X0, X1) |
#define | POINT_IN_TRI(V0, U0, U1, U2) |
#define | SET(dest, src) dest[0]=src[0]; dest[1]=src[1]; dest[2]=src[2]; |
#define | SORT(a, b) |
#define | SORT2(a, b, smallest) |
#define | SUB(dest, v1, v2) dest[0]=v1[0]-v2[0]; dest[1]=v1[1]-v2[1]; dest[2]=v1[2]-v2[2]; |
#define | USE_EPSILON_TEST TRUE |
Functions | |
int | compute_intervals_isectline (float VERT0[3], float VERT1[3], float VERT2[3], float VV0, float VV1, float VV2, float D0, float D1, float D2, float D0D1, float D0D2, float *isect0, float *isect1, float isectpoint0[3], float isectpoint1[3]) |
int | coplanar_tri_tri (float N[3], float V0[3], float V1[3], float V2[3], float U0[3], float U1[3], float U2[3]) |
void | isect2 (float VTX0[3], float VTX1[3], float VTX2[3], float VV0, float VV1, float VV2, float D0, float D1, float D2, float *isect0, float *isect1, float isectpoint0[3], float isectpoint1[3]) |
int | NoDivTriTriIsect (float V0[3], float V1[3], float V2[3], float U0[3], float U1[3], float U2[3]) |
int | tri_tri_intersect (float V0[3], float V1[3], float V2[3], float U0[3], float U1[3], float U2[3]) |
int | tri_tri_intersect_with_isectline (float V0[3], float V1[3], float V2[3], float U0[3], float U1[3], float U2[3], int *coplanar, float isectpt1[3], float isectpt2[3]) |
#define ADD | ( | dest, | |||
v1, | |||||
v2 | ) | dest[0]=v1[0]+v2[0]; dest[1]=v1[1]+v2[1]; dest[2]=v1[2]+v2[2]; |
Definition at line 48 of file tritritest.h.
Referenced by isect2().
#define COMPUTE_INTERVALS | ( | VV0, | |||
VV1, | |||||
VV2, | |||||
D0, | |||||
D1, | |||||
D2, | |||||
D0D1, | |||||
D0D2, | |||||
isect0, | |||||
isect1 | ) |
if(D0D1>0.0f) \ { \ /* here we know that D0D2<=0.0 */ \ /* that is D0, D1 are on the same side, D2 on the other or on the plane */ \ ISECT(VV2,VV0,VV1,D2,D0,D1,isect0,isect1); \ } \ else if(D0D2>0.0f) \ { \ /* here we know that d0d1<=0.0 */ \ ISECT(VV1,VV0,VV2,D1,D0,D2,isect0,isect1); \ } \ else if(D1*D2>0.0f || D0!=0.0f) \ { \ /* here we know that d0d1<=0.0 or that D0!=0.0 */ \ ISECT(VV0,VV1,VV2,D0,D1,D2,isect0,isect1); \ } \ else if(D1!=0.0f) \ { \ ISECT(VV1,VV0,VV2,D1,D0,D2,isect0,isect1); \ } \ else if(D2!=0.0f) \ { \ ISECT(VV2,VV0,VV1,D2,D0,D1,isect0,isect1); \ } \ else \ { \ /* triangles are coplanar */ \ return coplanar_tri_tri(N1,V0,V1,V2,U0,U1,U2); \ }
Definition at line 69 of file tritritest.h.
Referenced by tri_tri_intersect().
#define COMPUTE_INTERVALS_ISECTLINE | ( | VERT0, | |||
VERT1, | |||||
VERT2, | |||||
VV0, | |||||
VV1, | |||||
VV2, | |||||
D0, | |||||
D1, | |||||
D2, | |||||
D0D1, | |||||
D0D2, | |||||
isect0, | |||||
isect1, | |||||
isectpoint0, | |||||
isectpoint1 | ) |
if(D0D1>0.0f) \ { \ /* here we know that D0D2<=0.0 */ \ /* that is D0, D1 are on the same side, D2 on the other or on the plane */ \ isect2(VERT2,VERT0,VERT1,VV2,VV0,VV1,D2,D0,D1,&isect0,&isect1,isectpoint0,isectpoint1); \ }
Definition at line 535 of file tritritest.h.
#define CROSS | ( | dest, | |||
v1, | |||||
v2 | ) |
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];
Definition at line 39 of file tritritest.h.
Referenced by NoDivTriTriIsect(), tri_tri_intersect(), and tri_tri_intersect_with_isectline().
#define DOT | ( | v1, | |||
v2 | ) | (v1[0]*v2[0]+v1[1]*v2[1]+v1[2]*v2[2]) |
Definition at line 44 of file tritritest.h.
Referenced by NoDivTriTriIsect(), tri_tri_intersect(), and tri_tri_intersect_with_isectline().
#define EDGE_AGAINST_TRI_EDGES | ( | V0, | |||
V1, | |||||
U0, | |||||
U1, | |||||
U2 | ) |
{ \ float Ax,Ay,Bx,By,Cx,Cy,e,d,f; \ Ax=V1[i0]-V0[i0]; \ Ay=V1[i1]-V0[i1]; \ /* test edge U0,U1 against V0,V1 */ \ EDGE_EDGE_TEST(V0,U0,U1); \ /* test edge U1,U2 against V0,V1 */ \ EDGE_EDGE_TEST(V0,U1,U2); \ /* test edge U2,U1 against V0,V1 */ \ EDGE_EDGE_TEST(V0,U2,U0); \ }
Definition at line 125 of file tritritest.h.
Referenced by coplanar_tri_tri().
#define EDGE_EDGE_TEST | ( | V0, | |||
U0, | |||||
U1 | ) |
Bx=U0[i0]-U1[i0]; \ By=U0[i1]-U1[i1]; \ Cx=V0[i0]-U0[i0]; \ Cy=V0[i1]-U0[i1]; \ f=Ay*Bx-Ax*By; \ d=By*Cx-Bx*Cy; \ if((f>0 && d>=0 && d<=f) || (f<0 && d<=0 && d>=f)) \ { \ e=Ax*Cy-Ay*Cx; \ if(f>0) \ { \ if(e>=0 && e<=f) return 1; \ } \ else \ { \ if(e<=0 && e>=f) return 1; \ } \ }
Definition at line 105 of file tritritest.h.
#define EPSILON 0.000001 |
Definition at line 35 of file tritritest.h.
Referenced by NoDivTriTriIsect(), tri_tri_intersect(), and tri_tri_intersect_with_isectline().
#define FABS | ( | x | ) | ((float)fabs(x)) |
Definition at line 28 of file tritritest.h.
Referenced by NoDivTriTriIsect().
#define ISECT | ( | VV0, | |||
VV1, | |||||
VV2, | |||||
D0, | |||||
D1, | |||||
D2, | |||||
isect0, | |||||
isect1 | ) |
isect0=VV0+(VV1-VV0)*D0/(D0-D1); \ isect1=VV0+(VV2-VV0)*D0/(D0-D2);
Definition at line 64 of file tritritest.h.
#define MULT | ( | dest, | |||
v, | |||||
factor | ) | dest[0]=factor*v[0]; dest[1]=factor*v[1]; dest[2]=factor*v[2]; |
Definition at line 50 of file tritritest.h.
Referenced by isect2().
#define NEWCOMPUTE_INTERVALS | ( | VV0, | |||
VV1, | |||||
VV2, | |||||
D0, | |||||
D1, | |||||
D2, | |||||
D0D1, | |||||
D0D2, | |||||
A, | |||||
B, | |||||
C, | |||||
X0, | |||||
X1 | ) |
Definition at line 309 of file tritritest.h.
Referenced by NoDivTriTriIsect().
#define POINT_IN_TRI | ( | V0, | |||
U0, | |||||
U1, | |||||
U2 | ) |
{ \ float a,b,c,d0,d1,d2; \ /* is T1 completly inside T2? */ \ /* check if V0 is inside tri(U0,U1,U2) */ \ a=U1[i1]-U0[i1]; \ b=-(U1[i0]-U0[i0]); \ c=-a*U0[i0]-b*U0[i1]; \ d0=a*V0[i0]+b*V0[i1]+c; \ \ a=U2[i1]-U1[i1]; \ b=-(U2[i0]-U1[i0]); \ c=-a*U1[i0]-b*U1[i1]; \ d1=a*V0[i0]+b*V0[i1]+c; \ \ a=U0[i1]-U2[i1]; \ b=-(U0[i0]-U2[i0]); \ c=-a*U2[i0]-b*U2[i1]; \ d2=a*V0[i0]+b*V0[i1]+c; \ if(d0*d1>0.0) \ { \ if(d0*d2>0.0) return 1; \ } \ }
Definition at line 138 of file tritritest.h.
Referenced by coplanar_tri_tri().
#define SET | ( | dest, | |||
src | ) | dest[0]=src[0]; dest[1]=src[1]; dest[2]=src[2]; |
Definition at line 52 of file tritritest.h.
Referenced by tri_tri_intersect_with_isectline().
#define SORT | ( | a, | |||
b | ) |
Definition at line 55 of file tritritest.h.
Referenced by NoDivTriTriIsect(), and tri_tri_intersect().
#define SORT2 | ( | a, | |||
b, | |||||
smallest | ) |
Definition at line 455 of file tritritest.h.
Referenced by tri_tri_intersect_with_isectline().
#define SUB | ( | dest, | |||
v1, | |||||
v2 | ) | dest[0]=v1[0]-v2[0]; dest[1]=v1[1]-v2[1]; dest[2]=v1[2]-v2[2]; |
Definition at line 46 of file tritritest.h.
Referenced by isect2(), NoDivTriTriIsect(), tri_tri_intersect(), and tri_tri_intersect_with_isectline().
#define USE_EPSILON_TEST TRUE |
Definition at line 34 of file tritritest.h.
int compute_intervals_isectline | ( | float | VERT0[3], | |
float | VERT1[3], | |||
float | VERT2[3], | |||
float | VV0, | |||
float | VV1, | |||
float | VV2, | |||
float | D0, | |||
float | D1, | |||
float | D2, | |||
float | D0D1, | |||
float | D0D2, | |||
float * | isect0, | |||
float * | isect1, | |||
float | isectpoint0[3], | |||
float | isectpoint1[3] | |||
) | [inline] |
Definition at line 498 of file tritritest.h.
References SketcherExample::f, and isect2().
Referenced by tri_tri_intersect_with_isectline().
int coplanar_tri_tri | ( | float | N[3], | |
float | V0[3], | |||
float | V1[3], | |||
float | V2[3], | |||
float | U0[3], | |||
float | U1[3], | |||
float | U2[3] | |||
) |
Definition at line 163 of file tritritest.h.
References EDGE_AGAINST_TRI_EDGES, and POINT_IN_TRI.
Referenced by tri_tri_intersect_with_isectline().
void isect2 | ( | float | VTX0[3], | |
float | VTX1[3], | |||
float | VTX2[3], | |||
float | VV0, | |||
float | VV1, | |||
float | VV2, | |||
float | D0, | |||
float | D1, | |||
float | D2, | |||
float * | isect0, | |||
float * | isect1, | |||
float | isectpoint0[3], | |||
float | isectpoint1[3] | |||
) | [inline] |
Definition at line 467 of file tritritest.h.
References ADD, KDL::diff(), MULT, and SUB.
Referenced by compute_intervals_isectline(), NoDivTriTriIsect(), tri_tri_intersect(), and tri_tri_intersect_with_isectline().
int NoDivTriTriIsect | ( | float | V0[3], | |
float | V1[3], | |||
float | V2[3], | |||
float | U0[3], | |||
float | U1[3], | |||
float | U2[3] | |||
) |
Definition at line 344 of file tritritest.h.
References FemExample::b, CROSS, DOT, EPSILON, SketcherExample::f, FABS, isect2(), KDL::max(), NEWCOMPUTE_INTERVALS, SORT, and SUB.
int tri_tri_intersect | ( | float | V0[3], | |
float | V1[3], | |||
float | V2[3], | |||
float | U0[3], | |||
float | U1[3], | |||
float | U2[3] | |||
) |
Definition at line 213 of file tritritest.h.
References FemExample::b, COMPUTE_INTERVALS, CROSS, DOT, EPSILON, SketcherExample::f, isect2(), KDL::max(), SORT, and SUB.
Referenced by MeshCore::MeshGeomFacet::IntersectWithFacet().
int tri_tri_intersect_with_isectline | ( | float | V0[3], | |
float | V1[3], | |||
float | V2[3], | |||
float | U0[3], | |||
float | U1[3], | |||
float | U2[3], | |||
int * | coplanar, | |||
float | isectpt1[3], | |||
float | isectpt2[3] | |||
) |
Definition at line 569 of file tritritest.h.
References FemExample::b, compute_intervals_isectline(), coplanar_tri_tri(), CROSS, DOT, EPSILON, SketcherExample::f, isect2(), KDL::max(), SET, SORT2, and SUB.
Referenced by MeshCore::MeshGeomFacet::IntersectWithFacet().