矩形之间的碰撞

时间:2014-04-19 03:14:25

标签: java physics collision

我一直试图解决这个问题几个小时,互联网在这个问题上非常没有用。

我需要帮助检测和解决矩形之间的碰撞,而不是只是检测,但请注意我也提到了解决方法。

这是两个盒子,x / y宽度/高度。我只需要检测它们何时重叠,并将其中一个盒子顺利地推出另一个盒子。

另外,请注意,一个盒子是静止的 - 另一个盒子正在移动。

有没有人对此有所了解(或者可以举个例子?)我真的很感激。

我需要这些盒子能够彼此重叠。

谢谢!

3 个答案:

答案 0 :(得分:2)

我不确定这里的背景是什么(这些盒子是移动还是静止?你在寻找物理上准确的分辨率,还是只是几何上正确的分辨率?),但似乎你可以在下面完成这个方式:

1)确定是否存在箱子碰撞 2)确定两个盒子的交叉点,这将产生第三个盒子。盒子的宽度和高度是你的穿透深度。 3)将其中一个方框的中心移动到穿透深度(x - 宽度,y - 高度)。

这会导致盒子变得不相交。

仅供参考:两个方框的交点可以通过从两个方框中获取分钟的最大值和最大值来计算。

以下是我的引擎中用于盒子交叉的一些代码:

bool Bounds::IntersectsBounds(const Bounds &other) const
{
    return !(min.x > other.max.x || max.x < other.min.x
             || min.y > other.max.y || max.y < other.min.y);
}

bool Bounds::Intersection(const Bounds &other, Bounds &outBounds) const
{
    if (!this->IntersectsBounds(other)) {
        return false;
    }

    outBounds.min.x = std::max(min.x, other.min.x);
    outBounds.min.y = std::max(min.y, other.min.y);
    outBounds.max.x = std::min(max.x, other.max.x);
    outBounds.max.y = std::min(max.y, other.max.y);


    return true;
}

在这种情况下,“outBounds”变量是两个框的交集(在这种情况下是您的穿透深度)。您可以使用此框的宽度/高度来执行碰撞解决。

答案 1 :(得分:0)

呀!这是一个非常常见的问题!您可能想查看堆栈交换网络的gamedev部分!

<强>检测

bool collide(float x1,float y1,float sx1,float sy1, float x2, float y2, float sx2, float sy2){
 if (x1+sx1 <= x2)
        return false;
 if (x2+sx2 <= x1)
        return false;
 if (y1+sy1 <= y2)
        return false;
 if (y2+sy2 <= y1)
        return false;
 return true;
}

解决 至于答案,这取决于您要使用的应用程序类型。它是一个侧面滚动器,自上而下,基于瓷砖?答案取决于对这个问题的回答。我会假设一些像动态游戏或自上而下动作游戏那样充满活力的东西。

代码并不难,但实现可以。如果您在屏幕上移动的对象很少,则可以使用类似的系统进行挖掘,如下所示:

  1. 按照与当前对象的距离顺序获取当前正在碰撞的对象列表。
  2. 遍历对象,并使用以下方法解决冲突
  3. 通过向该对象发送消息并检查返回值(传送器将处理冲突解决)来检查对象是否具有某种特殊的碰撞类型(传送器等)
  4. 检查我们当前对象(A)的上一个底部位置是否高于相关对象的顶部(B),如果是这样则表示您发生了底部碰撞。通过将A的y位置设置为B的y位置减去A
  5. 的高度来解决
  6. (如果以前失败的话)检查A的前一个右侧是否在B左侧的左侧,如果是这样意味着您已经拥有右侧碰撞。通过将A的x位置设置为B的位置减去A的宽度
  7. 来解决
  8. (如果上一次失败)检查A的左侧是否在B右侧的右侧,如果是这样意味着您已经拥有左侧碰撞。通过将A的x位置设置为B的x位置加上B的宽度
  9. 来解决
  10. (如果上一次失败)检查A的上一个上方是否低于B的下方,如果是,则表示您发生了上方碰撞。通过将A的y位置设置为B的y位置以及B的高度来解决
  11. 呼。重要的是你要根据距离对对象进行排序,如果你检查与更远的物体的碰撞,它会抓住边缘!

    我希望这是有道理的!

答案 2 :(得分:0)

编辑:显然在Android中不起作用。

https://stackoverflow.com/a/15515114/3492994

使用2D Graphics API中的可用类。

Rectangle r1 = new Rectangle(100, 100, 100, 100);
Line2D l1 = new Line2D.Float(0, 200, 200, 0);
System.out.println("l1.intsects(r1) = " + l1.intersects(r1));

这不告诉你什么,是......