点与线之间的距离(从两点开始)

时间:2016-10-03 20:40:12

标签: python numpy vector scipy point

我使用Python + Numpy(也可以使用Scipy)并有三个2D点

(P1, P2, P3); 

我试图让P3的距离垂直于P1和P2之间的线。设P1=(x1,y1)P2=(x2,y2)P3=(x3,y3)

在矢量符号中,这将非常简单,但我对python / numpy来说相当新,并且不能使任何有效(甚至关闭)。

任何提示都表示赞赏,谢谢!

8 个答案:

答案 0 :(得分:17)

尝试使用numpy.linalg

中的规范功能
d = norm(np.cross(p2-p1, p1-p3))/norm(p2-p1)

答案 1 :(得分:4)

np.cross仅返回2D矢量的叉积的z坐标。因此,不需要接受答案中的第一个norm,如果p3是向量数组而不是单个向量,则实际上是危险的。最好只使用

d=np.cross(p2-p1,p3-p1)/norm(p2-p1)

对于点p3数组,它将为您提供距离线的距离数组。

答案 2 :(得分:3)

要使上述答案有效,这些点必须是numpy数组,这是一个工作示例:

import numpy as np
p1=np.array([0,0])
p2=np.array([10,10])
p3=np.array([5,7])
d=np.cross(p2-p1,p3-p1)/np.linalg.norm(p2-p1)

答案 3 :(得分:1)

abs((x2-x1)*(y1-y0) - (x1-x0)*(y2-y1)) / np.sqrt(np.square(x2-x1) + np.square(y2-y1))

可以直接通过公式使用,只需插入值并使其生效即可。

答案 4 :(得分:1)

要查找到点到直线的距离(如果有斜率并进行截距),可以使用Wiki中的公式 https://en.wikipedia.org/wiki/Distance_from_a_point_to_a_line Python:

def distance(point,coef):
    return abs((coef[0]*point[0])-point[1]+coef[1])/math.sqrt((coef[0]*coef[0])+1)

coef是具有斜率和截距的元组

答案 5 :(得分:0)

点到直线的最短距离

这是我从 https://www.geeksforgeeks.org 获得的代码:

import math 

# Function to find distance 
def shortest_distance(x1, y1, a, b, c):    
    d = abs((a * x1 + b * y1 + c)) / (math.sqrt(a * a + b * b)) 
    print("Perpendicular distance is", d)

现在您必须找到A,B,C,x和y。

import numpy as np
closest = []
x = (x ,y)
y = (x, y)
coef = np.polyfit(x, y, 1)
A = coef[0]
B = coef[1]
C = A*x[0] + B*x[1]

现在您可以插入值:

shortest_dis = shortest_distance(x, y, A, B, C)

完整代码如下:

import math
import numpy as np

def shortest_distance(x1, y1, a, b, c):    
    d = abs((a * x1 + b * y1 + c)) / (math.sqrt(a * a + b * b)) 
    print("Perpendicular distance is", d)

closest = []
x = (x ,y)
y = (x, y)
coef = np.polyfit(x, y, 1)
A = coef[0]
B = coef[1]
C = A*x[0] + B*x[1]
shortest_dis = shortest_distance(x, y, A, B, C)

请告知我是否不清楚。

答案 6 :(得分:0)

基于接受的答案

使用下面的线方程测试-

找到从点(5,6)到直线−2x + 3y + 4 = 0的垂直距离

import numpy as np
norm = np.linalg.norm

p1 = np.array([0,-4/3])
p2 = np.array([2, 0])

p3 = np.array([5, 6])
d = np.abs(norm(np.cross(p2-p1, p1-p3)))/norm(p2-p1)
# output d = 3.328201177351375

答案 7 :(得分:-1)

3D距离应使用np.dot def threeD_corres(points_3_d,pre_points_3_d,points_camera):

  for j in  range (0,len(pre_points_3_d)):
      vec1 = list(map(lambda x:x[0]- x[1],zip(pre_points_3_d[j], points_camera)))
      vec2 = list(map(lambda x:x[0]- x[1],zip(pre_points_3_d[j], points_3_d[j])))
      vec3 =  list(map(lambda x:x[0]- x[1],zip(points_3_d[j], points_camera)))
      distance = np.abs(np.dot(vec1_1,vec2_2))/np.linalg.norm(vec3)

      print("#########distance:\n",distance)
  return  distance