Как проверить, находится ли точка на линии между двумя другими точками

Как я могу написать эту функцию? Любые примеры

function isPointBetweenPoints(currPoint, point1, point2):Boolean {

    var currX = currPoint.x;
    var currY = currPoint.y;

    var p1X = point1.x;
    var p1y = point1.y;

    var p2X = point2.x;
    var p2y = point2.y;

    //here I'm stuck
}

Ответ 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 Этот алгоритм абсолютно точен, что означает, что он отклонит точки, которые находятся очень близко к линии, но не точно на линии. Иногда это не то, что нужно. Но это другая история.

Ответ 2

Distance(point1,currPoint)+Distance(currPoint,point2)==Distance(point1,point2)

Но будьте осторожны, если у вас есть значения с плавающей запятой, для них все по-другому...

Ответ 3

Это не зависит от Javascript. Попробуйте выполнить следующий алгоритм с точками p1 = point1 и p2 = point2, а ваша третья точка - p3 = currPoint:

v1 = p2 - p1
v2 = p3 - p1
v3 = p3 - p2
if (dot(v2,v1)>0 and dot(v3,v1)<0) return between
else return not between

Если вы хотите быть уверенным в этом сегменте линии между p1 и p2:

v1 = normalize(p2 - p1)
v2 = normalize(p3 - p1)
v3 = p3 - p2
if (fabs(dot(v2,v1)-1.0)<EPS and dot(v3,v1)<0) return between
else return not between

Ответ 4

Вы хотите проверить, является ли наклон от point1 до currPoint таким же, как наклон от currPoint до point2, поэтому:

m1 = (currY - p1Y) / (currX - p1X);
m2 = (p2Y - currY) / (p2X - currX);

Вы также хотите проверить, находится ли currPoint внутри поля, созданного двумя другими, так что:

return (m1 == m2) && (p1Y <= currY && currY <= p2Y) && (p1X <= currX && currX <= p2X);

Изменение: это не очень хороший метод; посмотрите на решение maxim1000 для более правильного пути.