C++ 如何判断两个矩形框有交集

矩形框是否有交集的判断

本人也查找了一些方法,发现直接套用公式,无法满足需求,主要是自己没有花一点时间去思考;

矩形框的判断,主要方法是判断两个矩形没有交集,然后再取反,就能判断出矩形框是否存在交集;

但是其中重要的一点是需要结合坐标系,主要是y轴数据的变化

坐标系一(普通坐标系)

在这里插入图片描述
蓝色刻度是x轴,红色刻度是y轴;

(x11, y11)和 (x12, y12)是红色矩形框的坐标

(x21, y21)和 (x22, y22)是蓝色矩形框的坐标

存在以下情况说明矩形框无交集

x12 < x21 || x22 < x11 ||  y12 > y21  || y22 > y11

接口如下

bool cal(int32_t x11,int32_t y11,int32_t x12,int32_t y12,int32_t x21,int32_t y21,int32_t x22,int32_t y22)
{    
    if(!(x12 > x21 || x22 > x11 ||  y12 > y21  || y22 > y11))
    {
        return true;   //有交集

    }else{
        return false;   //无交集
    }
}

坐标系二(针对图像中的矩形数据)

在这里插入图片描述
蓝色刻度是x轴,红色刻度是y轴;

(x11, y11)和 (x12, y12)是红色矩形框的坐标

(x21, y21)和 (x22, y22)是蓝色矩形框的坐标

存在以下情况说明矩形框无交集

x12 < x21 || x22 < x11 ||  y12 < y21  || y22 < y11

接口如下

bool cal(int32_t x11,int32_t y11,int32_t x12,int32_t y12,int32_t x21,int32_t y21,int32_t x22,int32_t y22)
{    
    if(!(x12 < x21 || x22 < x11 ||  y12 < y21  || y22 < y11))
    {
        return true;   //有交集

    }else{
        return false;   //无交集
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
判断两个长方体是否交集可以分为两种情况:一种是两个长方体相交,另一种是两个长方体包含。 相交的情况可以通过判断两个长方体的最小包围盒(也就是包含两个长方体的最小长方体)是否相交判断。如果相交,则两个长方体一定相交。 包含的情况可以分别判断两个长方体的六个面是否被另一个长方体包含。如果两个长方体都有一个面被另一个长方体包含,则两个长方体一定包含。 下面是一个简单的 C++ 代码实现: ```cpp #include <iostream> #include <algorithm> using namespace std; struct Point { int x, y, z; }; struct Rect { Point p1, p2; }; bool isOverlap(Rect r1, Rect r2) { Rect overlap = { {max(r1.p1.x, r2.p1.x), max(r1.p1.y, r2.p1.y), max(r1.p1.z, r2.p1.z)}, {min(r1.p2.x, r2.p2.x), min(r1.p2.y, r2.p2.y), min(r1.p2.z, r2.p2.z)} }; return overlap.p1.x <= overlap.p2.x && overlap.p1.y <= overlap.p2.y && overlap.p1.z <= overlap.p2.z; } bool isContain(Rect r1, Rect r2) { for (int i = 0; i < 6; i++) { Point p = {r2.p1.x + (i % 2) * (r2.p2.x - r2.p1.x), r2.p1.y + ((i / 2) % 2) * (r2.p2.y - r2.p1.y), r2.p1.z + (i / 4) * (r2.p2.z - r2.p1.z)}; if (p.x >= r1.p1.x && p.x <= r1.p2.x && p.y >= r1.p1.y && p.y <= r1.p2.y && p.z >= r1.p1.z && p.z <= r1.p2.z) { return true; } } return false; } bool isOverlapOrContain(Rect r1, Rect r2) { return isOverlap(r1, r2) || isContain(r1, r2) || isContain(r2, r1); } int main() { Rect r1 = {{0, 0, 0}, {10, 10, 10}}; Rect r2 = {{5, 5, 5}, {15, 15, 15}}; if (isOverlapOrContain(r1, r2)) { cout << "Overlap or contain" << endl; } else { cout << "No overlap" << endl; } return 0; } ``` 这个实现中,我们定义了 `Point` 和 `Rect` 结构体分别表示一个点和一个长方体。其中,长方体用两个顶点的坐标 `p1` 和 `p2` 表示。 `isOverlap` 函数用于判断两个长方体是否相交,它通过计算两个长方体的最小包围盒的顶点坐标来得到最小包围盒,然后判断最小包围盒是否存在。如果存在,则两个长方体相交。 `isContain` 函数用于判断一个长方体是否被另一个长方体包含。它通过遍历一个长方体的六个面上的点来判断这些点是否都在另一个长方体内。如果都在,则一个长方体包含另一个长方体。 `isOverlapOrContain` 函数用于判断两个长方体是否相交或包含。它调用了 `isOverlap` 和 `isContain` 函数来完成这个任务。 在 `main` 函数中,我们定义了两个长方体 `r1` 和 `r2`,然后调用了 `isOverlapOrContain` 函数来判断它们是否相交或包含。如果是,则输出 "Overlap or contain",否则输出 "No overlap"。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值