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

Java 计算移动球与移动线/多边形碰撞的时间(2D),java,math,polygon,geometry,Java,Math,Polygon,Geometry,我有一个多边形,里面是一个移动的球。 如果球碰到边界,它应该反弹回来 我当前的“解决方案”: 我把多边形分成几条线,然后计算球什么时候碰到移动的线 所有变量: 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

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

我当前的“解决方案”: 我把多边形分成几条线,然后计算球什么时候碰到移动的线

所有变量:

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=((√(二)(二)(二)(二)(二)(二)(二)(二)(二)(二)二)((二)),四

  • 求t

    solve(h=((√(二)(二)(二)(二)(二)(二)(二)(二)(二)(二)(二))二)())

  • BUUUUUT:我的计算器(Ti Nspire CX CAS)崩溃。而且微软数学花的时间太长了(我现在正在计算……一个小时,仍然一无所获……)

    所以。。。救命啊


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

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

    1) 通过简单地扩展,将每条线替换为无限长的线。 仅当多边形为凸多边形时,才能执行此操作。考虑下面的图像:

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

    2) 分别计算每条线的碰撞时间,然后选择最小值 如果我们想知道一个完美的圆球是否击中一条线,我们可以很容易地解出一个点是否碰到一条线,而是考虑下面的图像:

    基本上,当圆的中心进入该线周围的区域时,圆将撞击该线,其中该区域是距离该线最多
    半径
    的所有点,其中
    半径
    是圆的半径

    所以我们可以继续,在圆心处用一个点替换圆,然后将直线向新创建的点移动半径

    3) 当移动点碰到移动线时计算 如果直线由两个移动点
    a
    b
    定义,且速度
    va
    vb
    ,且点位于点
    c
    和速度
    vc
    ,则我们可以使点
    a
    静止(不移动)并处于位置(0,0)用
    b-a
    vb-va
    c-a
    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


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

    一些提示:球可能沿着直线移动;当球的中心和线之间的距离小于或等于球的半径时,球会接触到另一条线。顺便说一句,我假设你的多边形是凸的?(或者它最初只是多边形旋转,而不是球移动?)。一种简化方法是:计算时假设C是静止的,A和B相对于C移动。这使得Cxc和Cyc独立于t。同样,以C为原点将使方程简化一点。请注意,这不会改变解决方案。我看到球实际上是一个点。代替计算h,你可以计算AB和AC平行时(点积),我认为这应该更容易(特别是因为不应该有四阶项)@HannoBinder不,多边形不是凸的