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); }
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); }
public static Vector2[] TangentToPolygon(Vector2 point, GeoPointsArray2 poly) { return(null); }
public GeoPolygonConvex2(GeoPointsArray2 poly) : base(poly) { }
public GeoPolygon2(GeoPointsArray2 poly) { mPolygon = poly; Initialize(); }