【问题标题】:Calculate time when a moving ball collides with a moving line/polygon (2D)计算移动球与移动线/多边形(2D)碰撞的时间
【发布时间】:2015-07-19 07:38:39
【问题描述】:

我有一个多边形,里面是一个移动的球。 如果球碰到边界,它应该会反弹回来。

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

所有变量:

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)

BUUUUUT:我的计算器 (Ti-Nspire CX CAS) 崩溃。而且 Microsoft 数学花费的时间太长(我现在正在计算...... 1 小时,但仍然没有......)

所以...帮助!

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

【问题讨论】:

  • 一些提示:球本身可能沿直线移动;当球的中心与线之间的距离小于或等于球的半径时,球接触另一条线。
  • 顺便说一句,我假设你的多边形是凸的?
  • (或者最初只是多边形旋转,而不是球移动?)
  • 你需要简化。一种简化是:计算好像 C 是静止的,并且 A 和 B 相对于 C 移动。这使得 Cxc 和 Cyc 独立于 t。此外,以 C 为原点会稍微简化方程。请注意,这不会改变解决方案。我看到球实际上是一个点。您可以计算 AB 和 AC 何时成为并行(点积)而不是计算 h,我认为这应该更容易(尤其是因为不应该有四阶项)
  • @HannoBinder 不,多边形不是凸的

标签: java math polygon geometry


【解决方案1】:

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

1) 将每一行替换为无限长的行,只需扩展即可。

只有当多边形是凸面时才能这样做。考虑下图:

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

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

如果我们想知道一个完美的圆形球是否以及何时击中一条线,我们可以很容易地解决一个点是否击中一条线,请考虑下图:

基本上,当圆的中心进入该线周围的区域时,圆会撞到一条线,该区域是距该线至多radius的所有点,其中radius是圆的半径。

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

3) 移动点碰到移动线时计算

如果这条线由两个运动点ab定义,速度为vavb,并且该点位于c,速度为vc,我们可以做点a 静止(不移动)和位置 (0,0),通过将其他两点位置和速度替换为 b-avb-vac-avc-va

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

cx+t * vcx = s*bx + s*t*vbx
cy+t * vcy = s*by + s*t*vby

但是要小心:这会导致二次方程,并且您必须忽略可能的负解,这可能意味着该点正在远离直线或正在发生碰撞,所以在你开始做任何事情之前确保球没有碰撞。

另外(我希望这个不用说)在你替换ts后,你不会得到最终的碰撞点,你需要撤消你所做的所有地役权(加@例如987654345@)

如果你需要它来处理非凸多边形,我有一个解决方法,所以写在 cmets 中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-24
    相关资源
    最近更新 更多