/// <summary> /// Gets the smallest of two distances. /// </summary> /// <param name="first">First distance.</param> /// <param name="second">Second distance.</param> /// <returns>Smallest distance.</returns> public static Distance Min(Distance first, Distance second) { Distance distance = new Distance { X = MathExtensions.AbsMin(first.X, second.X), Y = MathExtensions.AbsMin(first.Y, second.Y) }; return(distance); }
/// <summary> /// Returns mininal distance between two rectangles. /// </summary> /// <param name="first">First rectangle.</param> /// <param name="second">Second rectangle.</param> /// <returns>Minimal distance.</returns> private Distance DistanceBetweenRectangles(Rect first, Rect second) { double x1 = DistanceBetweenRightEdgeAndRectangle(first, second); double x2 = DistanceBetweenLeftEdgeAndRectangle(first, second); double y1 = DistanceBetweenBottomEdgeAndRectangle(first, second); double y2 = DistanceBetweenTopEdgeAndRectangle(first, second); Distance distance = new Distance() { X = MathExtensions.AbsMin(x1, x2), Y = MathExtensions.AbsMin(y1, y2) }; return(distance); }
/// <summary> /// Returns distance between the top edge of the rectangle and another rectangle. /// </summary> /// <param name="first">First rectangle.</param> /// <param name="second">Second rectangle.</param> /// <returns>Minimal distance.</returns> private double DistanceBetweenTopEdgeAndRectangle(Rect first, Rect second) { double snap; double distance = double.NaN; if (first.OverlapsHorizontally(second, Accuracy)) { snap = second.Y; if (first.Y.IsNear(snap, SnapinDistance)) { distance = MathExtensions.AbsMin(snap - first.Y, distance); } snap = second.Y + second.Height + SnapinMargin; if (first.Y.IsNear(snap, SnapinDistance)) { distance = MathExtensions.AbsMin(snap - first.Y, distance); } } return(distance); }
/// <summary> /// Returns distance between the left edge of the rectangle and another rectangle. /// </summary> /// <param name="first">First rectangle.</param> /// <param name="second">Second rectangle.</param> /// <returns>Minimal distance.</returns> private double DistanceBetweenLeftEdgeAndRectangle(Rect first, Rect second) { double snap; double distance = double.NaN; if (first.OverlapsVertically(second, Accuracy)) { snap = second.X; if (first.X.IsNear(snap, SnapinDistance)) { distance = MathExtensions.AbsMin(snap - first.X, distance); } snap = second.X + second.Width + SnapinMargin; if (first.X.IsNear(snap, SnapinDistance)) { distance = MathExtensions.AbsMin(snap - first.X, distance); } } return(distance); }