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

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

У меня есть следующие данные:

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 для сравнения площадей треугольника.