GameCorder.net

このエントリーをはてなブックマークに追加

9.円と回転四角形との当たり判定

8.円と四角形の当たり判定で、単純な四角形と円との当たり判定を行いましたが
今回は、回転する四角形との当たり判定をチェックします。
解法としては、回転した四角形を座標の原点に移動させ、回転させることで、通常の四角形と円との当たり判定と
同じシチュエーションにもっていき、当たり判定を行わせます。
それでは、図を見てください

図の右上の、回転四角形と円の当たり判定を行いたいとします。
回転された四角形を角度が0の状態に戻せば
処理の軽い、円と四角形の当たり判定を用いることができるので、
回転四角形の角度がゼロの状態の四角形を作り出すことにします。

角度がゼロの四角形を作るために、左下の円と四角あたり判定のように
四角形の一点を原点に持ち、縦と横幅が同じ四角形
つまりは、回転四角形の角度がゼロである四角形を作り出します。

以前回転四角形を定義した際に、四角形の中心から一辺の頂点へのベクトルである
halfExtendを定義したので、その変数を利用し、四角形のサイズを求めます。

それでは、回転四角形と円との当たり判定のコードを見ていきましょう


/**
 * chapter9
 * 円と回転四角形との当たり判定
 * 
 * circle:cCircle
 * orientedRectangle: OrientedRectangle 
 */
function circleOrientedRectangleCollision(circle,orientedRectangle){
	// 原点を頂点にもつ、回転四角形の角度を0にした四角形を作り出す
	var rectangle = new Rectangle2D();
	rectangle.origin = new Vector2D(0,0);
	rectangle.size = multiplyVector(orientedRectangle.halfExtend,2);
	
	// 作り出した四角形の位置に対応した円を生成
	var circle2 = new cCircle();
	circle2.Init(0,0,circle.Radius,"rgb(0,0,0)");
	// 回転四角形の原点と円との距離
	var distance = subtractVector(circle.Center,orientedRectangle.center);
	// 四角形と作り出した円との距離を求める
	distance = getRotateVector(distance,-orientedRectangle.rotation);
	// 中心に求めた中心点へのベクトルを代入する
	circle2.Center = getAddVector(distance,orientedRectangle.halfExtend);
	// 円と四角形と当たり判定に互換する
	return circleRectangleCollision(circle2,rectangle);
}
		

説明の通り、0度の四角形とそれに対応する円を生成して
当たり判定を行なっています。

円と回転四角形の当たり判定のサンプル

最後に円と回転四角形の当たり判定のサンプルです。
ドラッグすることで、円が動かせるようになっています。