我知道如何检查两个圆圈是否相互交叉。但是,有时圆圈移动得太快,最终会避免在下一帧发生碰撞。
我目前对该问题的解决方案是在前一个位置和当前位置之间检查任意次数的圆-圆碰撞。
有没有一种数学方法可以找到两个圆碰撞所需的时间?如果我能够得到那个时间值,我可以将圆圈移动到当时的位置,然后在那个点碰撞它们。
编辑:恒速
我知道如何检查两个圆圈是否相互交叉。但是,有时圆圈移动得太快,最终会避免在下一帧发生碰撞。
我目前对该问题的解决方案是在前一个位置和当前位置之间检查任意次数的圆-圆碰撞。
有没有一种数学方法可以找到两个圆碰撞所需的时间?如果我能够得到那个时间值,我可以将圆圈移动到当时的位置,然后在那个点碰撞它们。
编辑:恒速
我假设圆圈的运动是线性的。假设圆 A 的中心位置由向量方程给出Ca = Oa + t*Da
,其中
Ca = (Cax, Cay)
是当前位置
Oa = (Oax, Oay)
是起始位置
t
是经过时间
Da = (Dax, Day)
是每单位时间的位移(速度)。
同样对于圆 B 的中心:Cb = Ob + t*Db
。
然后你想找到 t 使得||Ca - Cb|| = (ra + rb)
wherera
和rb
分别是圆 A 和 B 的半径。
两边平方:
||Ca-Cb||^2 = (ra+rb)^2
并展开:
(Oax + t*Dax - Obx - t*Dbx)^2 + (Oay + t*Day - Oby - t*Dby)^2 = (ra + rb)^2
从那里你应该得到一个二次多项式,你可以解决 t (如果存在的话)。
这是在 Andrew Durward 的出色答案中求解 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)
您可以通过使用方向矢量和速度来预测碰撞,这为您提供了下一步,以及他们何时会发生碰撞(如果有的话)。
你只需要检查线交叉算法来检测...