/// <summary> /// Test if two line segments intersect. /// </summary> /// <remarks> /// Refer to http://stackoverflow.com/a/565282/695964 for explanation /// </remarks> public bool IsIntersectWith(LineSegment other) { double RxS = XProd(this.to, other.to); double qpr = XProd(other.start - this.start, this.to); if (RxS == 0) { if (qpr == 0) { return true; } else { return false; } } else { double t = XProd(other.start - this.start, other.to) / RxS; double u = qpr / RxS; if (t>=0 && t<=1 && u>=0 && u <=1) { return true; } else { return false; } } }
/// <summary> /// Test cases /// </summary> static void Main(string[] args) { LineSegment s1, s2; // case 1: intersected s1 = new LineSegment(new Vector(17, -14), new Vector(61, -58)); s2 = new LineSegment(new Vector(23, -34), new Vector(54, -34)); Debug.Assert(s1.IsIntersectWith(s2)); // case 2: intersected at two line segments' ends s1 = new LineSegment(new Vector(84, -27), new Vector(119, -27)); s2 = new LineSegment(new Vector(119, -27), new Vector(101, -45)); Debug.Assert(s1.IsIntersectWith(s2)); // case 3: intersected at one line segment's end /* Fails due to floating point equality comparison. This is expected. * (NOTE: both this approach and my straightforward approach fail on this case) s1 = new LineSegment(new Vector(13, -78), new Vector(31, -113)); s2 = new LineSegment(new Vector(20, -91), new Vector(30, -76)); Debug.Assert(s1.IsIntersectWith(s2)); */ // case 4: no intersection s1 = new LineSegment(new Vector(52, -78), new Vector(74, -78)); s2 = new LineSegment(new Vector(79, -74), new Vector(70, -91)); Debug.Assert(!s1.IsIntersectWith(s2)); // case 5: overlapped horizontally s1 = new LineSegment(new Vector(79, -108), new Vector(104, -108)); s2 = new LineSegment(new Vector(90, -108), new Vector(116, -108)); Debug.Assert(s1.IsIntersectWith(s2)); // case 6: overlapped vertically s1 = new LineSegment(new Vector(107, -55), new Vector(107, -71)); s2 = new LineSegment(new Vector(107, -65), new Vector(107, -79)); Debug.Assert(s1.IsIntersectWith(s2)); // case 7: horizonally parallel s1 = new LineSegment(new Vector(42, -114), new Vector(63, -114)); s2 = new LineSegment(new Vector(54, -121), new Vector(62, -121)); Debug.Assert(!s1.IsIntersectWith(s2)); }