Help us understand the problem. What is going on with this article?

線分ABと線分CDが交差しているか判定する。

More than 5 years have passed since last update.

判定に使用する情報

点A, 点B, 点C, 点D の座標(x,y)は全て数値で分かっていることにする。
それらの座標から交差しているかを判定するプログラムをjavascriptで書く。

考え方

前回の記事(ベクトル)を基礎として使用します。

IMG_1274.JPG

ベクトルCA + ベクトルCB の第一象限に点Dが存在し、
かつ、三角形CABの外側に点Dがある場合に、線分ABと線分CDが交差していると言える。

と、思う。

javascript で判定

デモ

// 判定に使う点A B C D
var A = [0, 0],
    B = [5, 0],
    C = [1, 0.1],
    D = [12, 1];

// 4つの頂点を与えると、そこから判定をし、trueかfalseを返してくれる関数。
function check(params){
    var OPx = params.d[0] - params.c[0],
        OPy = params.d[1] - params.c[1],
        OAx = params.a[0] - params.c[0],
        OAy = params.a[1] - params.c[1],
        OBx = params.b[0] - params.c[0],
        OBy = params.b[1] - params.c[1];            

    // 連立方程式を計算。
    s = ( (OPx * OBy) - (OBx * OPy) ) / ( (OAx * OBy) - (OBx * OAy) );
    t = ( (OPy * OAx) - (OPx * OAy) ) / ( (OAx * OBy) - (OAy * OBx) );

    // 交差していたら trueを返す。
    if( s>0 && t>0 && s+t>=1) return true;

    // 交差していなければ falseを返す。
    else return false;
}

// チェック開始
var test = check({
    a: A,
    b: B,
    c: C,
    d: D
});

console.log(test);  // true or false が出力される。

まとめ

自分で考えた方法なので、間違っているかもしれません。。
他にも方法があると思うので、メモ的な感じで投稿です。

akifo
フリーランスの JavaScript エンジニアです。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした