核心是检查x、y轴投影是否同时重叠:任一轴无交集则分离,两轴均重叠才算相交;推荐用min/max边界直接比较,避免中心+半宽等易错方式。

如果您需要在C++中判断两个轴对齐包围盒(AABB)矩形是否发生空间重叠,则核心在于检测它们在x轴和y轴方向上投影是否存在交集。以下是实现该判定的多种算法方案:
一、分离轴定理(SAT)简化版——双轴投影重叠判定
该方法基于分离轴定理在AABB上的特例:仅需检查x轴与y轴两个方向上的投影是否同时重叠;若任一方向无重叠,则两矩形分离;仅当两个方向均重叠时,才判定为碰撞。
1、获取矩形A的左边界x坐标:leftA = rectA.x,右边界x坐标:rightA = rectA.x + rectA.width;
2、获取矩形B的左边界x坐标:leftB = rectB.x,右边界x坐标:rightB = rectB.x + rectB.width;
3、计算x轴方向是否重叠:xOverlap = !(rightA ;
4、获取矩形A的下边界y坐标:bottomA = rectA.y,上边界y坐标:topA = rectA.y + rectA.height;
5、获取矩形B的下边界y坐标:bottomB = rectB.y,上边界y坐标:topB = rectB.y + rectB.height;
6、计算y轴方向是否重叠:yOverlap = !(topA ;
7、最终碰撞判定结果为:collision = xOverlap && yOverlap。
二、中心点与半宽高差值绝对值判定法
该方法将每个AABB转换为中心点加半尺寸表示,通过比较两中心点在各轴上的距离是否小于各自半尺寸之和来判断重叠,数值稳定性高且便于扩展至浮点运算。
1、计算矩形A中心点:centerAx = rectA.x + rectA.width / 2.0f,centerAy = rectA.y + rectA.height / 2.0f;
2、计算矩形B中心点:centerBx = rectB.x + rectB.width / 2.0f,centerBy = rectB.y + rectB.height / 2.0f;
3、计算x方向中心距绝对值:dx = abs(centerAx - centerBx);
4、计算y方向中心距绝对值:dy = abs(centerAy - centerBy);
5、计算矩形A的x方向半宽:halfWidthA = rectA.width / 2.0f,y方向半高:halfHeightA = rectA.height / 2.0f;
6、计算矩形B的x方向半宽:halfWidthB = rectB.width / 2.0f,y方向半高:halfHeightB = rectB.height / 2.0f;
7、判定条件:collision = (dx 。
三、标准库std::max与std::min组合区间交集判定法
该方法利用区间交集定义:两区间[a1,a2]与[b1,b2]相交当且仅当max(a1,b1) ≤ min(a2,b2),分别对x和y轴应用此逻辑,语义清晰且易于验证。
1、提取矩形A的x区间:xA1 = rectA.x,xA2 = rectA.x + rectA.width;
2、提取矩形B的x区间:xB1 = rectB.x,xB2 = rectB.x + rectB.width;
3、计算x方向交集左端:xIntersectLeft = std::max(xA1, xB1);
4、计算x方向交集右端:xIntersectRight = std::min(xA2, xB2);
5、判定x轴是否有交集:xIntersects = (xIntersectLeft ;
6、提取矩形A的y区间:yA1 = rectA.y,yA2 = rectA.y + rectA.height;
7、提取矩形B的y区间:yB1 = rectB.y,yB2 = rectB.y + rectB.height;
8、计算y方向交集下端:yIntersectBottom = std::max(yA1, yB1);
9、计算y方向交集上端:yIntersectTop = std::min(yA2, yB2);
10、判定y轴是否有交集:yIntersects = (yIntersectBottom ;
11、最终结果:collision = xIntersects && yIntersects。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











