Example #1
0
 /// <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;
         }
     }
 }
Example #2
0
        /// <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));
        }