背景

自动化判断两个组件是否重叠的时候会用到一下,这里记录一下

问题

两个矩形,分别给出左下角和右上角的坐标,判断两个矩形是否相交。

解法 1

第一个矩形:(x1,y1),(x2,y2)
第二个矩形: (x3,y3),(x4,y4)

如果满足 max(x1,x3)<=min(x2,x4)&&max(y1,y3)<=min(y2,y4),则相交。

参考:https://www.cxyzjd.com/article/zouxin_88/100831313

解法 2(排除法)

typedef struct
{
    int left;
                // leftmost: 最左
    int top;
                // topmost: 最上

    int right;
                // rightmost: 最右
    int bottom;
                // bottommost: 最下

                // 其实两个点的组合,表达的是边界的概念
                // 分别为:
                // 左边界,右边界
                // 上边界,下边界
} Rect;

bool isRectOverlap(const RECT& r1, const RECT& r2)
{
    return !( ((r1.right < r2.left) || (r1.bottom > r2.top)) || 
              ((r2.right < r1.left) || (r2.bottom > r1.top)) 
            )
}

参考:

下面的是错误解法,不要看了

假设两个矩形分别是 a, b
其中左下和右上的坐标分别是 ax1, ay1, ax2, ay2. bx1, by1, bx2, by2
a 矩形的面积为 a_area
b 矩形的面积为 b_area

取两个矩形最左上角和最右下角的坐标。为 lx1, ly1, rx2, ry2 计算出面积 max_area

如果 max_area < (a_area + b_area) * 2 则表示两个矩形相交。


↙↙↙阅读原文可查看相关链接,并与作者交流