線分と円のあたり判定

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

線分と円のあたり判定

#1

投稿記事 by ヨシタケ » 13年前

あるゲームプログラミングの本を参考(ほぼそのまま)にあたり判定の設定を行ったのですが線と円が重なってもあたったと判定されません。

あたり判定の関数

コード:

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;
	}
}
正直、原因がさっぱりわかりません。どうか教えてください。お願いします。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#2

投稿記事 by softya(ソフト屋) » 13年前

実際に動く形で貼り付けてもらえると答えやすいかと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ヨシタケ

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

#3

投稿記事 by ヨシタケ » 13年前

今作っているゲームのソースをアップすればいいのですか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#4

投稿記事 by softya(ソフト屋) » 13年前

ヨシタケ さんが書きました:今作っているゲームのソースをアップすればいいのですか?
出来れば問題点だけテストできる物が望ましいですが、作っている本体でも問題点の再現方法が容易ならそれでも構いません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ヨシタケ

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

#5

投稿記事 by ヨシタケ » 13年前

色々いじっていて返信遅れました

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

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#6

投稿記事 by softya(ソフト屋) » 13年前

デバッガで確認するとすぐ分かるのですが、ballin.posに座標が入っていない状態でHitLineandCircleを呼び出しています。
2重に座標を管理するのは良くないですよ。出来ればひとつの変数にまとめましょう。

あと円と線分の当たり判定ですが、こちらも参考にしてみてください。
http://www.dango-itimi.com/blog/archive ... 00858.html
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ヨシタケ

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

#7

投稿記事 by ヨシタケ » 13年前

アドバイスありがとうございます。
アドバイスを元に色々試していたのですが、それでもうまくいかず、からり参っていて、ふと内積の関数を見たら

コード:

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

閉鎖

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