Python 如何检查点是否在直线下方?

Python 如何检查点是否在直线下方?,python,math,geometry,line,Python,Math,Geometry,Line,如何检查点是否在直线下方 我有以下数据: Line [ {x1,y1}, {x2,y2} ] Points {xA,yA}, {xB,yB} ... 我需要用python编写一个小算法来检测线的一边和另一边的点 谢谢您可以尝试使用交叉乘积-- v1=(x2-x1,y2-y1)#向量1 v2=(x2-xA,y2-yA)#向量1 xp=v1[0]*v2[1]-v1[1]*v2[0]#叉积 如果xp>0: 打印“单面” elif xp

如何检查点是否在直线下方

我有以下数据:

Line [ {x1,y1}, {x2,y2} ]
Points {xA,yA}, {xB,yB} ...
我需要用python编写一个小算法来检测线的一边和另一边的点


谢谢

您可以尝试使用交叉乘积--

v1=(x2-x1,y2-y1)#向量1
v2=(x2-xA,y2-yA)#向量1
xp=v1[0]*v2[1]-v1[1]*v2[0]#叉积
如果xp>0:
打印“单面”
elif xp<0:
打印“另一个”
其他:
打印“在同一行上!”
你需要校准每一面的尺寸。如果您希望它是“低于”或“高于”,您需要确保线上的点是水平排序的

我还没有测试过这个

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

编辑2d'oh,我把坐标放进一个集合而不是一个元组。如果您运行的是相当现代的Python版本,那么对向量使用
namedtuple('point','xy')
就很好了


幸运的是我找到了。

假设你给出了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内置的cmp来比较三角形区域。

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

v1={x2-x1,y2-y1}#向量1
v2={xA-x1,yA-y1}#向量2
叉积=v1.x*v2.y-v1.y*v2.x
如果交叉乘积>0:
打印“点A位于直线的逆时针侧”
elif交叉乘积<0:
打印“点A位于直线的顺时针方向”
其他:
打印“pointA完全在线”

如果xp为0.00000000000000000000000000001(可能是由于浮点表示法),该怎么办?难道这一点不可能真的在这条线上吗?(可能想和一些ε相比较,而不是0.0)好的观点!虽然我不知道如何找到最合适的epsilon值。cos(π/2)应该计算为0,但我的系统上的
math.cos(math.pi/2)
给出了
6.1230317691118863e-017
,所以我猜
1e-15
1e-16
范围内的epsilon应该是正确的。(将其放入您自己的常量
EPS
,这样您就可以通过在一个地方进行调整而不是在进行浮点比较的任何地方进行调整来轻松地对其进行调整。)或者,如果您使用的是Python 3.x,则可以使用unicodeε作为epsilon.Hi的变量名。我试着运行代码。但有一次,我犯了一个错误。错误消息显示“set对象没有属性x”。也就是说,它无法访问向量的x和y元素。有什么解决办法吗?
v1 = (x2-x1, y2-y1)   # Vector 1
v2 = (x2-xA, y2-yA)   # Vector 1
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!'
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'