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]) { float A[3]; short i0,i1; /* first project onto an axis-aligned plane, that maximizes the area */ /* of the triangles, compute indices: i0,i1. */ //#pragma warning( disable : 4244 ) A[0]=fabs(N[0]); A[1]=fabs(N[1]); A[2]=fabs(N[2]); //#pragma warning( default : 4244 ) if(A[0]>A[1]) { if(A[0]>A[2]) { i0=1; /* A[0] is greatest */ i1=2; } else { i0=0; /* A[2] is greatest */ i1=1; } } else /* A[0]<=A[1] */ { if(A[2]>A[1]) { i0=0; /* A[2] is greatest */ i1=1; } else { i0=0; /* A[1] is greatest */ i1=2; } } /* test all edges of triangle 1 against the edges of triangle 2 */ EDGE_AGAINST_TRI_EDGES(V0,V1,U0,U1,U2); EDGE_AGAINST_TRI_EDGES(V1,V2,U0,U1,U2); EDGE_AGAINST_TRI_EDGES(V2,V0,U0,U1,U2); /* finally, test if tri1 is totally contained in tri2 or vice versa */ POINT_IN_TRI(V0,U0,U1,U2); POINT_IN_TRI(U0,V0,V1,V2); return 0; }
bool coplanar_tri_tri(const MFVector& N, const MFVector& V0, const MFVector& V1, const MFVector& V2, const MFVector& U0, const MFVector& U1, const MFVector& U2) { MFVector A; short i0,i1; /* first project onto an axis-aligned plane, that maximizes the area */ /* of the triangles, compute indices: i0,i1. */ A.x=fabsf(N.x); A.y=fabsf(N.y); A.z=fabsf(N.z); if(A.x>A.y) { if(A.x>A.z) { i0=1; /* A[0] is greatest */ i1=2; } else { i0=0; /* A[2] is greatest */ i1=1; } } else /* A[0]<=A[1] */ { if(A.z>A.y) { i0=0; /* A[2] is greatest */ i1=1; } else { i0=0; /* A[1] is greatest */ i1=2; } } /* test all edges of triangle 1 against the edges of triangle 2 */ EDGE_AGAINST_TRI_EDGES(V0,V1,U0,U1,U2); EDGE_AGAINST_TRI_EDGES(V1,V2,U0,U1,U2); EDGE_AGAINST_TRI_EDGES(V2,V0,U0,U1,U2); /* finally, test if tri1 is totally contained in tri2 or vice versa */ POINT_IN_TRI(V0,U0,U1,U2); POINT_IN_TRI(U0,V0,V1,V2); return false; }
qboolean coplanar_tri_tri(vec3_t N,vec3_t V0,vec3_t V1,vec3_t V2, vec3_t U0,vec3_t U1,vec3_t U2) { vec3_t A; short i0,i1; /* first project onto an axis-aligned plane, that maximizes the area */ /* of the triangles, compute indices: i0,i1. */ A[0]=fabs(N[0]); A[1]=fabs(N[1]); A[2]=fabs(N[2]); if(A[0]>A[1]) { if(A[0]>A[2]) { i0=1; /* A[0] is greatest */ i1=2; } else { i0=0; /* A[2] is greatest */ i1=1; } } else /* A[0]<=A[1] */ { if(A[2]>A[1]) { i0=0; /* A[2] is greatest */ i1=1; } else { i0=0; /* A[1] is greatest */ i1=2; } } /* test all edges of triangle 1 against the edges of triangle 2 */ EDGE_AGAINST_TRI_EDGES(V0,V1,U0,U1,U2); EDGE_AGAINST_TRI_EDGES(V1,V2,U0,U1,U2); EDGE_AGAINST_TRI_EDGES(V2,V0,U0,U1,U2); /* finally, test if tri1 is totally contained in tri2 or vice versa */ POINT_IN_TRI(V0,U0,U1,U2); POINT_IN_TRI(U0,V0,V1,V2); return qfalse; }
int coplanar_tri_tri(double N[3],double V0[3],double V1[3],double V2[3], double U0[3],double U1[3],double U2[3]) { double A[3]; short i0,i1; /* first project onto an axis-aligned plane, that maximizes the area */ /* of the triangles, compute indices: i0,i1. */ A[0]=FABS(N[0]); A[1]=FABS(N[1]); A[2]=FABS(N[2]); if(A[0]>A[1]) { if(A[0]>A[2]) { i0=1; /* A[0] is greatest */ i1=2; } else { i0=0; /* A[2] is greatest */ i1=1; } } else /* A[0]<=A[1] */ { if(A[2]>A[1]) { i0=0; /* A[2] is greatest */ i1=1; } else { i0=0; /* A[1] is greatest */ i1=2; } } /* test all edges of triangle 1 against the edges of triangle 2 */ EDGE_AGAINST_TRI_EDGES(V0,V1,U0,U1,U2); EDGE_AGAINST_TRI_EDGES(V1,V2,U0,U1,U2); EDGE_AGAINST_TRI_EDGES(V2,V0,U0,U1,U2); /* finally, test if tri1 is totally contained in tri2 or vice versa */ POINT_IN_TRI(V0,U0,U1,U2); POINT_IN_TRI(U0,V0,V1,V2); return 0; }
static int coplanar_tri_tri(const float N[3], const float V0[3], const float V1[3], const float V2[3], const float U0[3], const float U1[3], const float U2[3]) { float A[3]; short i0, i1; /* first project onto an axis-aligned plane, that maximizes the area */ /* of the triangles, compute indices: i0,i1. */ A[0] = glm::abs(N[0]); A[1] = glm::abs(N[1]); A[2] = glm::abs(N[2]); if (A[0] > A[1]) { if (A[0] > A[2]) { i0 = 1; /* A[0] is greatest */ i1 = 2; } else { i0 = 0; /* A[2] is greatest */ i1 = 1; } } else /* A[0]<=A[1] */ { if (A[2] > A[1]) { i0 = 0; /* A[2] is greatest */ i1 = 1; } else { i0 = 0; /* A[1] is greatest */ i1 = 2; } } /* test all edges of triangle 1 against the edges of triangle 2 */ EDGE_AGAINST_TRI_EDGES(V0, V1, U0, U1, U2); EDGE_AGAINST_TRI_EDGES(V1, V2, U0, U1, U2); EDGE_AGAINST_TRI_EDGES(V2, V0, U0, U1, U2); return 0; }
int coplanar_tri_tri(GIM_TRIANGLE_DATA *tri1, GIM_TRIANGLE_DATA *tri2) { short i0,i1; /* first project onto an axis-aligned plane, that maximizes the area */ /* of the triangles, compute indices: i0,i1. */ PLANE_MINOR_AXES(tri1->m_planes.m_planes[0], i0, i1); /* test all edges of triangle 1 against the edges of triangle 2 */ EDGE_AGAINST_TRI_EDGES(tri1->m_vertices[0],tri1->m_vertices[1],tri2->m_vertices[0],tri2->m_vertices[1],tri2->m_vertices[2]); EDGE_AGAINST_TRI_EDGES(tri1->m_vertices[1],tri1->m_vertices[2],tri2->m_vertices[0],tri2->m_vertices[1],tri2->m_vertices[2]); EDGE_AGAINST_TRI_EDGES(tri1->m_vertices[2],tri1->m_vertices[0],tri2->m_vertices[0],tri2->m_vertices[1],tri2->m_vertices[2]); /* finally, test if tri1 is totally contained in tri2 or vice versa */ POINT_IN_HULL(tri1->m_vertices[0],(&tri2->m_planes.m_planes[1]),3,i0); if(i0==0) return 1; POINT_IN_HULL(tri2->m_vertices[0],(&tri1->m_planes.m_planes[1]),3,i0); if(i0==0) return 1; return 0; }
int bn_tri_tri_isect_coplanar(point_t V0, point_t V1, point_t V2, point_t U0, point_t U1, point_t U2, int area_flag) { int ret; fastf_t A[3]; short i0, i1; point_t E1, E2, N; plane_t P1, P2; static const struct bn_tol tol = { BN_TOL_MAGIC, EPSILON, EPSILON*EPSILON, 1e-6, 1-1e-6 }; /* compute plane of triangle (V0, V1, V2) */ ret = bn_mk_plane_3pts(P1, V0, V1, V2, &tol); if (ret) return -1; /* compute plane of triangle (U0, U1, U2) */ ret = bn_mk_plane_3pts(P2, U0, U1, U2, &tol); if (ret) return -1; /* verify that triangles are coplanar */ if (bn_coplanar(P1, P2, &tol) <= 0) return -1; /* first project onto an axis-aligned plane, that maximizes the area */ /* of the triangles, compute indices: i0, i1. */ VSUB2(E1, V1, V0); VSUB2(E2, V2, V0); VCROSS(N, E1, E2); A[0]=FABS(N[0]); A[1]=FABS(N[1]); A[2]=FABS(N[2]); if (A[0]>A[1]) { if (A[0]>A[2]) { i0=1; /* A[0] is greatest */ i1=2; } else { i0=0; /* A[2] is greatest */ i1=1; } } else { /* A[0]<=A[1] */ if (A[2]>A[1]) { i0=0; /* A[2] is greatest */ i1=1; } else { i0=0; /* A[1] is greatest */ i1=2; } } /* test all edges of triangle 1 against the edges of triangle 2 */ if (!area_flag) { EDGE_AGAINST_TRI_EDGES(V0, V1, U0, U1, U2); EDGE_AGAINST_TRI_EDGES(V1, V2, U0, U1, U2); EDGE_AGAINST_TRI_EDGES(V2, V0, U0, U1, U2); } else { EDGE_AGAINST_TRI_EDGES_AREA(V0, V1, U0, U1, U2); EDGE_AGAINST_TRI_EDGES_AREA(V1, V2, U0, U1, U2); EDGE_AGAINST_TRI_EDGES_AREA(V2, V0, U0, U1, U2); } /* finally, test if tri1 is totally contained in tri2 or vice versa */ POINT_IN_TRI(V0, U0, U1, U2); POINT_IN_TRI(U0, V0, V1, V2); return 0; }