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