GameCorder.net

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

10.線と四角形との当たり判定

ある線と四角形が当たらない時は、四角形の4つの頂点が
線に対して同一方向にある場合です。

線に対して逆方向といえば、内積の性質を使うことで求めることができました。
なので、今回は内積の性質を使って線と四角形のあたり判定を求めて見たいと思います


/**
	chapter10
	四角形と線の当たり判定
	line:Line
	rectangle:Rectangle
*/
function lineRectangleCollision(line,rectangle){
	// 当たり判定対象の線に直角のベクトル
	var n = rotateVector90(line.direction);
	
	// 四角形の四隅の点を求める
	var c1 = new Vector2D(rectangle.origin.x,rectangle.origin.y);
	var c2 = getAddVector(c1,rectangle.size);
	var c3 = new Vector2D(c2.x,c1.y);
	var c4 = new Vector2D(c1.x,c2.y);
	
	// 四隅の点から線のベースとなる点の距離を求める
	c1 = subtractVector(c1,line.base);
	c2 = subtractVector(c2,line.base);
	c3 = subtractVector(c3,line.base);
	c4 = subtractVector(c4,line.base);
	
	// 内積により線の方向を求める
	var dp1 = dotProduct2D(n,c1);
	var dp2 = dotProduct2D(n,c2);
	var dp3 = dotProduct2D(n,c3);
	var dp4 = dotProduct2D(n,c4);
	
	// 全部同じ方向にあれば、線と四角形が当たっていることはない
	return (dp1 * dp2 <= 0) || (dp2 * dp3 <= 0) || (dp3 * dp4 <= 0);  	
}

		

線と四角形の各点からの内積を求めて、4点が同一方向を向いていなければ
当たり判定が行われることを利用しています。

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

最後に線と四角形の当たり判定のサンプルです。
ドラッグすることで、線を動かすことができます。