三角関数テーブル実装

頭が固くて、精度とかスケーリングとかそういう話を上手く理解できない。
まず訂正から。yaneSDKのatanは65536分割と書いたが、出力の角度を1周で0から65535としているだけで、それを65536に分割しているわけではなかった。
yaneSDKでの実装は下のようになっている。

for(i=0;i<256;i++){
	m_alAtanTable[i] = (WORD)(atan(i/(double)256)*(65536/2)/PI);
}

引数0から1までを256分割してそれぞれに対応するArctanの値をテーブルに持っている。この範囲は出力の角度でいうと0からπ/4にあたり、それ以外の部分は対称性を用いて同じテーブルから求められる。よって、このテーブルから得られる値は256*8=2048通りということになる。

Arctanのグラフは引数が0から1に近づくと傾きが緩くなっていくため、0付近よりも1付近の方がテーブルの値の間隔が密になる。なのでボスの真下や真横にいるよりも45度の位置にいるときの方が自機狙い弾の狙いが正確になる。まあ十分な精度をとっていれば両者に明らかな差は出ないのだが。
ちなみにテーブルサイズ256のとき、1付近での精度は20/65536くらい。sinとcosの入力精度は1/65536なのでだいぶ粗い感じ。

ということで実装。

某妹様の通常弾幕のような自機狙いができた。