コード例 #1
0
        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
        }
コード例 #2
0
        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;
        }
コード例 #3
0
 public Intersection(LineSegment lineSegment1, LineSegment lineSegment2)
 {
     LineSegment1 = lineSegment1;
     LineSegment2 = lineSegment2;
 }