点 P(x,y) が線分 (x1, y1)-(x2, y2) 上にあるかどうかを判定する関数。

ここでいう線分とは、両端点をもつ有限長さの直線のこと。線分が実質点であっても、垂直でも水平でも、すべて正しく判定される。また、整数座標ならば、計算誤差は出ない。

/*
  引数: 点の座標 x, y
      線分の座標 (x1,y1) - (x2, y2)
  関数値: 点が線分上にある場合は1、線分上にない場合は 0
*/
int isPointOnSegment(int x, int y, int x1, int y1, int x2, int y2)
{
    int d;
    if (x1 > x2) {
        d = x1, x1 = x2, x2 = d;
        d = y1, y1 = y2, y2 = d;
    }
    return x1 <= x && x <= x2 &&
        ((y1 <= y2 && y1 <= y && y <= y2) ||
        (y1 > y2 && y2 <= y && y <= y1))
        && (y-y1)*(x2-x1) == (y2-y1)*(x-x1);
}

Comments are closed.

Post Navigation