コード例 #1
0
        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));
        }
コード例 #2
0
        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));
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        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);
        }