private static bool CoplanarTriangleTriangle(Vector3 N, Vector3 V0, Vector3 V1, Vector3 V2, Vector3 U0, Vector3 U1, Vector3 U2) { Vector3 zero = Vector3.zero; zero[0] = Mathf.Abs(N[0]); zero[1] = Mathf.Abs(N[1]); zero[2] = Mathf.Abs(N[2]); short i; short i2; if (zero[0] > zero[1]) { if (zero[0] > zero[2]) { i = 1; i2 = 2; } else { i = 0; i2 = 1; } } else if (zero[2] > zero[1]) { i = 0; i2 = 1; } else { i = 0; i2 = 2; } return(TriangleUtils.EdgeAgainstTriangleEdges(V0, V1, U0, U1, U2, (int)i, (int)i2) || TriangleUtils.EdgeAgainstTriangleEdges(V1, V2, U0, U1, U2, (int)i, (int)i2) || TriangleUtils.EdgeAgainstTriangleEdges(V2, V0, U0, U1, U2, (int)i, (int)i2) || TriangleUtils.PointInTriangle(V0, U0, U1, U2, (int)i, (int)i2) || TriangleUtils.PointInTriangle(U0, V0, V1, V2, (int)i, (int)i2)); }
private static bool EdgeAgainstTriangleEdges(Vector3 V0, Vector3 V1, Vector3 U0, Vector3 U1, Vector3 U2, int i0, int i1) { float num = 0f; float num2 = 0f; float num3 = 0f; float num4 = 0f; float num5 = 0f; float num6 = 0f; float num7 = 0f; float num8 = 0f; float num9 = 0f; num = V1[i0] - V0[i0]; num2 = V1[i1] - V0[i1]; return(TriangleUtils.EdgeEdgeTest(V0, U0, U1, i0, i1, ref num, ref num2, ref num3, ref num4, ref num5, ref num6, ref num9, ref num8, ref num7) || TriangleUtils.EdgeEdgeTest(V0, U1, U2, i0, i1, ref num, ref num2, ref num3, ref num4, ref num5, ref num6, ref num9, ref num8, ref num7) || TriangleUtils.EdgeEdgeTest(V0, U2, U0, i0, i1, ref num, ref num2, ref num3, ref num4, ref num5, ref num6, ref num9, ref num8, ref num7)); }
public static bool IsPositionInTriangle(Vector3 a, Vector3 b, Vector3 c, Vector3 p, float epsilon) { Vector2 barycentricFromPosition = TriangleUtils.GetBarycentricFromPosition(a, b, c, p); return(barycentricFromPosition.x >= -epsilon && barycentricFromPosition.y >= -epsilon && barycentricFromPosition.x + barycentricFromPosition.y <= 1f + epsilon); }
public static bool IntersectTriangleTriangle(Vector3 V0, Vector3 V1, Vector3 V2, Vector3 U0, Vector3 U1, Vector3 U2) { Vector3 lhs = V1 - V0; Vector3 rhs = V2 - V0; Vector3 vector = Vector3.Cross(lhs, rhs); float num = -Vector3.Dot(vector, V0); float num2 = Vector3.Dot(vector, U0) + num; float num3 = Vector3.Dot(vector, U1) + num; float num4 = Vector3.Dot(vector, U2) + num; float num5 = num2 * num3; float num6 = num2 * num4; if (num5 > 0f && num6 > 0f) { return(false); } lhs = U1 - U0; rhs = U2 - U0; Vector3 vector2 = Vector3.Cross(lhs, rhs); float num7 = -Vector3.Dot(vector2, U0); float num8 = Vector3.Dot(vector2, V0) + num7; float num9 = Vector3.Dot(vector2, V1) + num7; float num10 = Vector3.Dot(vector2, V2) + num7; float num11 = num8 * num9; float num12 = num8 * num10; if (num11 > 0f && num12 > 0f) { return(false); } Vector3 vector3 = Vector3.Cross(vector, vector2); float num13 = Mathf.Abs(vector3[0]); short index = 0; float num14 = Mathf.Abs(vector3[1]); float num15 = Mathf.Abs(vector3[2]); if (num14 > num13) { num13 = num14; index = 1; } if (num15 > num13) { index = 2; } float vV = V0[(int)index]; float vV2 = V1[(int)index]; float vV3 = V2[(int)index]; float vV4 = U0[(int)index]; float vV5 = U1[(int)index]; float vV6 = U2[(int)index]; float num16 = 0f; float num17 = 0f; float num18 = 0f; float num19 = 0f; float num20 = 0f; if (TriangleUtils.ComputeTriangleIntervals(vector, V0, V1, V2, U0, U1, U2, vV, vV2, vV3, num8, num9, num10, num11, num12, ref num16, ref num17, ref num18, ref num19, ref num20)) { return(TriangleUtils.CoplanarTriangleTriangle(vector, V0, V1, V2, U0, U1, U2)); } float num21 = 0f; float num22 = 0f; float num23 = 0f; float num24 = 0f; float num25 = 0f; if (TriangleUtils.ComputeTriangleIntervals(vector, V0, V1, V2, U0, U1, U2, vV4, vV5, vV6, num2, num3, num4, num5, num6, ref num21, ref num22, ref num23, ref num24, ref num25)) { return(TriangleUtils.CoplanarTriangleTriangle(vector, V0, V1, V2, U0, U1, U2)); } float num26 = num19 * num20; float num27 = num24 * num25; float num28 = num26 * num27; float num29 = num16 * num28; float num30 = num29 + num17 * num20 * num27; float num31 = num29 + num18 * num19 * num27; num29 = num21 * num28; float num32 = num29 + num22 * num26 * num25; float num33 = num29 + num23 * num26 * num24; TriangleUtils.Sort(ref num30, ref num31); TriangleUtils.Sort(ref num32, ref num33); return(num31 >= num32 && num33 >= num30); }