碰撞检测 rectangle/rectangle 算法

Collision Detection rectangle/rectangle algorithm

http://jeffreythompson.org/collision-detection/rect-rect.php

我想弄清楚 rectangle/rectangle 与矩形的图片和代码的碰撞检测算法。根据 Jeff Thompson 的碰撞检测文章,有价值的 r1RightEdge 是 r1x + r1w。

float r1RightEdge = r1x + r1w;
if (r1RightEdge >= r2x) {
// right edge of r1 is past left edge of r2
}

图中蓝色矩形的r1RightEdge垂直虚线是有价值的吗?如果是这样,为什么有价值的 r1RightEdge 是 r1x +r1w 而不是 r1x+r1h?

基于示例代码

if (r1x + r1w >= r2x &&     // r1 right edge past r2 left
  r1x <= r2x + r2w &&       // r1 left edge past r2 right
  r1y + r1h >= r2y &&       // r1 top edge past r2 bottom
  r1y <= r2y + r2h) {       // r1 bottom edge past r2 top
    return true;
}
return false;

我理解 x(在你的例子中:r1x)表示 r1 左上点的水平位置 - 或 R1LeftEdge,只有在我们添加 r1w(宽度)时才有意义,因为它们都是水平,结果是 r1 - 或 R1RightEdge 的水平右上角点。 "r1x+r1h" 没有意义,因为一个是水平的,另一个是垂直的。

通用且更简单的解决方案可以是:

// If one rectangle is on left side of other 
if (r1x > r2x + r2w || r2x > r1x + r1w) 
    return false; 

// If one rectangle is above other 
if (r1y > r2y + r2h || r2y > r1y + r1h) 
    return false; 

// If none of the above meet then there will be a intersection
return true;

这也将处理矩形相交但任何矩形的角 none 位于其他矩形内的特殊情况。