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