アークタンジェントテーブル

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
wiruka

アークタンジェントテーブル

#1

投稿記事 by wiruka » 14年前

現在アークタンジェントをテーブル化し、
標的の座標から自分の座標をひいた値を渡して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;
}

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: アークタンジェントテーブル

#2

投稿記事 by h2so5 » 14年前

例えば38行目のこの式ですが
atan_table[256 - (int)(( x * 128 ) / y )];

x = 1, y = 100000
の時、配列の範囲外にアクセスしてしまいますよ。

wiruka

Re: アークタンジェントテーブル

#3

投稿記事 by wiruka » 14年前

h2so5さんご指摘ありがとうございます。
配列の範囲外をオーバーしないように直したところ
あてずっぽうの方向に弾が発射されることがなくなり、
問題が無事解決いたしました。
というかこの手の怪しい動作は配列を使っているなら
まずそれを疑うべきでしたね、一応実行は出来ているので
失念していました、なんでこんな初歩的なことに気がつけなかったんだろう・・・・
ともあれありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る