public Vector CrossingPoint(Segment other) { float x = -((begin.X * end.Y - end.X * begin.Y) * (other.End.X - other.Begin.X) - (other.Begin.X * other.End.Y - other.End.X * other.Begin.Y) * (end.X - begin.X)) / ((begin.Y - end.Y) * (other.End.X - other.Begin.X) - (other.Begin.Y - other.End.Y) * (end.X - begin.X)); if (x == float.NaN) return null; float y = ((other.Begin.Y - other.End.Y) * (-x) - (other.Begin.X * other.End.Y - other.End.X * other.Begin.Y)) / (other.End.X - other.Begin.X); return new Vector(x, y); }
public static MyPolygon Intersection(MyPolygon a, Segment b) { List<Vector> result = new List<Vector>(); a.points.Add(a.points.First()); for (int i = 0; i < a.points.Count - 1; i++) { Vector start = a.points[i]; Vector end = a.points[i + 1]; bool s = b.PlaceOfPoint(start) <= 0; //справа bool e = b.PlaceOfPoint(end) <= 0; if (s) result.Add(start); if (s ^ e) result.Add(b.CrossingPoint(new Segment(start, end))); } return new MyPolygon(result); }