ページ 11

線分と円のあたり判定

Posted: 2012年10月02日(火) 14:17
by ヨシタケ
あるゲームプログラミングの本を参考(ほぼそのまま)にあたり判定の設定を行ったのですが線と円が重なってもあたったと判定されません。

あたり判定の関数

コード:

bool HitLineandCircle(BAR barin, BALL ballin){
	Vector2 avec, bvec,svec;
	
	avec = SubVector(ballin.pos, barin.startpos);                          //ベクトルの引き算 ballin.pos - barin.startpos
	bvec = SubVector(barin.endpos, barin.startpos);

	float dot = DotProduct(avec, bvec);				//内積を求める
	float bl = VectorLengthSquare(bvec);			//ベクトルbの長さの二乗を求める
	if( (dot > -ZEROVALUE) && (dot < bl) ){
		//円と線の距離を求める
		//ボールの中心から垂直におろした線の交点を求める
		Vector2 bnvec = Normalize(bvec);					//ベクトルsの正規化
		float dot2 = DotProduct(avec, bnvec);
		bnvec.x *= dot2;						
		bnvec.y *= dot2; 
		Point2D kouten = AddVector(barin.startpos, bnvec);                              //ベクトルの足し算
		Vector2 dist = SubVector(ballin.pos, kouten);
		float dl = VectorLengthSquare(dist);

		if ( dl < (ballin.hankei * ballin.hankei)  ){
			return TRUE;
		}
	}
	return FALSE;
}
構造体BARとBALL

コード:

typedef struct BAR{
	double x,y;                     //画像を表示する位置
	Point2D center,startpos,endpos;       //線分の中心と端
	int longth;	//バーの長さ
	int speed;
}BAR;

//ボール情報
typedef struct BALL{
	int x,y;       //画像を表示する位置
	double dx,dy;
	bool shot_flag;
	Point2D pos;    //円の中心
	int state;
	float hankei;    //半径
}BALL;

ちゃんとあたっているかわかりやすいようにあたっている場合タイトルに戻るようにしてあります。

コード:

void hitbar(){

	bar.startpos.x = bar.center.x - bar.longth; bar.startpos.y = bar.center.y;
	bar.endpos.x = bar.center.x + bar.longth; bar.endpos.y = bar.center.y;
	//バーとボールの接触判定
	if(HitLineandCircle(bar,ball) == TRUE){
		//if(bar.center.x < ball.x){
		//	
		//}

		//if(bar.center.x > ball.x){

		//}
		ball.dy*= -1;
		func_state = STATE_TITLE;
	}
}
正直、原因がさっぱりわかりません。どうか教えてください。お願いします。

Re: 線分と円のあたり判定

Posted: 2012年10月02日(火) 20:38
by softya(ソフト屋)
実際に動く形で貼り付けてもらえると答えやすいかと思います。

Re: 線分と円のあたり判定

Posted: 2012年10月02日(火) 23:34
by ヨシタケ
今作っているゲームのソースをアップすればいいのですか?

Re: 線分と円のあたり判定

Posted: 2012年10月02日(火) 23:52
by softya(ソフト屋)
ヨシタケ さんが書きました:今作っているゲームのソースをアップすればいいのですか?
出来れば問題点だけテストできる物が望ましいですが、作っている本体でも問題点の再現方法が容易ならそれでも構いません。

Re: 線分と円のあたり判定

Posted: 2012年10月03日(水) 21:29
by ヨシタケ
色々いじっていて返信遅れました

ttp://www1.axfc.net/uploader/Si/so/150376

にファイルをアップしました。パスワードはYT2013です。
ゲームの内容はブロック崩しで、スペースキーを押すと弾が発射するようになっています。
タイトルは邪魔になると思い消したので、線と円が触れると普通に反射するようにしています。
それぞれ当たり判定のHitLineandCircleはpyh.cppに判定されたあとの反射はchar.cppにあります。

Re: 線分と円のあたり判定

Posted: 2012年10月03日(水) 22:21
by softya(ソフト屋)
デバッガで確認するとすぐ分かるのですが、ballin.posに座標が入っていない状態でHitLineandCircleを呼び出しています。
2重に座標を管理するのは良くないですよ。出来ればひとつの変数にまとめましょう。

あと円と線分の当たり判定ですが、こちらも参考にしてみてください。
http://www.dango-itimi.com/blog/archive ... 00858.html

Re: 線分と円のあたり判定

Posted: 2012年10月04日(木) 20:19
by ヨシタケ
アドバイスありがとうございます。
アドバイスを元に色々試していたのですが、それでもうまくいかず、からり参っていて、ふと内積の関数を見たら

コード:

 //内積を求める関数
double DotProduct(Vector2 p,Vector2 q){
	return p.x * q.y - p.y * q.x;
}
となっていました。お手数おかけしました。