如何检查一个点是否在一条线下方?

新手上路,请多包涵

如何检查一个点是否在一条线下方?

我有以下数据:

 Line [ {x1,y1}, {x2,y2} ]
Points {xA,yA}, {xB,yB} ...

我需要用 python 编写一个小算法来检测线的一侧和另一侧的点。

谢谢

原文由 aneuryzm 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 536
2 个回答

您可以尝试使用叉积 - http://en.wikipedia.org/wiki/Cross_product

 v1 = (x2-x1, y2-y1)   # Vector 1
v2 = (x2-xA, y2-yA)   # Vector 2
xp = v1[0]*v2[1] - v1[1]*v2[0]  # Cross product
if xp > 0:
    print('on one side')
elif xp < 0:
    print('on the other')
else:
    print('on the same line!')

你需要校准每一面是什么。如果您希望它位于“下方”或“上方”,您需要确保线上的点水平排序。

我没有测试过这个。

编辑 我最初输入点积公式。 :o

编辑 2 D’oh,我将坐标放入集合而不是元组中。如果您运行的是相当现代的 Python 版本,那么使用 namedtuple('point', 'x y') 作为向量非常好。

幸运的是,我找到 了 Calculating a 2D Vector’s Cross Product

原文由 Edmund 发布,翻译遵循 CC BY-SA 4.0 许可协议

你可以尝试使用叉积,但诀窍是如何选择点来形成向量,这里我选择点中最近的点,假设我得到了点A(你可以公平地循环点来计算从循环点到线的距离):

 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 cross_product < 0:
    print 'pointA is on the clockwise side of line'
else:
    print 'pointA is exactly on the line'

原文由 gameboy90 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题