Как я могу проверить, находится ли точка ниже линии или нет?
Как я могу проверить, находится ли точка ниже линии или нет ?
У меня есть следующие данные:
Line [ {x1,y1}, {x2,y2} ]
Points {xA,yA}, {xB,yB} ...
Мне нужно написать небольшой алгоритм в python для обнаружения точек на одной стороне и на другой стороне линии.
спасибо
3 ответов
вы можете попробовать использовать перекрестный продукт -- http://en.wikipedia.org/wiki/Cross_product.
v1 = {x2-x1, y2-y1} # Vector 1
v2 = {x2-xA, y2-yA} # Vector 1
xp = v1.x*v2.y - v1.y*v2.x # Cross product
if xp > 0:
print 'on one side'
elif xp < 0:
print 'on the other'
else:
print 'on the same line!'
вам нужно будет откалибровать каждую сторону. Если вы хотите, чтобы он был "ниже" или "выше", вам нужно убедиться, что точки На линии отсортированы по горизонтали.
Я не проверял это.
редактировать Я первоначально положил в формулу продукта точки. : o
к счастью, я нашел вычисление Креста 2D вектора Продукт.
вы можете попробовать использовать кросс-произведение, но трюк заключается в том, как выбрать точку для формирования вектора, здесь я выбираю ближайшую точку из точек, предположим, что я получил pointA(вы можете довольно точки цикла для вычисления расстояния от точки цикла до линии):
v1 = {x2-x1, y2-y1} # Vector 1
v2 = {xA-x1, yA-y1} # Vector 2
cross_product = v1.x*v2.y - v1.y*v2.x
if cross_product > 0:
print 'pointA is on the counter-clockwise side of line'
elif xp < 0:
print 'pointA is on the clockwise side of line'
else:
print 'pointA is exactly on the line'
допустим, вы дали 2 пункта A, B, и вы хотите знать, в котором полуплоскости третья точка C лежит. Термины "ниже" и "выше" в качестве критериев очень расплывчаты, поэтому вам нужна точка отсчета, например происхождение. Просто убедитесь,что эта точка отсчета не коллинеарна с A и B.
теперь у вас есть треугольник (A, B, C). С помощью определителя можно вычислить площадь (посмотреть здесь или здесь). Единственная интересная вещь здесь нужно запомнить знак.
следующий шаг: для данной точки D вычислите подписанную область треугольника (A, B, D). Если результат имеет тот же знак, что и площадь вашего опорного треугольника -> C и D находятся на одной стороне (A, B). Если знак отличается - > C и D лежат на противоположных сторонах линии. Если площадь (A, B, D) равна 0, то A, B и D являются коллинеарными. Примечание: используйте Python builtin cmp
для сравнения площадей треугольника.