public static float DistanceFromRect(Rect rect, Vector pos) { if (rect.Contains(pos)) { return 0; } var nw = rect.GetCorner(CompassPoint.NorthWest); var ne = rect.GetCorner(CompassPoint.NorthEast); var sw = rect.GetCorner(CompassPoint.SouthWest); var se = rect.GetCorner(CompassPoint.SouthEast); var distanceFromTop = DistanceFromLineSegment(new LineSegment(nw, ne), pos); var distanceFromRight = DistanceFromLineSegment(new LineSegment(ne, se), pos); var distanceFromBottom = DistanceFromLineSegment(new LineSegment(se, sw), pos); var distanceFromLeft = DistanceFromLineSegment(new LineSegment(sw, nw), pos); return Math.Min(distanceFromTop, Math.Min(distanceFromLeft, Math.Min(distanceFromBottom, distanceFromRight))); }
public bool IntersectsWith(Rect rect) { if (rect.Contains(Start) || rect.Contains(End)) { return true; } var a = new LineSegment(new Vector(rect.Left, rect.Top), new Vector(rect.Right, rect.Top)); var b = new LineSegment(new Vector(rect.Right, rect.Top), new Vector(rect.Right, rect.Bottom)); var c = new LineSegment(new Vector(rect.Right, rect.Bottom), new Vector(rect.Left, rect.Bottom)); var d = new LineSegment(new Vector(rect.Left, rect.Bottom), new Vector(rect.Left, rect.Top)); List<LineSegmentIntersect> intersects; if (Intersect(a, false, out intersects) || Intersect(b, false, out intersects) || Intersect(c, false, out intersects) || Intersect(d, false, out intersects)) { return true; } return false; }