ページ 11

矩形(角度付き)と円の当たり判定が少しだけずれる

Posted: 2014年4月20日(日) 00:34
by Monaka
こんばんは。今、矩形と円の当たり判定を、矩形の角度の分 円の位置をずらして0度のときの矩形とずらした円'で判定を行う、という手法をやっています。
それで色々なサイトを巡り、なんとかそれっぽいものはできたのですが、円が矩形の斜め上にあるときに矩形を斜めにすると
実際の矩形と円は当たっていないのに計算上の0度矩形と円'が当たってる、またはその逆のことが起こっていました。
コードを見直してみたのですが、分からず、sinの丸め誤差かと思ったのですがどうなのでしょうか。

コード:

#include "DxLib.h"
#include "math.h"
#define PI	3.1415926535897932384626433832795f

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
	ChangeWindowMode(TRUE),  SetGraphMode(800, 600, 32),
		DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK);

	static int image = LoadGraph("無題.png");
	static double Ax, Ay, Bx, By,Br;   	//実際の座標
	static double Aangle;			//実際の角度
	static double A_x, A_y, B_x, B_y;   	//当たり判定で使用する座標
	static double F_x, F_y;			//当たり判定で使用される円に最も近い矩形上の座標
	static int Flag = 0;

	Ax = 100; Ay = 300; Bx = 400; By = 250; Br = 20; Aangle = 0;
	while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0)
	{
		B_x = ((Bx - Ax) * cos(Aangle)) - ((By - Ay) * sin(Aangle)) + Ax;		//circle calc
		B_y = ((Bx - Ax) * sin(Aangle)) + ((By - Ay) * cos(Aangle)) + Ay;

		if (B_x < Ax - 32 / 2)			//x calc
			F_x = Ax - 32 / 2;
		else if (B_x > Ax + 32 / 2)
			F_x = Ax + 32 / 2;
		else
			F_x = B_x;

		if (B_y < Ay - 64 / 2)			//y calc
			F_y = Ay - 64 / 2;
		else if (B_y > Ay + 64 / 2)
			F_y = Ay + 64 / 2;
		else
			F_y = B_y;

		if ( ((F_x - B_x) * (F_x - B_x)) + ((F_y - B_y) * (F_y - B_y)) < Br * Br)	//collision calc
			Flag = 1;
		else
			Flag = 0;

		DrawBox((int)Ax - 32 / 2, (int)Ay - 64 / 2, (int)Ax + 32 / 2, (int)Ay + 64 / 2, GetColor(50, 255, 255), TRUE);	//draw
		DrawCircle((int)B_x, (int)B_y, (int)Br, GetColor(50, 255, 255), TRUE);

		DrawCircle((int)F_x, (int)F_y, 3, GetColor(255, 255, 255), TRUE);

		DrawRotaGraph((int)Ax, (int)Ay, 1.0, Aangle, image, TRUE);
		DrawCircle((int)Ax, (int)Ay, 3, GetColor(255, 255, 255), TRUE);

		DrawCircle((int)Bx, (int)By, (int)Br, GetColor(255, 50, 50), TRUE);


		DrawFormatString(10, 30, GetColor(50, 255, 50), "Flag = %d", Flag);

	}


	DxLib_End();
	return 0;
}
実際に表示する矩形には縦x横が64x32の長方形を用いています。
また、矩形の座標を任意に移動させるようにするコードを省いています。
これを実行し、矩形の位置、角度を試行錯誤してみるとこうなりました。
画像
青と赤が実際に表示されている矩形と円、薄い水色が当たり判定の計算上用いられてる矩形と円です。
実際の図形は接触していませんが計算上の図形は接触していて当たり判定のフラグが1になってしまっています。
こうなる場所は限られていたのでそこまで問題ありませんが直せるなら直したいです。どうかよろしくお願いします。

Re: 矩形(角度付き)と円の当たり判定が少しだけずれる

Posted: 2014年4月20日(日) 14:27
by Monaka
一晩置いてすっきりした頭でまた試行錯誤したら解決しました!

コード:

        B_x = ((Bx - Ax) * cos(Aangle)) - ((By - Ay) * sin(Aangle)) + Ax;       //circle calc
        B_y = ((Bx - Ax) * sin(Aangle)) + ((By - Ay) * cos(Aangle)) + Ay;
 
ここの部分の角度を全部逆にして今のところ問題なさそうでした!

コード:

        B_x = ((Bx - Ax) * cos(-Aangle)) - ((By - Ay) * sin(-Aangle)) + Ax;       //circle calc
        B_y = ((Bx - Ax) * sin(-Aangle)) + ((By - Ay) * cos(-Aangle)) + Ay;
 
お騒がせしてすみません。