public static Segment FromRectangle(Rectangle rect, Direction side)
 {
     Segment seg = new Segment();
     switch (side)
     {
         case Direction.North:
             seg.X1 = rect.Left; seg.Y1 = rect.Top;
             seg.X2 = rect.Right; seg.Y2 = rect.Top;
             break;
         case Direction.East:
             seg.X1 = rect.Right; seg.Y1 = rect.Top;
             seg.X2 = rect.Right; seg.Y2 = rect.Bottom;
             break;
         case Direction.South:
             seg.X1 = rect.Right; seg.Y1 = rect.Bottom;
             seg.X2 = rect.Left; seg.Y2 = rect.Bottom;
             break;
         case Direction.West:
             seg.X1 = rect.Left; seg.Y1 = rect.Top;
             seg.X2 = rect.Left; seg.Y2 = rect.Bottom;
             break;
     }
     return seg;
 }
 public static float DistanceToSegment(Vector2 point, Segment segment)
 {
     return shortestVectorToSegment(segment.Start, segment.End, point).Length();
 }
 public static bool SegmentsIntersect(Segment s1, Segment s2)
 {
     return SegmentsIntersect(s1.X1, s1.Y1, s1.X2, s1.Y2, s2.X1, s2.Y1, s1.X2, s2.Y2);
 }
        public static float DistanceBetweenSegments(Segment s1, Segment s2)
        {
            if (SegmentsIntersect(s1, s2))
            {
                return 0;
            }

            return Math.Min(DistanceToSegment(s1.Start, s2),
                   Math.Min(DistanceToSegment(s1.End, s2),
                   Math.Min(DistanceToSegment(s2.Start, s1),
                            DistanceToSegment(s2.End, s1))));
        }