アークタンジェントテーブル
Posted: 2011年3月17日(木) 21:51
現在アークタンジェントをテーブル化し、
標的の座標から自分の座標をひいた値を渡して0~360の範囲で
値を返す関数AngleをSTGで敵弾の角度指定などに使っているのですが
たまに予期しないあてずっぽうな角度を返してしまい原因が分からなくて困っています。
自力で解決しようとしていたのですがどうにも分からないのでこの掲示板に書きこまさせていただきました、
原因がお分かりの方居られましたらご教授お願いいたします。
下はソースコードの一部(怪しいと思われるところ)です。
※math.hをインクルードしたヘッダファイルを読み込んでいます
標的の座標から自分の座標をひいた値を渡して0~360の範囲で
値を返す関数AngleをSTGで敵弾の角度指定などに使っているのですが
たまに予期しないあてずっぽうな角度を返してしまい原因が分からなくて困っています。
自力で解決しようとしていたのですがどうにも分からないのでこの掲示板に書きこまさせていただきました、
原因がお分かりの方居られましたらご教授お願いいたします。
下はソースコードの一部(怪しいと思われるところ)です。
※math.hをインクルードしたヘッダファイルを読み込んでいます
float atan_table[256];
//atan_tableを初期化
void atan_ini()
{
float x, y;
int i;
x = 1;
y = 0;
for ( i = 0; i < 128; ++ i )
{
y = (float)( 1.0f * i ) / 128;
atan_table[i] = (float)( atan2( y, x ) * 180 / PI );
}
x = 1;
y = 1;
for ( i = 128; i < 256; ++ i )
{
x = (float)( 1.0f * ( 256 - i )) / 128;
atan_table[i] = (float)( atan2( y, x ) * 180 / PI );
}
}
float Angle( float x, float y )
{
//x,yの両方が0の場合0を返す
if ( x == 0 && y == 0 )
return 0;
//0~45~90
if ( x > 0 && y >= 0 )
{
if ( x > y )
return atan_table[(int)(( y * 128 ) / x )];
else
return atan_table[256 - (int)(( x * 128 ) / y )];
}
else
//90~135~180
if ( x <= 0 && y > 0 )
{
x *= -1;
if ( y > x )
return atan_table[(int)(( x * 128 ) / y )] + 90;
else
return atan_table[256 - (int)(( y * 128 ) / x )] + 90;
}
else
//180~225~270
if ( x < 0 && y <= 0 )
{
x *= -1;
y *= -1;
if ( x > y )
return atan_table[(int)(( y * 128 ) / x )] + 180;
else
return atan_table[256 - (int)(( x * 128 ) / y )] + 180;
}
else
//270~315~360
//if ( x >= 0 && y < 0 )
{
y *= -1;
if ( y > x )
return atan_table[(int)(( x * 128 ) / y )] + 270;
else
return atan_table[256 - (int)(( y * 128 ) / x )] + 270;
}
return -1;
}