Ответ 1
Предполагая, что point1
и point2
различны, сначала проверяйте, находится ли точка на линии. Для этого вам просто нужен "кросс-продукт" векторов point1 → currPoint
и point1 → point2
.
dxc = currPoint.x - point1.x;
dyc = currPoint.y - point1.y;
dxl = point2.x - point1.x;
dyl = point2.y - point1.y;
cross = dxc * dyl - dyc * dxl;
Ваша точка лежит на линии тогда и только тогда, когда cross
равен нулю.
if (cross != 0)
return false;
Теперь, когда вы знаете, что точка лежит на линии, настало время проверить, находится ли она между исходными точками. Это можно легко сделать, сравнивая координаты x
, если линия "более горизонтальная, чем вертикальная", или y
координат в противном случае
if (abs(dxl) >= abs(dyl))
return dxl > 0 ?
point1.x <= currPoint.x && currPoint.x <= point2.x :
point2.x <= currPoint.x && currPoint.x <= point1.x;
else
return dyl > 0 ?
point1.y <= currPoint.y && currPoint.y <= point2.y :
point2.y <= currPoint.y && currPoint.y <= point1.y;
Обратите внимание, что вышеприведенный алгоритм, если он полностью интегрален, если входные данные являются интегральными, т.е. Для вычисления целых чисел не требуется вычислений с плавающей запятой. Остерегайтесь потенциального переполнения при расчете cross
.
PS Этот алгоритм абсолютно точен, что означает, что он отклонит точки, которые находятся очень близко к линии, но не точно на линии. Иногда это не то, что нужно. Но это другая история.