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で書いたサンプルになります。
左クリックドラッグで線分を動かすことができます。
当たり判定のサンプル