public bool DoIntersect(LineSegment lineSegment1, LineSegment lineSegment2) { // Find the four orientations needed for general and special cases int o1 = DetermineOrientation(lineSegment1.EndPoint1, lineSegment1.EndPoint2, lineSegment2.EndPoint1); int o2 = DetermineOrientation(lineSegment1.EndPoint1, lineSegment1.EndPoint2, lineSegment2.EndPoint2); int o3 = DetermineOrientation(lineSegment2.EndPoint1, lineSegment2.EndPoint2, lineSegment1.EndPoint1); int o4 = DetermineOrientation(lineSegment2.EndPoint1, lineSegment2.EndPoint2, lineSegment1.EndPoint2); // General case if (o1 != o2 && o3 != o4) return true; // Special Cases // p1, q1 and p2 are colinear and p2 lies on segment p1q1 if (o1 == 0 && IsOnSegment(lineSegment1.EndPoint1, lineSegment2.EndPoint1, lineSegment1.EndPoint2)) return true; // p1, q1 and p2 are colinear and q2 lies on segment p1q1 if (o2 == 0 && IsOnSegment(lineSegment1.EndPoint1, lineSegment2.EndPoint2, lineSegment1.EndPoint2)) return true; // p2, q2 and p1 are colinear and p1 lies on segment p2q2 if (o3 == 0 && IsOnSegment(lineSegment2.EndPoint1, lineSegment1.EndPoint1, lineSegment2.EndPoint2)) return true; // p2, q2 and q1 are colinear and q1 lies on segment p2q2 if (o4 == 0 && IsOnSegment(lineSegment2.EndPoint1, lineSegment1.EndPoint2, lineSegment2.EndPoint2)) return true; return false; // Doesn't fall in any of the above cases }
private IEnumerable<Intersection> CheckIntersectionsAndAddToQueue(LineSegment lineSegment) { var intersections = new List<Intersection>(); if (_lineSegmentsQueue.Count > 0) { var firstLineSegment = _lineSegmentsQueue.Peek(); if (firstLineSegment.RightMostX < lineSegment.LeftMostX) { _lineSegmentsQueue.Dequeue(); } foreach (var segment in _lineSegmentsQueue) { if (_intersectionChecker.DoIntersect(segment, lineSegment)) { intersections.Add(new Intersection(segment, lineSegment)); } } _lineSegmentsQueue.Enqueue(lineSegment); } else { _lineSegmentsQueue.Enqueue(lineSegment); } return intersections; }
public Intersection(LineSegment lineSegment1, LineSegment lineSegment2) { LineSegment1 = lineSegment1; LineSegment2 = lineSegment2; }