なにがしたいか。
ランダムに生成された3点からできるエリアと、
適当に決めた点Pが重なるかどうかを調べたい。
ということを、javascript上で計算したい。
ようするにこんな事。
上記写真をベースに書きます。
ランダムに生成された点というのは、点O 点A 点B
のこと。
適当に決める点が、点P
のこと。
点Oを起点にしたエリア(赤い斜線部分)に、点Pが存在するかどうかを調べる。
高校数学教師に聞いてみた。
javascriptで書いてみた。
script.js
// ランダムに生成する点を3つ生成。 点O 点A 点B
var o = {
x: 1,
y: 1
},
a = {
x: 1,
y: 2
},
b = {
x: 3,
y: 1
};
// 判定に使う点P。
var p = {
x: 100,
y: 100
}
// 4つの頂点を与えると、そこから判定をし、trueかfalseを返してくれる関数。
function obliqueCoordinateCheck(params){
var OPx = params.p.x - params.o.x,
OPy = params.p.y - params.o.y,
OAx = params.a.x - params.o.x,
OAy = params.a.y - params.o.y,
OBx = params.b.x - params.o.x,
OBy = params.b.y - params.o.y;
// 連立方程式を計算。
s = ( (OPx * OBy) - (OBx * OPy) ) / ( (OAx * OBy) - (OBx * OAy) );
t = ( (OPy * OAx) - (OPx * OAy) ) / ( (OAx * OBy) - (OAy * OBx) );
// 点Pがエリア内なら trueを返す。
if( s>0 && t>0 ) return true;
// 点Pがエリア外なら falseを返す。
else return false;
}
// チェック開始
var test = obliqueCoordinateCheck({
o: o,
a: a,
b: b,
p: p
});
console.log(test); // true or false が出力される。
考え方
ベクトルと座標の計算方法が分からなくて困ったけど、意外と簡単だった。
t
とs
が0以上ならエリア内に点Pがあることになる。
もし0以下の場合、OAやOBの矢印の向きが反対方向になるので、点Pはエリア外になる。
まとめ
高校生からしたら簡単な計算かもしれない。。