android - 用于矩形相交计算的 Minkowski 和

标签 android algorithm sprite collision-detection collision

我一直在研究确定 2 个矩形相交位置的最佳方法,并且一直在研究使用 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 */
}

最佳答案

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

矩形 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矩形缩小到同心点,B.Width对称地扩大A.Width,B.Height对称地扩大A.Height(做Minkowski和)。现在我们必须找到线(射线)与矩形的交点。 enter image description here

有一些方法,比如我们可以用Liang-Barsky line clipping algorithm .请注意,我们不必检查所有交点,因为我们只需要第一次碰撞 - 如果 vx >=0,则检查与左边缘的交点并忘记右边缘等等......

关于android - 用于矩形相交计算的 Minkowski 和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16198437/

相关文章:

ios - cocos2d 动画不显示 Sprite 表

java - 为什么在android中多次调用ListView的getVIew方法

android - 无法通过 Android 设备中的 Worklight http 适配器连接到后端

使用 parallelStream 和 forEach 的 Java 并行化,其中每个部分都是完全独立的

algorithm - 最好的预留座位排序算法是什么?

css - CSS Sprite 按钮结束在表格内掉落

python - 如何在pygame中制作半透明 Sprite

安卓工作室 2.2.2 : All packages are not available for download

java - 添加自签名证书 OkHttpClient

list - 使用每组的一个数字查找多组中的数字总和