Panda Noir

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

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

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

コード

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

class Point{
    constructor(x, y) {
        this.x = x;
        this.y = y;
    }
}

Aのx座標 <= Bのx座標とします(AとBを入れ替えることで常にこうできる)。

if (A.x <= P.x && P.x <= B.x) {
    // Aの右、Bの左にPがある
    if (A.y <= B.y && (A.y <= P.y && P.y <= B.y) || A.y >= B.y && (A.y >= P.y && P.y >= B.y)) {
        // y座標的にAとBの間にある
        const a = B.y - A.y,
            b = A.x - B.x,
            c = A.x * (A.y - B.y) - A.y * (A.x - B.x);
        if (a * P.x + b * P.y + c === 0) {
            // AとBを通る直線上にある
            return true;
        }
    }
}