ページ 11

何が違うかわからない

Posted: 2012年10月11日(木) 21:16
by LisetteLander
線分と円の当たり判定が、リンク先のサイトのとおりにやってもうまくいきません。
どうしたらいいでしょうか?

http://d.hatena.ne.jp/Sampo/20070626/p1

コード:

	int cx=800,cy=450;//円
	double radius=50;

	int lx=1000,ly=450;//線は角度と長さでもって、もう片方の座標は計算してだす。
	double angle2=0;
	double range=100;

コード:

		double tmpax = cos(angle2)*range - lx;
		double tmpay = sin(angle2)*range - ly;
		double tmpbx = cx - lx;
		double tmpby = cy - ly;
	
		double tmpr = (tmpax*cos(angle2)*range + tmpay*sin(angle2)*range) / (tmpax*tmpax + tmpay*tmpay);
	
		double tmpx,tmpy;

		if( tmpr<= 0 ){
			tmpx=lx;
			tmpy=ly;
		}else if( tmpr>=1 ){
			tmpx=cos(angle2)*range;
			tmpy=sin(angle2)*range;
		}else{
			tmpx = lx + tmpr*lx;
			tmpy = ly + tmpr*ly;
		}

		if((tmpx-cx)*(tmpx-cx)+(tmpy-cy)*(tmpy-cy)<=(radius*radius)){
			DrawFormatString(50,50,52154,"あたり");
		}else{
			DrawFormatString(50,50,52515,"はずれ");
		}
		DrawCircle(cx,cy,radius,421412,0);
		DrawLine(lx,ly,lx+cos(angle2)*range,ly+sin(angle2)*range,421412,0);

Re: 何が違うかわからない

Posted: 2012年10月12日(金) 00:47
by Tatu
図を書いて考え直してはどうでしょう。

tmpbxとtmpbyは線の始点から円の中心へのベクトルのようですが
tmpaxとtmpayはどんなベクトルですか?
線の終点の座標はどう書けますか?

tmprを求めるときにtmpbxとtmpbyが使われていないようです。

tmpr<=0以外の2つの場合について
tmpxとtmpyは合っていますか?

Re: 何が違うかわからない

Posted: 2012年10月12日(金) 10:42
by LisetteLander
こんなかんじでしょうか・・・
未だにtmprの求め方の意味がわからないですけど

コード:

        double tmpax = cos(angle2)*range;//lx+cos(angle2)*range-lx;
        double tmpay = sin(angle2)*range;
        double tmpbx = cx - lx;
        double tmpby = cy - ly;
    
        double tmpr = (tmpax*tmpbx + tmpay*tmpby) / (tmpax*tmpax + tmpay*tmpay);
    
        double tmpx,tmpy;
 
        if( tmpr<= 0 ){
            tmpx=lx;
            tmpy=ly;
        }else if( tmpr>=1 ){
            tmpx=cos(angle2)*range;
            tmpy=sin(angle2)*range;
        }else{
            tmpx = lx + tmpr*tmpax;
            tmpy = ly + tmpr*tmpay;
        }
 
        if((tmpx-cx)*(tmpx-cx)+(tmpy-cy)*(tmpy-cy)<=(radius*radius)){
            DrawFormatString(50,50,52154,"あたり");
        }else{
            DrawFormatString(50,50,52515,"はずれ");
        }
        DrawCircle(cx,cy,radius,421412,0);
        DrawLine(lx,ly,lx+cos(angle2)*range,ly+sin(angle2)*range,421412,0);

Re: 何が違うかわからない

Posted: 2012年10月12日(金) 10:57
by LisetteLander
http://gyazo.com/42553033a707a1430da5caff35bb97ca
線分上の、円に最も近い所に点を打ってみたら反対側(計算して算出するほう)に点が表示されないことがわかりました。

コード:

}else if( r>=1 ){
tmpx=cos(angle2)*range;
tmpy=sin(angle2)*range;
これは絶対座標ではなくlx,lyを基準とした相対的な座標だということに気づいて直したらうまくいきました。
tatuさんありがとうございました。