Panda Noir

JavaScript の限界を究めるブログでした。最近はいろんな分野を幅広めに書いてます。

線分の上に点が載っているか判定する

まあひねりの何もないコードですが、なぜか間違えたまま半年放置してしまっていたという笑えない事態になっていました…

コード

A、B、PをPointクラスのインスタンスとします。

class Point{
    constructor(x, y) {
        this.x = x;
        this.y = y;
    }
}
const A = new Point(1, 1);
const B = new Point(5, 5);
const P = new Point(3, 3);

if (Math.max(A.x, B.x) >= P.x && P.x >= Math.min(A.x, B.x)) {
    // AとBの間にPのx座標がある
    if (Math.max(A.y, B.y) >= P.y && P.y >= Math.min(A.y, B.y)) {
        // AとBの間にPのy座標ある
        if ((A.y - B.y) * (P.x - A.x) == (P.y - A.y) * (A.x - B.x)) {
            // AとBを通る直線上にある
        }
    }
}

// 1行で書くなら
(Math.max(A.x, B.x) >= P.x && P.x >= Math.min(A.x, B.x)) &&
    (Math.max(A.y, B.y) >= P.y && P.y >= Math.min(A.y, B.y)) &&
    ((A.y - B.y) * (P.x - A.x) == (P.y - A.y) * (A.x - B.x));