public static Vector2D? IntersectLineLine( Vector2D s1, Vector2D e1, Vector2D s2, Vector2D e2 )
        {
            Rect2D aabb1 = new Rect2D( s1, e1 );
            Rect2D aabb2 = new Rect2D( s2, e2 );
            if ( !aabb1.IntersectsWith( aabb2 ) ) return null;

            double x1 = s1.X;
            double x2 = e1.X;
            double x3 = s2.X;
            double x4 = e2.X;
            double y1 = s1.Y;
            double y2 = e1.Y;
            double y3 = s2.Y;
            double y4 = e2.Y;

            double denom = ( x1 - x2 ) * ( y3 - y4 ) - ( y1 - y2 ) * ( x3 - x4 );
            if ( Math.Abs( denom ) < 1e-4 ) return null;
            double px = ( ( x1 * y2 - y1 * x2 ) * ( x3 - x4 ) - ( x1 - x2 ) * ( x3 * y4 - y3 * x4 ) ) / denom;
            double py = ( ( x1 * y2 - y1 * x2 ) * ( y3 - y4 ) - ( y1 - y2 ) * ( x3 * y4 - y3 * x4 ) ) / denom;

            Vector2D p = new Vector2D( px, py );
            double l1 = ( p - s1 ).Length;
            double l2 = ( p - e1 ).Length;
            if ( l1 + l2 > ( s1 - e1 ).Length + 1e-3 ) return null;
            return p;
        }
        public static Vector2D?IntersectLineLine(Vector2D s1, Vector2D e1, Vector2D s2, Vector2D e2)
        {
            Rect2D aabb1 = new Rect2D(s1, e1);
            Rect2D aabb2 = new Rect2D(s2, e2);

            if (!aabb1.IntersectsWith(aabb2))
            {
                return(null);
            }

            double x1 = s1.X;
            double x2 = e1.X;
            double x3 = s2.X;
            double x4 = e2.X;
            double y1 = s1.Y;
            double y2 = e1.Y;
            double y3 = s2.Y;
            double y4 = e2.Y;

            double denom = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4);

            if (Math.Abs(denom) < 1e-4)
            {
                return(null);
            }
            double px = ((x1 * y2 - y1 * x2) * (x3 - x4) - (x1 - x2) * (x3 * y4 - y3 * x4)) / denom;
            double py = ((x1 * y2 - y1 * x2) * (y3 - y4) - (y1 - y2) * (x3 * y4 - y3 * x4)) / denom;

            Vector2D p  = new Vector2D(px, py);
            double   l1 = (p - s1).Length;
            double   l2 = (p - e1).Length;

            if (l1 + l2 > (s1 - e1).Length + 1e-3)
            {
                return(null);
            }
            return(p);
        }