计算移动球与移动线/多边形碰撞的时间(2D)

时间:2015-05-08 11:40:58

标签: java math polygon geometry

我有一个多边形,里面是一个移动的球。 如果球击中边界,球应该会反弹。

我目前的“解决方案”: 我将多边形分成线条并计算球何时击中移动线 enter image description here

所有变量:

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
  1. 计算所有点的碰撞位置:

    axc:=ax+vax*t   ayc:=ay+vay*t

    bxc:=bx+vbx*t   byc:=by+vby*t

    cyc:=cy+vcy*t   cxc:=cx+vcx*t

  2. 计算所有顶点的长度

    a:=√((axc-cxc)^(2)+(ayc-cyc)^(2))

    b:=√((bxc-cxc)^(2)+(byc-cyc)^(2))

    c:=√((axc-bxc)^(2)+(ayc-byc)^(2))

  3. 计算h

    h=((√(2*(a^(2)*b^(2)+b^(2)*a^(2)+c^(2)*a^(2))-(a^(4)+b^(4)+c^(4))))/(2*c))

  4. 解决t

    solve(h=((√(2*(a^(2)*b^(2)+b^(2)*a^(2)+c^(2)*a^(2))-(a^(4)+b^(4)+c^(4))))/(2*c)), t)

  5. BUUUUUT:我的计算器(Ti-Nspire CX CAS)崩溃了。微软数学需要花费太长时间(我现在正在计算......持续1小时,但仍然没有...)

    所以......帮助!

    (不要质疑我的绘画技巧)

1 个答案:

答案 0 :(得分:1)

如果你的多边形是凸的并且所有的速度都保持不变,你可以使用我刚才提出的这些系列技巧(所以可能有更好的方法):

1)通过简单地扩展它来用无限长的行替换每一行。

只有在多边形为凸面时才能执行此操作。请考虑以下图像: extension of lines

红线是原始多边形,绿色线是无限延伸。这个圆圈在遇到红线之前是否能够达到绿线?不。我们现在可以专注于击球无限长的线,这对于(至少对我而言)来说是更简单的任务。

2)分别计算每条线的碰撞时间,然后选择最小值

如果我们想知道一个完美的圆球是否以及何时击中一条线,我们可以很容易地解决一个点是否碰到一条线,考虑下面的图像: replace circle with point

当它的中心将进入该行周围的区域时,基本上圆圈将会出现一条线,其中该区域是距离该线最多radius的所有点,其中radius是圆的半径。

所以我们可以继续前进,只需用中心的一个点替换圆圈,然后用半径将线条移向新创建的点。

3)当移动点击中移动线

时计算

如果线条由两个移动点ab定义,速度为vavb,则点位于c点使用vc,我可以通过ab-a替换其他两个点的位置和速度,使点vb-va静止(不移动)和位置(0,0)和c-avc-va

现在让我们将bc的新坐标和速度命名为:[bx, by](vbx, vby)[cx, cy],{{ 1}}。我们现在可以通过求解这个公式来计算碰撞时间:

(vcx, vcy)

然而要小心:这会导致二次方程,你必须忽略可能的负解,这可能意味着该点正在远离线或者碰撞正在发生,因此,在开始做任何事情之前,确保球已经碰撞。

另外(我希望没有必要这么说)在你替换cx+t * vcx = s*bx + s*t*vbx cy+t * vcy = s*by + s*t*vby t后,你不会得到最后的碰撞点,你需要撤消你拥有的所有地役权完成(例如添加s

如果你需要它用于非凸多边形,我有一个解决方法,所以写在评论中。