3.線と線のあたり判定

線と線の当たり判定をやります
線と線がぶつからない条件は線同士が平行であり、同値出ない場合です。
これを判定条件として処理を書きます

いくつか必要な関数を定義しましょう
(非常にわかりにくいですが、jsで書いています)


// vectorクラス
var Vector2D = class Vector2D {
	constructor(x,y){
	this.x = x;
	this.y = y;
	}
}

// 90°回転させる
function rotateVector90(v){
	var r = new Vector2D();
	r.x = -v.y;
	r.y = v.x;
	return r;
}
		

名前の通りベクトルを回転させる関数
なぜそうなるか、図を書くとわかりやすいです


// 平行ベクトルかどうか
function isParallelVector(vectorA,vectorB){
	var na = rotateVector90(vectorA);
	return equalFloats(0,dotProduct2D(na,vectorB));
}

// 誤差を加味
function equalFloats(a,b){
	var threshold = 1 / 8192;
	return Math.abs(a - b) < threshold;
}
		

isParallelVector関数では
ベクトルの内積が0ならば二つのベクトルのなす角が直角であることを利用します。


function isEqualVectors(a,b){
	return equalFloats(a.x - b.x,0) && equalFloats(a.y - b.y,0);
}
		

同じベクトルであるという判定をします。


// 線分クラス
function Line(){
	// vector2D
	this.base;
	// vector2D
	this.direction
	this.color;
}

/*
	a: Line
	b: Line
*/
function isEquivalentLines(a,b){
	// ベクトルが同じか
	if(!isParallelVector(a.direction,b.direction)){
		return false;
	}

	// 基準点が異なる
	d = subtractVector(a.base,b.base);
	return isParallelVector(d,a.direction);
}
		

isEquivalentLinesでは
平行かつ、同じ位置にいないことを判定しています
これで、線と線の判定ができました。
以下がjsで書いたサンプルになります。
左クリックドラッグで線分を動かすことができます。

当たり判定のサンプル

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