两个aabb矩形不相交当且仅当x或y轴上完全分离;否则必碰撞。用min/max坐标判定比中心+半宽更安全,避免浮点误差与负尺寸问题,需确保构造时校正max值。

两个 AABB 矩形不相交,当且仅当在任意一个坐标轴(x 或 y)上完全分离;反之,只要 x 和 y 两个方向都存在重叠,就一定发生碰撞。
用 min/max 坐标判断重叠比用中心+半宽更安全
很多初学者习惯用中心点加 half-width/half-height 表示 AABB,但容易在浮点误差或负尺寸时出错。直接使用 min_x、max_x、min_y、max_y 四个值做判定,逻辑清晰、无符号假设、兼容性更好。
- 确保构造时已校正:若输入是左上角+宽高,需显式计算
max_x = min_x + width,并处理width 的情况(调用 <code>std::minmax) - 不要依赖“宽度为正”的隐含假设,否则
rect1.max_x 在负宽时可能误判为分离 - 浮点比较建议用
而非 <code>,避免因精度丢失漏掉边界接触(如 <code>rect1.max_x == rect2.min_x应视为接触)
标准分离轴检测写法(C++ 函数示例)
这是最常用也最不容易出错的写法,基于“分离即不碰撞”反向逻辑:
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
bool aabb_intersects(const AABB& a, const AABB& b) {
return !(a.max_x
<p>注意四个条件全是 <code>,保证边对齐(如 <code>a.max_x == b.min_x</code>)被当作相交。如果业务要求“严格重叠(排除边缘接触)”,才改用 <code>。</code></code></p>
<h3>常见错误:混淆坐标系 Y 轴方向</h3>
<p>图形 API(如 OpenGL、SDL)常以屏幕左上为原点、Y 向下增长;而数学/物理引擎(如 Box2D、Bullet)多采用 Y 向上。AABB 的 <code>min_y</code>/<code>max_y</code> 含义会因此反转:</p>
- 若你从图像像素坐标构建 AABB,
min_y实际对应“顶部行”,max_y对应“底部行”,此时a.max_y 表示 “a 完全在 b 上方”,逻辑不变 - 但若混用不同坐标系的 AABB(比如把渲染用 AABB 直接喂给物理引擎),
min_y/max_y的语义错位会导致碰撞永远不触发或永远触发 - 建议统一在数据结构里加注释,例如:
// y-up: min_y = bottom, max_y = top,并在构造函数里 assert 检查min_y
真正容易被忽略的是坐标系一致性——哪怕算法写对了,只要两个 AABB 的 y 方向解释相反,结果就是错的。别只盯公式,先确认你的 min_y 到底代表哪条边。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










