敵を自機の方向を向くようにするには?

点 O(OX, OY) から点 P(X, Y) がどの角度にあるか?を求めるのには、どうするか?

アークタンジェントを求める関数 ATAN() を使って
rad = ATAN(Y - OY, X - OX)
というように角度 rad を求めることができるが、なんとなく遅いような気がする、ということでテーブル化を試みた。

ゲームで ATAN() を使用する場合、精度が求められることはないので、次のようにすることでテーブル化が可能。

DIM R(65,65)
’ 初期化
FOR Y=0 TO 64
FOR X=0 TO 64
’ 原点を(32,32)としてテーブル化
R(Y,X)=ATAN(Y-32,X-32)
NEXT
NEXT

INPUT X、Y
?”ATAN: ”;ATAN(Y,X)
GOSUB@ATAN2
?”ATAN2:”;R

END

@ATAN2
RR=1
X1=ABS(X):Y1=ABS(Y)
IF X1<Y1 THEN SWAP X1,Y1
IF X1>0 THEN RR=32/X1
X0=X*RR+32:Y0=Y*RR+32
R=R(Y0,X0)
RETURN

引数に2つの RND(256) で与え、10万回実行した場合の実行時間を計測
ATAN() の場合:484フレーム
ATAN2 の場合:1690フレーム

配列呼び出し:525フレーム
…遅い。

入力値が範囲内として、そのまま単純に2次元配列から呼び出した場合でも遅いので単純なテーブル化は意味が無いっと…orz


※ちなみに求めた角度はラジアンなので、これを360度表記の角度に変換したり、またある程度の丸目(16方向に制限をかけるとか)を行ったりする場合には事前に計算しておくことができるので役に立つかもしれない。