计算移动球与移动线/多边形碰撞的时间(2D)
我有一个多边形,里面是一个移动的球。 如果球击中边界,球应该会反弹。
我当前的’解决方案’:我将多边形分成几行,并计算球何时击中移动线
所有变量:
a = length of a b = length of b c = length of c ax = x position of A ay = y position of A bx = x position of B by = y position of B cx = x position of C cy = y position of C vax = speed of A on the x-axis vay = speed of A on the y-axis vbx = speed of B on the x-axis vby = speed of B on the y-axis vcx = speed of C on the x-axis vcy = speed of C on the y-axis h = height (equals r, because it collides when h is r) r = radius t = time (one time unit equals 1 frame. not relevant) axc = x positon of A at the collision ayc = y positon of A at the collision bxc = x positon of B at the collision byc = y positon of B at the collision cxc = x positon of C at the collision cyc = y positon of C at the collision
-
计算所有点的碰撞位置:
axc:=ax+vax*t
ayc:=ay+vay*t
bxc:=bx+vbx*t
byc:=by+vby*t
cyc:=cy+vcy*t
cxc:=cx+vcx*t
-
计算所有顶点的长度
a:=√((axc-cxc)^(2)+(ayc-cyc)^(2))
b:=√((bxc-cxc)^(2)+(byc-cyc)^(2))
c:=√((axc-bxc)^(2)+(ayc-byc)^(2))
-
计算h
h=((√(2*(a^(2)*b^(2)+b^(2)*a^(2)+c^(2)*a^(2))-(a^(4)+b^(4)+c^(4))))/(2*c))
-
解决问题
solve(h=((√(2*(a^(2)*b^(2)+b^(2)*a^(2)+c^(2)*a^(2))-(a^(4)+b^(4)+c^(4))))/(2*c)), t)
BUUUUUT:我的计算器(Ti-Nspire CX CAS)崩溃了。 微软数学需要花费太长时间(我现在正在计算… 1小时但仍然没有…)
所以…帮助!
(不要质疑我的涂料技巧)
如果你的多边形是凸的并且所有的速度始终保持不变,那么你可以使用我想出的这些系列技巧(所以可能有更好的方法):
1)通过简单地扩展每行替换无限长的行。
只有在多边形为凸面时才能执行此操作。 请考虑以下图像:
红线是原始多边形,绿色是无限延伸。 这个圆圈在遇到红线之前是否曾经遇到绿线? 不,我们现在可以专注于击球无限长的线,这对于(至少对我而言)来说是更简单的任务。
2)分别计算每条线的碰撞时间,然后选择最小值
如果我们想知道一个完美的圆球是否以及何时击中一条线,我们可以轻松地解决一个点是否碰到一条线,考虑下面的图像:
当它的中心将进入该线周围的区域时,基本上圆将会击中一条线,其中该区域是距离线最远radius
所有点,其中radius
是圆的半径。
因此,我们可以继续前进,只需用中心的单个点替换圆,然后通过半径将线移向新创建的点。
3)当移动点击中移动线时计算
如果线由速度为va
和vb
的两个移动点a
和b
定义,并且该点在速度为vc
点c
,则我们可以使点a
静止(不移动)和位置(0,0)用ba
, vb-va
和ca
, vc-va
替换其他两个点的位置和速度。
现在让我们将b
和c
的新坐标和速度命名为: [bx, by]
, (vbx, vby)
和[cx, cy]
, (vcx, vcy)
。 我们现在可以通过求解这个公式来计算碰撞时间:
cx+t * vcx = s*bx + s*t*vbx cy+t * vcy = s*by + s*t*vby
但要小心:这会产生二次方程式,你必须忽略可能的负解,这可能意味着该点正在远离直线或者碰撞正在发生,所以要确保球尚未碰撞在你开始做任何事之前。
另外(我希望没有必要这么说)在你替换t
和s
,你将无法获得最终的碰撞点,你需要撤消你已经完成的所有地役权(例如添加a
)
如果你需要它用于非凸多边形,我有一个解决方法,所以写在评论中。