ATX 判断两个平行与坐标轴的矩形是否相交

codeskyblue · 2021年11月09日 · 最后由 codeskyblue 回复于 2021年11月09日 · 3324 次阅读

背景

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

问题

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

解法 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 则表示两个矩形相交。

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 3 条回复 时间 点赞

max_area =a_area + b_area< (a_area + b_area) * 2 也相交?

另外都给了左下右上的坐标,还平行于坐标轴,直接判断两个左下和另外两个右上的关系不就行了。

为 lx1, ly1, rx2, ry2 计算出面积 max_area

没看懂,是说 max_area = (rx2 - lx1) * (ly1 - ry2) 吗

Ouroboros 回复

是的,我想多了

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册