LoginSignup
2
2

More than 5 years have passed since last update.

ベクトルOAとOBでなす、斜交座標系上に、新たな点Pが生成されたときの、点Pが第一象限にあるか判定する。

Last updated at Posted at 2015-05-15

なにがしたいか。

ランダムに生成された3点からできるエリアと、
適当に決めた点Pが重なるかどうかを調べたい。
ということを、javascript上で計算したい。

ようするにこんな事。

IMG_1271.JPG

上記写真をベースに書きます。
ランダムに生成された点というのは、点O 点A 点Bのこと。

適当に決める点が、点Pのこと。

点Oを起点にしたエリア(赤い斜線部分)に、点Pが存在するかどうかを調べる。

高校数学教師に聞いてみた。

ベクトルを使うと良いらしい。
ベクトルの基本がこれ。
IMG_1270.JPG

応用してこんな感じで計算すると良いらしい。
IMG_1269.JPG

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 が出力される。

考え方

ベクトルと座標の計算方法が分からなくて困ったけど、意外と簡単だった。

IMG_1272.JPG

tsが0以上ならエリア内に点Pがあることになる。
もし0以下の場合、OAやOBの矢印の向きが反対方向になるので、点Pはエリア外になる。

まとめ

高校生からしたら簡単な計算かもしれない。。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2