2017-03-10 12 views
1

NPC(Bu)から別のキャラクタ(Ho)を「保存」しようとするキャラクタ()の2Dゲームを持っています。2次元弾道軌道計算(半径付き)

およびBuは一定のスピード(サリーは固定)です。

私はthis tutorialを読んだ後、これをプログラムすることができましたBu

を停止するために、対象とすべきである私は、どの時点で計算する方法を見つけ出す必要がありました。私はこれが正常に動作しますが、ここで私が把握しようとしている問題である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 

pylabコードの一部を変換します。このinterception関数を別のパラメータAl_radiusに調整したいです。あなたは、(例えば、それが速いかもしれBu

を撮影することができ、私はの範囲に応じて、自分の目標位置が変更される可能性があることかなり確信しているBuAl_radius、の範囲内にあるときが銃を持っていると、参照します(BuHoの間の経路に直接向かうよりも)

答えて

0

この場合、の動きの2つのセクションがあります。実際の動きと「弾丸」の動きです。私は、弾丸が射撃し、瞬時に標的に当たると仮定していることに注意してください。我々は時間を最小限に抑えたいので、直線の経路が最良の解決策です。私。 の動き(AからDまで)と「弾丸」弾丸の弾道は一直線上にあります。

は、我々はまだチュートリアルから同じ三角形を使用することができます。唯一の違いは、ACが砲の範囲(円で示される)を説明するための新たな方程式を持つことです。

。余弦法則を用いて

乗算及び再配置:

場合は、解決策は次のとおりです。

それ以外の場合は二次方程式の解は次のようになります。あなたの例と同様に

と点Cすることができます以前と同じ方法で計算される: