Java 矩形之间的碰撞

Java 矩形之间的碰撞,java,physics,collision,Java,Physics,Collision,我试图解决这个问题已经有几个小时了,而互联网在这个问题上却毫无成果 我需要帮助检测和解决矩形之间的碰撞,不仅仅是检测,还要注意我提到的解决方法 这是两个框,具有x/y宽度/高度。我只需要检测它们何时重叠,并将其中一个盒子从另一个盒子中顺利推出 另外,请注意一个盒子是静止的,另一个在移动 有没有人对此有什么建议(或者可以给我举个例子?)我非常感谢 我需要的盒子,以便能够休息的顶部彼此以及 谢谢大家! 我不确定这里的背景是什么(这些盒子是移动的还是静止的?你是在寻找一个物理上精确的分辨率,还是仅仅是

我试图解决这个问题已经有几个小时了,而互联网在这个问题上却毫无成果

我需要帮助检测和解决矩形之间的碰撞,不仅仅是检测,还要注意我提到的解决方法

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

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

有没有人对此有什么建议(或者可以给我举个例子?)我非常感谢

我需要的盒子,以便能够休息的顶部彼此以及


谢谢大家!

我不确定这里的背景是什么(这些盒子是移动的还是静止的?你是在寻找一个物理上精确的分辨率,还是仅仅是一个几何上正确的分辨率?),但你似乎可以通过以下方式来实现这一点:

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

这将导致框变得不相交

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

以下是我的box intersection引擎中的一些代码:

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;
}
bool边界::相交边界(常量边界和其他)常量
{
返回!(min.x>其他.max.x | max.x<其他.min.x
||最小y>其他最大y | |最大y<其他最小y);
}
布尔边界::交叉点(常量边界和其他、边界和出界)常量
{
如果(!此->相交边界(其他)){
返回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,其他.max.x);
outBounds.max.y=std::min(max.y,other.max.y);
返回true;
}

在本例中,“outBounds”变量是两个框的交点(在本例中是您的穿透深度)。您可以使用此框的宽度/高度来执行碰撞解决方案。

是的!这是一个相当普遍的问题!您可能需要检查堆栈交换网络的部分

检测

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;
}
bool碰撞(浮点x1、浮点y1、浮点sx1、浮点sy1、浮点x2、浮点y2、浮点sx2、浮点sy2){

if(x1+sx1Edit:显然在Android中不起作用

使用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));

这没有告诉你的是,问题在哪里…

具体是什么?你在检测重叠方面做了哪些尝试?这并不复杂。检测不是问题。问题是解决碰撞。我尝试了多种方法(就像在最后一个工作位置和新位置之间插值,以找到一个新的好位置,同时停止速度并将其强制放置在盒子外)但没有一个工作良好。Brayden,看一看SAT(分离轴定理)什么构成“解算”碰撞?你在使用什么工具?你的代码在哪里?成功地将碰撞框移动到彼此之外。我没有任何工作代码值得显示。一个框是静止的,另一个不是。很抱歉没有澄清。我将修改问题并尝试你的解决方案。谢谢!你能更详细地说明交叉点计算吗e拜托?这很有效,但非常不可靠,导致了很多错误。这可能是我在实现上的错误-但在用这个方法设置了不同的解决冲突的方法一个小时后,我无法让任何东西正常工作。也许如果你发布一个github或pastebin的代码,我可以看一看。你不能在Android中使用这些,不问题主要是如何解决,如果可以的话,请比“检测碰撞,然后解决”更具体一些。谢谢你!哈哈,你可以弄明白,伙计,你是个程序员!不要让我们为你做所有的事情:D但我会对你更具体一点-我理解有时候我们需要一些外部视角。