public static bool IsPointInConvexPolygon2(GeoPointsArray2 poly, ref Vector2 point)
        {
            int   n  = poly.mPointArray.Count;
            float t1 = CounterClockwiseGL0(poly.mPointArray[0], poly.mPointArray[1], point);
            float t2 = CounterClockwiseGL0(poly.mPointArray[0], poly.mPointArray[n - 1], point);

            if (t1 < -GeoUtils.PRECISION || t2 > GeoUtils.PRECISION)
            {
                return(false);
            }
            int low  = 2;
            int high = n - 1;

            while (low < high)
            {
                int mid = (low + high) >> 1;
                if (CounterClockwiseGL0(poly.mPointArray[0], poly.mPointArray[mid], point) < -GeoUtils.PRECISION)
                {
                    high = mid;
                }
                else
                {
                    low = mid + 1;
                }
            }
            float t3 = CounterClockwiseGL0(poly.mPointArray[low], poly.mPointArray[low - 1], point);

            if (t3 > GeoUtils.PRECISION)
            {
                return(false);
            }
            return(true);
        }
 public static PolygonDirection CalculatePolygonArea(GeoPointsArray2 poly, ref float area)
 {
     area = CalcualetArea(poly);
     if (area > 0)
     {
         return(PolygonDirection.CCW);
     }
     else
     {
         return(PolygonDirection.CW);
     }
 }
        public static GeoAABB2 CalculateAABB(GeoPointsArray2 points)
        {
            Vector2 min = points[0];
            Vector2 max = points[0];

            for (int i = 0; i < points.Count; ++i)
            {
                min = Vector2.Min(points[i], min);
                max = Vector2.Max(points[i], max);
            }
            return(new GeoAABB2(min, max));
        }
        public static PolygonDirection TriangleArea2(Vector2 p1, Vector2 p2, Vector2 p3, ref float area)
        {
            GeoPointsArray2 array = new GeoPointsArray2();

            array.mPointArray.Add(p1);
            array.mPointArray.Add(p2);
            array.mPointArray.Add(p3);
            PolygonDirection dir = GeoPolygonUtils.CalculatePolygonArea(array, ref area);

            area = area < 0 ? -area : area;
            return(dir);
        }
        public static float CalcualetArea(GeoPointsArray2 poly)
        {
            float area  = 0.0f;
            int   count = poly.mPointArray.Count;

            for (int i = 0; i < count; ++i)
            {
                int j = (i + 1) % count;
                area += (poly[i][0] * poly[j][1]) - (poly[j][0] * poly[i][1]);
            }
            area *= 0.5f;
            return(area);
        }
        public static bool IsConvexPolygon2(GeoPointsArray2 points)
        {
            int count = points.Count;

            for (int i = 0; i < points.Count; ++i)
            {
                int pre  = (i - 1 + count) % count;
                int next = (i + 1) % count;
                if (!IsConvexAngle(points[pre], points[i], points[next]))
                {
                    return(false);
                }
            }
            return(true);
        }
示例#7
0
        public static bool IsPointInPolygon2(GeoPointsArray2 poly, ref Vector2 point)
        {
            bool res = false;
            int  j   = poly.Count - 1;

            for (int i = 0; i < poly.Count; i++)
            {
                if ((((poly[i][1] <= point[1]) && (point[1] < poly[j][1])) || ((poly[j][1] <= point[1]) && (point[1] < poly[i][1]))) &&
                    (point[0] < (poly[j][0] - poly[i][0]) * (point[1] - poly[i][1]) / (poly[j][1] - poly[i][1]) + poly[i][0]))
                {
                    res = !res;
                }
                j = i;
            }
            return(res);
        }
        public static bool IsPointInPolygon2(GeoPointsArray2 poly, ref Vector2 point)
        {
            bool res = false;
            int  i, j = poly.Count - 1;

            //for (i = 0; i < poly.Count; i++)
            //{
            //    if ((((poly[i][1] <= point[1]) && (point[1] < poly[j][1])) || ((poly[j][1] <= point[1]) && (point[1] < poly[i][1])))
            //        && (point[0] < (poly[j][0] - poly[i][0]) * (point[1] - poly[i][1]) / (poly[j][1] - poly[i][1]) + poly[i][0]))
            //        res = !res;
            //    j = i;
            //}
            for (i = 0; i < poly.Count; i++)
            {
                if ((((poly[i][1] < point[1]) && (poly[j][1] >= point[1])) || ((poly[j][1] < point[1]) && (poly[i][1] >= point[1]))) &&
                    (poly[j][0] <= point[0] || poly[i][0] <= point[0]))
                {
                    res ^= (poly[i][0] + (point[1] - poly[i][1]) / (poly[j][1] - poly[i][1]) * (poly[j][0] - poly[i][0]) < point[0]);
                }
                j = i;
            }
            return(res);
        }
示例#9
0
 public static Vector2[] TangentToPolygon(Vector2 point, GeoPointsArray2 poly)
 {
     return(null);
 }
示例#10
0
 public GeoPolygonConvex2(GeoPointsArray2 poly) :
     base(poly)
 {
 }
示例#11
0
 public GeoPolygon2(GeoPointsArray2 poly)
 {
     mPolygon = poly;
     Initialize();
 }