讲师中心 微信公众号
AI工具推荐 视频效率加速

c++怎么判断两个矩形是否相交_c++图形碰撞算法【逻辑】

冬芳同学_8630

冬芳同学_8630

发布时间:2026-03-13 20:03:12

|

537人浏览过

|

来源于php中文网

原创

两个矩形相交当且仅当在x轴和y轴上均重叠,即rect1.left < rect2.right && rect1.right > rect2.left && rect1.top < rect2.bottom && rect1.bottom > rect2.top。

c++怎么判断两个矩形是否相交_c++图形碰撞算法【逻辑】

判断两个矩形是否相交的最简逻辑

只要两个矩形在 x 轴和 y 轴上都重叠,它们就相交。反过来说:如果在任一轴上完全分离,就一定不相交。这是所有轴对齐矩形(AABB)碰撞检测的基础,不涉及旋转、浮点误差容忍或图形库封装。

常见错误是写成“四边全部交叉”,或者误用中心点距离——这两种都会漏判或误判。正确做法是用「分离轴定理」的退化形式:只检查两个轴。

  • 假设矩形用 left、right、top、bottom 表示(y 向下为正,常见于 SDL / WinAPI / 大多数 GUI 坐标系)
  • 相交条件就是:rect1.left rect2.left && rect1.top rect2.top
  • 如果坐标系 y 向上为正(如 OpenGL 纹理坐标),只需把 top/bottom 含义对调,逻辑不变

用 std::pair 或结构体传参时的典型坑

很多人把矩形封装成 std::pair<:pair>, std::pair<int>></int></:pair> 或类似嵌套结构,结果比较时搞混 left/right 顺序,或者忘记 first/second 对应的是 x 还是 y。

更稳妥的做法是定义清晰字段名:

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

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
struct Rect {
    int left, right, top, bottom;
};
bool intersects(const Rect& a, const Rect& b) {
    return a.left < b.right && a.right > b.left &&
           a.top < b.bottom && a.bottom > b.top;
}
  • 别依赖 std::tuple 或匿名结构体——读代码时容易看错字段顺序
  • 如果矩形用 x、y、w、h 表示,务必先转成 left= x、right = x + w、top = y、bottom = y + h 再判断;直接拿 w/h 做比较会出错
  • 注意:w 和 h 必须为非负值;若可能为负(比如用户拖拽拉出反向矩形),先归一化:left = std::min(x, x+w); right = std::max(x, x+w);

浮点矩形相交要额外注意什么

用 float 或 double 表示坐标时,相等判断不可靠,但「分离」本身是安全的——因为只要有一个轴严格分离(比如 a.right ),就肯定不相交。

真正要小心的是「刚好贴边」的情况:数学上 a.right == b.left 应算不相交,但浮点计算可能因误差变成 a.right > b.left - eps,导致误判为相交。

  • 如果业务要求「贴边不算碰撞」,保留原始比较即可( 和 <code>> 已足够鲁棒)
  • 如果要求「贴边算碰撞」,可引入 epsilon:用 a.right + eps > b.left 替代 a.right > b.left,但需统一所有四次比较,且 eps 不能大于最小有效尺寸(比如像素级场景设 1e-4f 就过大)
  • 避免用 == 判断边界重合——它既不稳定,也不符合碰撞语义

性能与内联注意事项

这个函数极轻量,现代编译器在 -O2 下基本都能自动内联。但如果你把它写成虚函数、通过指针调用、或放在模板参数里层层转发,就可能抑制优化。

  • 确保函数定义在头文件中,或加 inline 关键字(C++17 起 constexpr 函数默认内联)
  • 避免在循环体内反复构造临时 Rect 对象——尤其是从 std::vector 中按索引取数据时,先解包再传参
  • 如果批量检测(比如 1000 个矩形两两检测),O(n²) 复杂度下,这一步不是瓶颈;真正的瓶颈往往在内存访问模式——尽量让 Rect 对象连续存储,别用指针数组打散

边界条件比想象中多:空矩形(left >= right 或 top >= bottom)、整数溢出(right 超过 INT_MAX)、坐标系混用——这些地方不报错,但结果不可控。

热门AI工具

更多
蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

更多
css中float用法
css中float用法

css中float属性允许元素脱离文档流并沿其父元素边缘排列,用于创建并排列、对齐文本图像、浮动菜单边栏和重叠元素。想了解更多float的相关内容,可以阅读本专题下面的文章。

6567

2024.04.28

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

764

2025.10.23

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

4714

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

4871

2025.07.04

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

3988

2025.08.29

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

764

2025.10.23

C++ 智能指针与现代内存管理
C++ 智能指针与现代内存管理

深入讲解 C++ 现代内存管理的核心工具——智能指针,涵盖 unique_ptr 独占所有权语义、shared_ptr 引用计数机制与循环引用问题、weak_ptr 弱引用的应用场景、make_unique/make_shared 工厂函数的性能优势、自定义删除器的编写、RAII 资源管理思想的实践,以及从裸指针迁移到智能指针的重构策略,帮助开发者编写安全无泄漏的现代 C++ 代码。

359

2026.04.23

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

5936

2023.08.14

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

80

2026.10.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn