如果我有一个明确的线段,然后给出两个随机的不同点,我怎样才能确定它们是否在线段的同一侧? 我想使用函数def same_side(line,p1,p2)。我知道基于几何可以使用交叉产品,但我不确定如何使用python。
答案 0 :(得分:2)
基于教程here:
def same_side (line, p1, p2):
return ((line['y1']−line['y2'])*(p1['x']−line['x1'])+(line['x2']−line['x1'])*(p1['y']−line['y1']))*((line['y1']−line['y2'])*(p2['x']−line['x1'])+(line['x2']−line['x1'])*(p2['y']−line['y1']))>0
示例:
# Same side
line = {'x1':0,'y1':0,'x2':1,'y2':1}
p1 = {'x':0,'y':1}
print same_side (line, p1, p1)
# Same side
line = {'x1':0,'y1':0,'x2':1,'y2':1}
p1 = {'x':0,'y':1}
p2 = {'x':0,'y':2}
print same_side (line, p1, p2)
# Different side
line = {'x1':0,'y1':0,'x2':1,'y2':1}
p1 = {'x':0,'y':1}
p2 = {'x':0,'y':-2}
print same_side (line, p1, p2)
答案 1 :(得分:1)
如果你能得到斜率截距形式的线方程,你应该能够设置不等式。
假设我们有点(x1,y1),(x2,y2)和线y = mx + b
你应该能够为这两个点插入x和y值,如果两者都得到方程y< mx + b或两者都使它成为y> mx + b,它们在同一侧。
如果任一点满足等式(y = mx + b),则该点在线上。
if (y1 > m * x1 + b and y2 > m * x2 + b) or (y1 < m * x1 + b and y2 < m *x2 + b):
return True #both on same side
答案 2 :(得分:1)
假设你有线段的端点(x1,y1)和(x2,y2),equation for the line passing through them是y = y1 +(x - x1)/(x2 - x1)*( y2 - y1)。线上方的点将具有更大的y值,并且下面的点将具有更小的y值。因此,您只需将每个查询点的x值插入此公式,该公式为您提供该x行的y坐标,并将其与查询点的x进行比较。如果两个点都在同一侧,则它们的x都会更大或者都更小。
这个例外的一个例外是线完全垂直(x1 == x2)。这里的公式有所不同,因此您需要一个特殊情况来检查这一点。在这种情况下,将查询点的x坐标与线的x坐标进行比较(x1或x2,并不重要)。
答案 3 :(得分:1)
如果你有可用的numpy,这很简单:
import numpy as np
def same_side(line, point1, point2):
v1 = np.array([line.start.x - line.end.x, line.start.y - line.end.y])
v2 = np.array([line.start.x - point1.x, line.start.y - point1.y])
v3 = np.array([line.start.x - point2.x, line.start.y - point1.y])
return (np.dot(np.cross(v1, v2), np.cross(v1, v3)) >= 0)