Search code examples
geometrydistancecgrectcgpointcgsize

Distance between two rectangles


How can I find the distance between two rectangles? Intersects should return 0 in distance.


Solution

  • Here's a quick function for calculating distance between two CGRects represented by a CGSize:

    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);
    }