Minkowski和矩形交叉计算

时间:2013-04-24 17:26:30

标签: android algorithm sprite collision-detection collision

我一直在研究确定2个矩形相交的最佳方法,并使用Minkowski总和进行研究。

如果有人能够解释如何使用Minkowski总和确定2个矩形的碰撞时间和位置(即哪个边缘),我将不胜感激。

我已经阅读了很多相关内容,但我不确定如何正确实现这一点。

由于

代码是:

float w = 0.5 * (A.width() + B.width());
float h = 0.5 * (A.height() + B.height());
float dx = A.centerX() - B.centerX();
float dy = A.centerY() - B.centerY();

if (abs(dx) <= w && abs(dy) <= h)
{
/* collision! */
float wy = w * dy;
float hx = h * dx;

if (wy > hx)
    if (wy > -hx)
        /* collision at the top */
    else
        /* on the left */
else
    if (wy > -hx)
        /* on the right */
    else
        /* at the bottom */
}

2 个答案:

答案 0 :(得分:2)

如果你的矩形是轴对齐的,那么有一个简单的方法:

矩形A和B 相交,如果

(A.Left > B.Right) or 
(A.Right < B.Left) or 
(A.Top < B.Bottom) or 
(A.Bottom > B.Top)

否则会发生碰撞。

如果您的矩形不是轴对齐的,那么您可以使用有效的separating axes algorithm

修改:使用Minkowski总和进行动态碰撞:

让我们有移动矩形A和直立矩形B.让A的速度矢量为(vx,vy)。我们希望找到第一次碰撞的时刻,并确定哪些边缘相互接触。

首先,将一个矩形缩小到具有相同中心的点,将A.Width对称地展开A.Width,然后通过A.Height展开B.Height(使Minkowski求和)。现在我们必须找到线(光线)与矩形的交点。 enter image description here

有一些方法,例如,我们可以使用Liang-Barsky line clipping algorithm。注意我们不要检查所有的交叉点,因为我们只需要第一次碰撞 - 如果vx&gt; = 0,检查左边的交叉点并忘记右边缘等等......

答案 1 :(得分:0)

我已经晚了7年,但我想分享一下我在这个问题上挠头几个小时所获得的“几何外行”直觉。

随附了有关此算法的问题的一些注释,我已逐步进行了注释,以帮助我理解这些值之间的关系。 (希望为我的回复附上备注与Stack Overflow的政策相差不远)

page 1

page 2