找出两个点是否在同一侧

时间:2015-02-17 05:25:23

标签: python python-3.x

如果我有一个明确的线段,然后给出两个随机的不同点,我怎样才能确定它们是否在线段的同一侧? 我想使用函数def same_side(line,p1,p2)。我知道基于几何可以使用交叉产品,但我不确定如何使用python。

4 个答案:

答案 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)