自機から角度範囲に居る敵を取得する

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
YYSS
記事: 125
登録日時: 9年前
連絡を取る:

自機から角度範囲に居る敵を取得する

#1

投稿記事 by YYSS » 8年前

STGを作っておる者です。

自機から基準角度を出し、そこから±15の範囲に居る敵を取得したいのですが、思うようにいきません・・・

例として、
基準角度が0度の場合、自機から-15度~15度の範囲に居る敵を取得する

大体は出来たのですが、Degで-179度~180度の範囲でやっているため(atan2を使用している関係で)
基準角が170度などの時に、範囲が155~185度になってしまい、181度以上に居る敵を取得することが出来ません;;


コードはこんな感じです

コード:

		for( int i=0 ; i < MAX_ENEMY ; i++ ){

			//存在する
			if( EnemyBase.GetFlag(i) == true ){

				double TarAng	= atan2( EnemyBase.GetY( i ) - GetY(), EnemyBase.GetX( i ) - GetX() ) * (180 / PI) ;

				//フリーアングルの範囲内なら
				if( FreeAngle -15 <= TarAng && TarAng <= FreeAngle +15 ){

					//距離を取得する
					double xx		= X - EnemyBase.GetX(i);
					double yy		= Y - EnemyBase.GetY(i);
					double Span		= xx*xx + yy*yy;

					if( Min > Span ){
						Min		= Span;
						Set		= i;
					}
				}

			}
		}

角度内で、一番近い敵を取得するようにしてます。

アバター
GRAM
記事: 164
登録日時: 9年前
住所: 大阪

Re: 自機から角度範囲に居る敵を取得する

#2

投稿記事 by GRAM » 8年前

atan2にこだわる必要がないでしょう。
要は±15°の範囲にいればいいのですね。

でしたら先にtan15°を求めておいて、
自機中心の座標空間における(つまり自機が原点であらわされ、機首方向がy軸正となる座標空間における)
敵の位置がy > ±tan15° x かつ y > 0の範囲にいるかどうかを判定すればよろしいかと。

実際にはy > |tan15° x| かつ y > 0ですね。
自機の方向によっては座標変換が必要となりますが、通常これもさしたるコストがかからないため、
おそらくこちらのほうが高速であるとも思います。

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 9年前
住所: 北海道札幌市
連絡を取る:

Re: 自機から角度範囲に居る敵を取得する

#3

投稿記事 by Dixq (管理人) » 8年前

GRAMさんが仰る方法がシンプルで良いと思いますが、一応参考程度に。
計算が面倒になる場合、よく座標軸を回転させて計算することがあります。

http://ufcpp.net/study/linear/eigen.html
||
http://ufcpp.net/study/linear/eigen03.png
x' = rcosθ - rsinθ
y' = rsinθ + rcosθ
で計算出来ます。

アバター
a5ua
記事: 199
登録日時: 9年前

Re: 自機から角度範囲に居る敵を取得する

#4

投稿記事 by a5ua » 8年前

基準角度方向のベクトルをa、
自機位置から敵位置へのベクトルをbとし、
aとbがなす角度をθとすると、

cosθ ≧ cos15°

が成り立つとき、範囲内にいると判定できる。
cosθは、ベクトルの内積の式から計算できる。

a・b = |a||b|cosθ(aとbの内積)


参考までに、コード例を示します。

コード:

// (px, py)から、角度base±viewの範囲に、(ex, ey)が入っているか
bool InRange(double px, double py, double ex, double ey, double base, double view)
{
	double ax = cos(base), ay = sin(base);	// 基準線のベクトルa
	double bx = ex - px, by = ey - py;		// 自機→敵機のベクトルb

	double a = sqrt(ax * ax + ay * ay);		// |a|
	double b = sqrt(bx * bx + by * by);		// |b|

	return (ax * bx + ay * by) / (a * b) >= cos(view);
}

アバター
YYSS
記事: 125
登録日時: 9年前
連絡を取る:

Re: 自機から角度範囲に居る敵を取得する

#5

投稿記事 by YYSS » 8年前

返答ありがとうございます

色々な案をいただけて嬉しいのですが・・・
数学が苦手になった私には少々理解しきれない;;

なので、無理やり補正して解決しました。

コード:

				double TarAng	= atan2( EnemyBase.GetY( i ) - GetY(), EnemyBase.GetX( i ) - GetX() ) * (180 / PI) ;

				//-180と180補正
				if( FreeAngle > 165 && TarAng < 0 ){
					TarAng	+= 360;
				}
				else if( FreeAngle < -165 && TarAng > 0 ){
					TarAng	+= 360;
				}


				//範囲内なら
				if( FreeAngle -15 <= TarAng && TarAng <= FreeAngle +15 && EnemyBase.GetLife( i ) != 99999 ){

					//距離を取得する
					double xx		= X - EnemyBase.GetX(i);
					double yy		= Y - EnemyBase.GetY(i);
					double Span		= xx*xx + yy*yy;

					if( Min > Span ){
						Min		= Span;
						Set		= i;
					}
				}
プログラムをやる上では、数学も必須になってくるのかなぁ・・・

閉鎖

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