Circle-Circle 碰撞预测(后续)
Circle-Circle Collision Prediction (followup)
圆A沿x轴向右移动。圆 B 沿 y 轴向上移动。我想知道他们是否会发生碰撞。 (不是什么时候,只是如果。)
半径相同,恒速不同
This answer 似乎解决了这个问题,我的问题最好是跟进这个问题。 (抱歉没有足够的声誉来发表评论。)
我似乎无法解决提供的方程式(如果 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提供的link也帮不了我这个笨脑袋
(特别是我不明白
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
其中--
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
t 存在(会发生碰撞)如果--
(a != 0) && (b^2 >= 4ac)
更新:
正如 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 需要 正值 才能正确检测到碰撞。如果两者都是负数,则不会发生碰撞。
圆A沿x轴向右移动。圆 B 沿 y 轴向上移动。我想知道他们是否会发生碰撞。 (不是什么时候,只是如果。)
半径相同,恒速不同
This answer 似乎解决了这个问题,我的问题最好是跟进这个问题。 (抱歉没有足够的声誉来发表评论。)
我似乎无法解决提供的方程式(如果 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提供的link也帮不了我这个笨脑袋
(特别是我不明白
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
其中--
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
t 存在(会发生碰撞)如果--
(a != 0) && (b^2 >= 4ac)
更新:
正如 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 需要 正值 才能正确检测到碰撞。如果两者都是负数,则不会发生碰撞。