Java 圆圈碰撞预测(后续)

Java 圆圈碰撞预测(后续),java,libgdx,box2d,linear-algebra,collision,Java,Libgdx,Box2d,Linear Algebra,Collision,圆A沿x轴向右移动。圆B沿y轴向上移动。我想知道他们是否会相撞。(不是什么时候,只是如果。) 半径相同,恒定速度不同 似乎解决了这个问题,我的问题应该是这个问题的后续。(对没有足够的声誉发表评论表示歉意。) 我似乎无法为t(时间)求解所提供的方程(如果t存在,圆圈将发生碰撞): 这里再次以可读的术语: (CircleA.initialPosition.x + t*CircleA.velocity.x - CircleB.initialPosition.x - t*CircleB.veloci

圆A沿x轴向右移动。圆B沿y轴向上移动。我想知道他们是否会相撞。(不是什么时候,只是如果。)

半径相同,恒定速度不同

似乎解决了这个问题,我的问题应该是这个问题的后续。(对没有足够的声誉发表评论表示歉意。)

我似乎无法为t(时间)求解所提供的方程(如果t存在,圆圈将发生碰撞):

这里再次以可读的术语:

(CircleA.initialPosition.x + t*CircleA.velocity.x - 
 CircleB.initialPosition.x - t*CircleB.velocity.x)^2
+
(CircleA.initialPosition.y + t*CircleA.velocity.y - 
 CircleB.initialPosition.y - t*CircleB.velocity.y)^2
=
(CircleA.radius + CircleB.radius)^2
在我的例子中,这稍微简单一点,因为圆沿着轴移动(一个轴上的速度为0),半径相同:

(CircleA.initialPosition.x + t*CircleA.velocity.x - 
 CircleB.initialPosition.x)^2
+
(CircleA.initialPosition.y - CircleB.initialPosition.y - 
 t*CircleB.velocity.y)^2
=
(2*radius)^2
我仍然无法解决这个问题,而且提供的链接对我的厚脑袋也没有帮助

(尤其是我不明白

sqrt(-(D4 - D3)^2)
sqrt()中的表达式总是负数,因此总是失败。我缺少什么?)

撇开自动解算器不谈,我希望有人能告诉我如何解t的方程(也许一位主持人可以把这些问题结合起来,很抱歉给你添麻烦)


或者,任何其他解决问题的方法,可能使用我不知道的内置box2d功能。

好吧,我想出了如何解决t的方程

(Oax + t*Dax - Obx - t*Dbx)^2 + (Oay + t*Day - Oby - t*Dby)^2 = (ra + rb)^2


(Oax * (Oax + t*Dax - Obx - t*Dbx) + t*Dax * (Oax + t*Dax - Obx - t*Dbx)
 - Obx * (Oax + t*Dax - Obx - t*Dbx) - t*Dbx * (Oax + t*Dax - Obx - t*Dbx))
+
(Oay * (Oay + t*Day - Oby - t*Dby) + t*Day * (Oay + t*Day - Oby - t*Dby)
 - Oby * (Oay + t*Day - Oby - t*Dby) - t*Dby * (Oay + t*Day - Oby - t*Dby))
=
(ra + rb)^2


Oax^2 + (Oax * t*Dax) - (Oax * Obx) - (Oax * t*Dbx)
 + (t*Dax * Oax) + (t*Dax)^2 - (t*Dax * Obx) - (t*Dax * t*Dbx)
 - (Obx * Oax) - (Obx * t*Dax) + Obx^2 + (Obx * t*Dbx)
 - (t*Dbx * Oax) - (t*Dbx * t*Dax) + (t*Dbx * Obx) + (t*Dbx)^2
+
Oay^2 + (Oay * t*Day) - (Oay * Oby) - (Oay * t*Dby)
 + (t*Day * Oay) + (t*Day)^2 - (t*Day * Oby) - (t*Day * t*Dby)
 - (Oby * Oay) - (Oby * t*Day) + Oby^2 + (Oby * t*Dby)
 - (t*Dby * Oay) - (t*Dby * t*Day) + (t*Dby * Oby) + (t*Dby)^2
=
(ra + rb)^2


t^2 * (Dax^2 +Dbx^2 - (Dax * Dbx) - (Dbx * Dax)
       + Day^2 +Dby^2 - (Day * Dby) - (Dby * Day))
+
t * ((Oax * Dax) - (Oax * Dbx) + (Dax * Oax) - (Dax * Obx)
      - (Obx * Dax) + (Obx * Dbx) - (Dbx * Oax) + (Dbx * Obx)
      + (Oay * Day) - (Oay * Dby) + (Day * Oay) - (Day * Oby)
      - (Oby * Day) + (Oby * Dby) - (Dby * Oay) + (Dby * Oby))
+
Oax^2 - (Oax * Obx) - (Obx * Oax) + Obx^2
  + Oay^2 - (Oay * Oby) - (Oby * Oay) + Oby^2 - (ra + rb)^2
=
0
现在它是一个标准形式的二次方程:

ax2 + bx + c = 0
这样解决:

x = (−b ± sqrt(b^2 - 4ac)) / 2a       // this x here is t
在哪里--

t存在(将发生碰撞)如果--

更新:


正如Moe Amin Allani敏锐地观察到的那样,至少有一个t的解决方案必须是正的,以便在将来检测碰撞,而不是声称发生在更早的碰撞。

公认的解决方案缺少一些东西。为了用以下公式求解该方程:

x=(−b±sqrt(b^2-4ac))/2a

这意味着:

x1=(−b+sqrt(b^2-4ac))/2a
x2=(−b-sqrt(b^2-4ac))/2a


至少x1或x2必须为正,才能正确检测碰撞。如果两者都为负值,则不会发生碰撞。

您可以将其简化为直线/圆相交问题。可以将两个移动的圆视为一个对角移动的圆(移动参照系,使一个圆静止)。然后,您想知道中心的距离何时小于
r1+r2
。这是一个更大的圆,半径为r1+r2,移动圆的中心在直线上移动。因此,一个线/圆相交的问题。有趣的方法。由于时间因素是一种预测,因此必须纳入时间因素。因此,如果一个更大的圆(r1+r2)沿着x轴移动,一条线,或者一个点,沿着y轴移动,那么我必须找到t1和t2,即圆的最右边缘和最左边缘(圆x+r和圆x-r)交叉点x的时间,然后找到t3,即点y交叉圆y的时间(中心),如果t3落在t1和t2之间,则意味着会发生碰撞。我走对了吗?这真的等同于一个圆的预测吗?我不完全确定。如果你知道所有东西的坐标(起点和两个交点)和运动部件的速度,那么你可以通过公式
v=d/t
计算时间。顺便说一下,当我说“直线/圆相交问题”时,直线和圆都没有移动。这是一个纯代数问题。整个要点是将移动形状问题简化为静态非移动形状问题,这更容易推理。是的,所有坐标都是已知的,我使用速度和距离来检索时间。这不是一个静态问题,因为它处理的是未来的交叉点,对象必须移动。时间是一个因素。一种方法是模拟box2d世界在时间上向前移动,并查看是否发生相交。但这将对性能造成负担,问题很简单,可以用另一种方法解决。我尝试了点-圈的方法-得到不一致的结果。你的速度是恒定的吗?如果是这样,那么它确实会成为一个静态问题。我知道你想要未来的相交时间,但是这个方法可以让你不用模拟任何东西就计算出来——这都是数学问题。在我的游戏中,在做出预测的时候,球的位置和速度是这样的,碰撞只能在未来发生,因此上面的计算是有效的。总的来说,你是对的。为了使检测在所有情况下都正确,必须检查t的符号。我更新了答案。非常感谢。
x = (−b ± sqrt(b^2 - 4ac)) / 2a       // this x here is t
a = Dax^2 +Dbx^2 + Day^2 +Dby^2 - (2 * Dax * Dbx) - (2 * Day * Dby)

b = (2 * Oax * Dax) - (2 * Oax * Dbx) - (2 * Obx * Dax) + (2 * Obx * Dbx)
     + (2 * Oay * Day) - (2 * Oay * Dby) - (2 * Oby * Day) + (2 * Oby * Dby)

c = Oax^2 + Obx^2 + Oay^2 + Oby^2
    - (2 * Oax * Obx) - (2 * Oay * Oby) - (ra + rb)^2
(a != 0) && (b^2 >= 4ac)