两个矩形之间的距离

3

我该如何找到两个矩形之间的距离?当相交时,距离应该返回0。

3个回答

5
这是一个用于计算由CGSize表示的两个CGRect之间距离的快速函数:
CGSize CGSizeDistanceBetweenRects(CGRect rect1, CGRect rect2)
{
    if (CGRectIntersectsRect(rect1, rect2))
    {
        return CGSizeMake(0, 0);
    }

    CGRect mostLeft = rect1.origin.x < rect2.origin.x ? rect1 : rect2;
    CGRect mostRight = rect2.origin.x < rect1.origin.x ? rect1 : rect2;

    CGFloat xDifference = mostLeft.origin.x == mostRight.origin.x ? 0 : mostRight.origin.x - (mostLeft.origin.x + mostLeft.size.width);
    xDifference = MAX(0, xDifference);

    CGRect upper = rect1.origin.y < rect2.origin.y ? rect1 : rect2;
    CGRect lower = rect2.origin.y < rect1.origin.y ? rect1 : rect2;

    CGFloat yDifference = upper.origin.y == lower.origin.y ? 0 : lower.origin.y - (upper.origin.y + upper.size.height);
    yDifference = MAX(0, yDifference);

    return CGSizeMake(xDifference, yDifference);
}

谢谢您的回答。但是假设矩形的大小不同,我该如何考虑大小差异? - thedarkside ofthemoon
我不确定我是否理解你的问题,因为在我看来,这种方法将找到两个CGRect之间的最短距离,而不考虑它们的大小。 - jalmaas

3

稍微相关的话题,这里是计算两个给定CGRect中心点之间距离的方法:

CGFloat CGRectGetDistanceBetweenCenters( CGRect rect1, CGRect rect2 )
{
   CGPoint center1 = CGPointMake( CGRectGetMidX( rect1 ), CGRectGetMidY( rect1 ) );
   CGPoint center2 = CGPointMake( CGRectGetMidX( rect2 ), CGRectGetMidY( rect2 ) );

   CGFloat horizontalDistance = ( center2.x - center1.x );
   CGFloat verticalDistance = ( center2.y - center1.y );

   CGFloat distance = sqrt( ( horizontalDistance * horizontalDistance ) + ( verticalDistance * verticalDistance ) );

   return distance;
}

1
将批准的答案添加Swift版本:

extension CGRect {

    func distance(from rect: CGRect) -> CGSize {
        if intersects(rect) {
            return CGSize(width: 0, height: 0)
        }

        let mostLeft = origin.x < rect.origin.x ? self : rect
        let mostRight = rect.origin.x < self.origin.x ? self : rect

        var xDifference = mostLeft.origin.x == mostRight.origin.x ? 0 : mostRight.origin.x - (mostLeft.origin.x + mostLeft.size.width)
        xDifference = CGFloat(max(0, xDifference))

        let upper = self.origin.y < rect.origin.y ? self : rect
        let lower = rect.origin.y < self.origin.y ? self : rect

        var yDifference = upper.origin.y == lower.origin.y ? 0 : lower.origin.y - (upper.origin.y + upper.size.height)
        yDifference = CGFloat(max(0, yDifference))

        return CGSize(width: xDifference, height: yDifference)
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接