// Generate random point in polygon public static GTAVector RandPointInPoly(GTALocation x) { float maxX = float.MinValue; float maxY = float.MinValue; float minX = float.MaxValue; float minY = float.MaxValue; float avgZ = 0f; foreach (GTAVector v in x.ROI) { maxX = Math.Max(maxX, v.X); maxY = Math.Max(maxY, v.Y); minX = Math.Min(minX, v.X); minY = Math.Min(minY, v.Y); avgZ += v.Z; } avgZ /= x.ROI.Count; avgZ += 0.5f; while (true) { GTAVector v = new GTAVector(random.NextFloat(minX, maxX), random.NextFloat(minY, maxY), avgZ); if (PointInPoly(x, v)) { return(v); } } }
public static bool PointInPoly(GTALocation loc, GTAVector v) { int max_point = loc.ROI.Count - 1; float total_angle = GetAngle(loc.ROI[max_point].X, loc.ROI[max_point].Y, v.X, v.Y, loc.ROI[0].X, loc.ROI[0].Y); for (int i = 0; i < max_point; i++) { total_angle += GetAngle( loc.ROI[i].X, loc.ROI[i].Y, v.X, v.Y, loc.ROI[i + 1].X, loc.ROI[i + 1].Y); } return(Math.Abs(total_angle) > 1); }