Panda Noir

JavaScript の限界を究めるブログです。

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

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

コード

A、B、Pは

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

というクラスのインスタンスとし、Aのx座標はBのx座標以下とします。

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;
        }
    }
}