2017-03-10 208 views
1

我有一个角色()试图从NPC(Bu)“保存”另一个字符(Ho)的2D游戏。二维弹丸弹道计算与半径

Bu具有恒定的速度(sally是静止的)。

我需要弄清楚如何在以阻止Bu

我能读this tutorial后设定该目标应哪一点计算。我转换一些pylab代码来numpy

def interception(Al, Bu, Ho, Sa, Sb): 
    """ Returns ``(t_C, C)`` if A can catch B, before B 
    reaches H. Otherwise, returns ``None``. """ 
    A = np.array((Al["x"],Al["y"])) 
    B = np.array((Bu["x"],Bu["y"])) 
    H = np.array((Ho["x"],Ho["y"])) 
    AB, AH, BH = np.linalg.norm(A-B), np.linalg.norm(A-H), np.linalg.norm(B-H) 
    #if Ho["id"] =="1": 
    # print("AB=%s BH=%s"%(AB,BH), file=sys.stderr) 
    if AB*BH == 0: 
     return None, None 
    sin_b = np.linalg.det(np.array((A-B,H-B)))/(AB*BH) 
    sin_a = (Sb/Sa) * sin_b 
    if abs(sin_a) > 1 : 
     print("B moves too fast to be ever caught !", file=sys.stderr) 
     return None, None 
    else: 
     sin_c = (sin_a * math.sqrt(1 - sin_b**2) 
        + sin_b * math.sqrt(1 - sin_a**2)) 
     BC = AB * (sin_a/sin_c) 
     #if Ho["id"] ==1: 
      #print(BC-BH, file=sys.stderr) 
     if BC > BH: 
      # print("B reaches H before interception by A !", BC,BH, file=sys.stderr) 
      return None, None 
     else: 
      #print("A intercepted B !") 
      t_C = BC/Sb 
      C = B + BC * (H-B)/ BH 
      return t_C, C 

这工作得很好,但这里的问题,我想弄清楚。我想调整此interception函数以具有另一个参数Al_radius。你看,有枪而当Bu是在Al_radius范围,可以拍摄Bu

我敢肯定,这取决于的范围内,他的目标位置可能会改变(例如,它可能会更快而不是直接走向BuHo之间的路径)。

回答

0

在这种情况下,的移动有两个不同部分:“子弹”的实际移动和移动。请注意,我假设子弹发射并立即击中目标。由于我们希望尽可能缩短所用时间,因此直线路径是最佳解决方案。即的移动(从AD),并且“子弹”子弹的轨迹处于一条直线上。

我们仍然可以使用相同的三角形从教程。唯一的区别是,我们现在有一个新的AC公式来表示枪的范围(表示为圆圈)。

使用余弦定律:

乘法和重新排列:

如果,该解决方案是:

否则,解决二次方程式是:

与您的例子:

C点能按照与之前相同的方式计算: