c++中如何求两个矩形是否重叠_c++判断矩形碰撞逻辑


两个矩形重叠当且仅当x方向和y方向均重叠;即max(x1,x2)

判断两个矩形是否重叠的核心逻辑

两个轴对齐矩形(AABB)不重叠,当且仅当其中一个完全在另一个的左侧、右侧、上方或下方。因此,**重叠的充要条件是:x方向重叠 AND y方向重叠**。这是最可靠、最高效的方式,避免了所有边界情况误判。

std::minstd::max 计算重叠区间

假设每个矩形用左上角 (x, y) 加宽高 wh 表示(y 向下为正),则右下角为 (x + w, y + h)。重叠判断可转化为两区间交集是否非空:

  • x 方向:区间 [x1, x1 + w1)[x2, x2 + w2) 是否有交集
  • y 方向:同理判断 [y1, y1 + h1)[y2, y2 + h2)
  • 交集非空 ⇔ std::max(left1, left2)
bool rectanglesOverlap(float x1, float y1, float w1, float h1,
                       float x2, float y2, float w2, float h2) {
    float right1 = x1 + w1;
    float right2 = x2 + w2;
    float bottom1 = y1 + h1;
    float bottom2 = y2 + h2;

    bool xOverlap = std::max(x1, x2) < std::min(right1, right2);
    bool yOverlap = std::max(y1, y2) < std::min(bottom1, bottom2);

    return xOverlap && yOverlap;
}

注意坐标系和边界处理(易踩坑点)

很多 bug 来自对“是否包含边界”的模糊处理。C++ 中常用半开区间(如 [left, right))更安全,尤其配合浮点数或像素级坐标时:

  • 若矩形定义为 left, top, right, bottom(即已含右/下边界),则直接用 left1
  • 若使用整数坐标且要求“边接触不算重叠”,需把比较符改为 或调整区间定义
  • 浮点数比较时,慎用 == 判断边界相等;优先用区间不等式逻辑,而非计算交集面积是否 > 0

性能与可读性兼顾的写法

无需引入额外结构体也能写出清晰代码。关键在于把“分离条件”取反——比枚举四种分离情形更简洁、不易漏:

立即学习“C++免费学习笔记(深入)”;

auto overlap = !(x1 + w1 <= x2 ||  // A 在 B 左侧
                  x2 + w2 <= x1 ||  // B 在 A 左侧
                  y1 + h1 <= y2 ||  // A 在 B 上方
                  y2 + h2 <= y1);   // B 在 A 上方

这行逻辑等价于前述 xOverlap && yOverlap,但更贴近人脑直觉(“不分离”即重叠)。只要矩形宽高非负,该写法鲁棒且无分支预测惩罚。

真正复杂的是旋转矩形或带 transform 的场景——那得用分离轴定理(SAT),但那是另一回事了。


# c++  # 结构体  # transform  # bug  # 的是  # 这是  # 浮点数  # 充要条件  # 那是  # 也能  # 回事  # 其中一个  # 四种  # 而非 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 网络优化76771 】 【 技术知识130152 】 【 IDC云计算60162 】 【 营销推广131313 】 【 AI优化88182 】 【 百度推广37138 】 【 网站推荐60173 】 【 精选阅读31334


相关推荐: Go 中 defer 在 goroutine 内部不生效的原因与执行时机详解  Win11怎么关闭触摸屏_禁用Win11笔记本触摸屏功能设置【教程】  php订单日志怎么记录评价_php记录订单评价日志方法【方法】  Win11怎么制作U盘启动盘_Win11原版系统安装盘制作【详解】  Win11如何设置开机自动联网 Win11宽带连接自动拨号【步骤】  Go 语言标准库为何不提供泛型 Contains 方法:设计哲学与类型系统约束  Windows的便笺功能如何使用?(桌面备忘技巧)  Win11怎么更改鼠标指针_Windows 11自定义鼠标样式与大小【美化】  MAC如何修改默认应用程序_MAC文件后缀关联设置与打开方式更改【教程】  Python字符串处理进阶_切片方法解析【指导】  如何在 Go 中正确反序列化多个并列的 XML 元素(而非 XML 数组)  Win11如何卸载OneDrive_Win11卸载OneDrive方法【教程】  win11如何清理传递优化文件 Win11为C盘瘦身删除更新缓存【技巧】  c# 如何深拷贝和浅拷贝  Win11怎么清理C盘虚拟内存_Win11清理虚拟内存设置【教程】  Golang如何实现基本的用户注册_Golang用户注册表单处理示例  C++友元类使用场景_C++类间协作设计方式讲解  如何在Golang中编写异步函数测试_Golang异步操作测试策略  全球各国上班时间表外贸邮件时间  如何在Windows中创建新的用户账户?(标准与管理员)  Windows怎样关闭桌面弹窗广告_Windows关闭桌面弹窗设置【教程】  MAC怎么使用表情符号面板_MAC Emoji快捷键调用与符号查找【方法】  如何在Golang中处理数据库事务错误_回滚和日志记录  c++如何获取map中所有的键_C++遍历键值对提取所有key的方法  短链接还原php提示内存不足_调整PHP内存限制设置【技巧】  c++怎么使用std::unique实现去重_c++ 容器元素排序与连续重复删除【教程】  Python配置文件操作教程_JSONINIYAML解析与应用实战  如何使用Golang捕获测试日志_Golang testing日志记录方法  如何在Mac上搭建Golang开发环境_使用Homebrew安装和管理Go版本  Win11文件扩展名怎么显示_Win11查看文件后缀名设置【基础】  Win11如何设置开机问候语 Win11修改登录界面提示【技巧】  Go 中 := 短变量声明的类型推导机制详解  Win10路由器怎么隐藏ssid Win10隐藏wifi名称设置【指南】  Python实现图数据库操作_Neo4j核心CRUD与图算法解析  如何在Golang中处理通道发送接收错误_防止阻塞或panic  php怎么下载安装后设置默认字符集_utf8配置步骤【详解】  MAC怎么截图并快速编辑_MAC自带截图快捷键与标注工具使用【方法】  Win10怎样清理C盘爱奇艺缓存_Win10清理爱奇艺缓存步骤【步骤】  mac怎么安装字体_MAC添加第三方字体与字体册管理【教程】  c++的static关键字有什么用 静态变量和静态函数的应用场景【教程】  微信企业付款回调PHP怎么接收_处理企业付款异步通知数据教程【教程】  如何在Golang中编写端到端测试_Golang E2E测试流程示例  c# Task.ConfigureAwait(true) 在什么场景下是必须的  c++的STL算法库find怎么用 在容器中查找指定元素【实用教程】  如何在Golang中处理二进制数据_Golang io与encoding/binary二进制操作方法  Windows10任务栏图标变成白色文件_Win10重建图标缓存修复方法  Golang如何测试HTTP中间件_Golang HTTP中间件功能测试实践  windows 10应用商店区域怎么改_windows 10微软商店切换地区方法  Win10如何备份注册表_Win10注册表备份步骤【攻略】  如何在 VS Code 中正确配置并使用 NumPy 

 2026-01-05

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

致胜网络推广营销网


致胜网络推广营销网

致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。

 915688610

 17370845950

 915688610@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.