Android 矩形相交计算的Minkowski和

Android 矩形相交计算的Minkowski和,android,algorithm,sprite,collision-detection,collision,Android,Algorithm,Sprite,Collision Detection,Collision,我一直在研究确定两个矩形相交的最佳方法,并一直在研究使用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(); fl

我一直在研究确定两个矩形相交的最佳方法,并一直在研究使用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 */
}
float w=0.5*(A.宽度()+B.宽度());
浮动h=0.5*(A.高度()+B.高度());
浮动dx=A.centerX()-B.centerX();
浮动dy=A.centerY()-B.centerY();
if(防抱死制动系统(dx)-hx)
/*顶部碰撞*/
其他的
/*在左边*/
其他的
如果(wy>-hx)
/*在右边*/
其他的
/*在底部*/
}

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

矩形A和B不相交,如果

(A.Left > B.Right) or 
(A.Right < B.Left) or 
(A.Top < B.Bottom) or 
(A.Bottom > B.Top)
(A.左>B.右)或
(A.右B.顶部)
否则会发生碰撞

如果矩形未与轴对齐,则可以使用有效的

编辑:使用Minkowski和的动态碰撞:

让我们有移动的矩形A和站立的矩形B。让我们来看看A的速度向量是(vx,vy)。我们希望找到第一次碰撞的时刻,并确定哪些边彼此接触

首先,将一个矩形收缩到具有相同中心的点,对称地将B.宽度扩展A.宽度,将B.高度扩展A.高度(使Minkowski和)。现在我们必须找到直线(光线)和矩形的交点。


有一些方法,例如,我们可以使用。注意,我们不需要检查所有的交叉点,因为我们只需要第一次碰撞-如果vx>=0,检查左边缘的交叉点,忘记右边缘等等…

我迟到了7年,但我想我会分享一些“几何外行”的直觉,我在这几个小时里挠头得到的

随附的是一个涉及该算法的问题的一些注释,我通过这些注释了解了这些值之间的关系。(希望为我的回复附加注释与Stack Overflow的策略不太冲突)


Hi@MBo-我使用的是轴对齐的简单边界矩形/正方形。没有旋转(或者至少没有需要CD的旋转)。你的方法的问题是,它不会告诉我哪条边正在碰撞,而且如果两条边相交,哪条边先相交,我需要这些信息来对碰撞作出反应/重新定位移动的精灵。你知道我会怎么做吗?因为我已经找了两天了,到目前为止我尝试的一切都失败了。我们将不胜感激。谢谢你能详细解释一下吗@Mbo,我不太明白你的意思。。。。谢谢