コード例 #1
0
ファイル: Utils.cs プロジェクト: shff/gk3tools
        public static bool IsPointInTriangle(Math.Vector2 point, Math.Vector2 a, Math.Vector2 b, Math.Vector2 c, out Math.Vector2 uv)
        {
            Math.Vector2 v0 = c - a;
            Math.Vector2 v1 = b - a;
            Math.Vector2 v2 = point - a;

            float dot00 = v0.Dot(v0);
            float dot01 = v0.Dot(v1);
            float dot02 = v0.Dot(v2);
            float dot11 = v1.Dot(v1);
            float dot12 = v1.Dot(v2);

            float invDenom = 1.0f / (dot00 * dot11 - dot01 * dot01);

            uv.X = (dot11 * dot02 - dot01 * dot12) * invDenom;
            uv.Y = (dot00 * dot12 - dot01 * dot02) * invDenom;

            return(uv.X >= 0 && uv.Y >= 0 && uv.X + uv.Y < 1.0f);
        }
コード例 #2
0
ファイル: Utils.cs プロジェクト: shff/gk3tools
        public static bool TestTriangleBox(Math.Vector2 a, Math.Vector2 b, Math.Vector2 c, Math.Vector2 boxMin, Math.Vector2 boxMax)
        {
            Math.Vector2 ab = (b - a).Normalize();
            Math.Vector2 ac = (a - c).Normalize();
            Math.Vector2 bc = (c - b).Normalize();

            // calc the normals

            /*Utils.Swap(ref ab.X, ref ab.Y);
             * Utils.Swap(ref ac.X, ref ac.Y);
             * Utils.Swap(ref bc.X, ref bc.Y);
             * ab.X = -ab.X;
             * ac.X = -ac.X;
             * bc.X = -bc.X;*/

            // project the triangle onto the 1st axis of the triangle
            float dotA = a.Dot(ab);
            float dotB = b.Dot(ab);
            float dotC = c.Dot(ab);

            float dotMax = System.Math.Max(dotA, System.Math.Max(dotB, dotC));
            float dotMin = System.Math.Min(dotA, System.Math.Min(dotB, dotC));

            // project the box onto 1st axis of triangle
            float boxA = boxMin.X * ab.X + boxMin.Y * ab.Y;
            float boxB = boxMax.X * ab.X + boxMin.Y * ab.Y;
            float boxC = boxMax.X * ab.X + boxMax.Y * ab.Y;
            float boxD = boxMin.X * ab.X + boxMax.Y * ab.Y;

            float boxDotMax = System.Math.Max(boxA, System.Math.Max(boxB, System.Math.Max(boxC, boxD)));
            float boxDotMin = System.Math.Min(boxA, System.Math.Min(boxB, System.Math.Min(boxC, boxD)));

            if (boxDotMax < dotMin || dotMax < boxDotMin)
            {
                return(false);
            }

            // project the triangle onto 2nd axis of triangle
            dotA = a.Dot(ac);
            dotB = b.Dot(ac);
            dotC = c.Dot(ac);

            dotMax = System.Math.Max(dotA, System.Math.Max(dotB, dotC));
            dotMin = System.Math.Min(dotA, System.Math.Min(dotB, dotC));

            // project the box onto 1st axis of triangle
            boxA = boxMin.X * ac.X + boxMin.Y * ac.Y;
            boxB = boxMax.X * ac.X + boxMin.Y * ac.Y;
            boxC = boxMax.X * ac.X + boxMax.Y * ac.Y;
            boxD = boxMin.X * ac.X + boxMax.Y * ac.Y;

            boxDotMax = System.Math.Max(boxA, System.Math.Max(boxB, System.Math.Max(boxC, boxD)));
            boxDotMin = System.Math.Min(boxA, System.Math.Min(boxB, System.Math.Min(boxC, boxD)));

            if (boxDotMax < dotMin || dotMax < boxDotMin)
            {
                return(false);
            }

            // project the triangle onto 3rd axis of triangle
            dotA = a.Dot(bc);
            dotB = b.Dot(bc);
            dotC = c.Dot(bc);

            dotMax = System.Math.Max(dotA, System.Math.Max(dotB, dotC));
            dotMin = System.Math.Min(dotA, System.Math.Min(dotB, dotC));

            // project the box onto 1st axis of triangle
            boxA = boxMin.X * bc.X + boxMin.Y * bc.Y;
            boxB = boxMax.X * bc.X + boxMin.Y * bc.Y;
            boxC = boxMax.X * bc.X + boxMax.Y * bc.Y;
            boxD = boxMin.X * bc.X + boxMax.Y * bc.Y;

            boxDotMax = System.Math.Max(boxA, System.Math.Max(boxB, System.Math.Max(boxC, boxD)));
            boxDotMin = System.Math.Min(boxA, System.Math.Min(boxB, System.Math.Min(boxC, boxD)));

            if (boxDotMax < dotMin || dotMax < boxDotMin)
            {
                return(false);
            }

            return(true);
        }