重叠判断的数学逻辑是先计算交集矩形边界:左=max(a.left,b.left),右=min(a.right,b.right),上=max(a.top,b.top),下=min(a.bottom,b.bottom),再检查是否有效(right>left且bottom>top),否则面积为0;需注意坐标系差异、浮点精度及边缘相接情况。

重叠判断的数学逻辑怎么写才不漏 case
两个矩形不重叠时,重叠面积就是 0;重叠时,得算出交集矩形的宽和高。关键不是套公式,而是别把坐标系搞反——C++ 里常见用 left、top、right、bottom 表示矩形(左上为原点,y 向下增长),这时交集的左边界是 max(a.left, b.left),右边界是 min(a.right, b.right),上边界是 max(a.top, b.top),下边界是 min(a.bottom, b.bottom)。
容易踩的坑:
- 没检查
right 或 <code>bottom 就直接相乘,导致负面积或错误正值 - 把
top和bottom当成 y 坐标差值用,其实它们是绝对坐标,不能直接减 - 用中心+宽高表示矩形时,没统一转成左上/右下形式,导致 max/min 混乱
用 std::max/std::min 实现安全计算
标准库函数能避免手写条件判断出错,也适配整数和浮点类型。假设矩形结构体定义为:
struct Rect {
int left, top, right, bottom;
};那么重叠面积可这样写:
立即学习“C++免费学习笔记(深入)”;
int overlapArea(const Rect& a, const Rect& b) {
int left = std::max(a.left, b.left);
int right = std::min(a.right, b.right);
int top = std::max(a.top, b.top);
int bottom = std::min(a.bottom, b.bottom);
if (left >= right || top >= bottom) return 0;
return (right - left) * (bottom - top);
}注意:right - left 和 bottom - top 是正向长度,前提是输入矩形本身满足 right > left 且 bottom > top;否则需先做归一化(比如用 std::min/max 修正顶点顺序)。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
坐标系差异引发的典型 bug
OpenGL 或某些图像库用 y 向上坐标系,而 Windows GDI、SDL 默认 y 向下。如果混用两种坐标系下的矩形数据,top 和 bottom 的大小关系会反转,导致 std::max(a.top, b.top) 算出错误上边界。
实操建议:
- 在函数入口加断言:
assert(a.right > a.left && a.bottom > a.top) - 若输入可能来自不同坐标系,先统一转换:比如把“y 向上”的矩形
top映射为屏幕高度减原bottom - 测试用例必须包含边缘相接(如
a.right == b.left)的情况——此时重叠面积应为 0,不是负数也不是小正数
浮点矩形要小心精度与比较
用 float 或 double 表示坐标时,left >= right 这种判断可能因浮点误差失效。不能直接用 == 或 >= 判定无重叠。
推荐做法:
- 引入小阈值
eps = 1e-6,改用right - left 判断宽度无效 - 面积计算后,再用
std::max(0.0, area)截断负值,比提前 return 更鲁棒 - 避免对坐标做多次四舍五入,尤其在缩放或 DPI 变换后传入前,先做一次
std::round或std::floor归一化
重叠面积本身是个简单计算,但真正难的是让代码在各种坐标约定、数据来源、数值类型下都稳得住——边界条件比中间逻辑更值得花时间盯住。

















