圆圈碰撞预测(后续)

时间:2018-06-03 06:40:40

标签: java libgdx box2d linear-algebra collision

圆圈A沿x轴向右移动。圆B沿y轴向上移动。我想知道他们是否会碰撞。 (不是在何时,只是如果。)

半径相同,不同的恒定速度。

This answer似乎解决了这个问题,我的问题应该更好地成为后续问题。 (抱歉没有足够的声誉来发表评论。)

我似乎无法解决t(时间)所提供的等式(如果t存在,圆圈会发生碰撞):

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

这里再次用可读的术语表示:

(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

我仍然无法解决问题,所提供的auto-solver链接也无助于我的头脑。

(特别是我没有得到

sqrt(-(D4 - D3)^2)

sqrt()中的表达式始终为负数,因此始终失败。我错过了什么?)

除了自动求解器,我希望有人可以展示解决t方程的方法(也许主持人可以将这些问题结合起来,对不起麻烦)。

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

2 个答案:

答案 0 :(得分:1)

可接受的解决方案缺少某些内容。为了解决这个问题,用:

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

这意味着:

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

至少x1或x2必须为,以便正确检测到碰撞。如果两者均为负,则不会发生冲突。

答案 1 :(得分:0)

好吧,我想出了如何解决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

其中 -

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)