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

19次阅读

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

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

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

两个轴对齐矩形(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),但那是另一回事了。

text=ZqhQzanResources