[英]Distance between line formed by two points to every other point, for every possible line
[英]Distance between point and a line (from two points)
我正在使用 Python+Numpy(也许也可以使用 Scipy)并且有三个 2D 点
(P1, P2, P3);
我试图让 P3 的距离垂直于 P1 和 P2 之间绘制的线。 让P1=(x1,y1)
, P2=(x2,y2)
和P3=(x3,y3)
在矢量符号中,这将非常简单,但我对 python/numpy 还很陌生,无法获得任何有效的(甚至接近)。
任何提示表示赞赏,谢谢!
尝试使用numpy.linalg
的norm函数
d = norm(np.cross(p2-p1, p1-p3))/norm(p2-p1)
np.cross
只为二维向量返回叉积的 z 坐标。 因此,不需要接受答案中的第一个norm
,如果p3
是向量数组而不是单个向量,则实际上是危险的。 最好只是使用
d=np.cross(p2-p1,p3-p1)/norm(p2-p1)
对于一组点p3
它将为您提供与该线的距离数组。
要使上述答案起作用,点必须是 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)
abs((x2-x1)*(y1-y0) - (x1-x0)*(y2-y1)) / np.sqrt(np.square(x2-x1) + np.square(y2-y1))
可以通过公式直接使用,只需要插入值并繁荣它就会起作用。
如果您有斜率和截距,要从点到线的距离,您可以使用 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, 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
这是我从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)
如果有任何不清楚的地方,请告诉我。
叉积对二维情况很有帮助,但它们不能很好地推广到其他维度。 然而,点产品可以。 两个正交向量的点积在任何空间都为零,您可以使用它来提出一个简单的解决方案。
假设您将P4
与P1
- P2
放在同一行。 您可以使用参数t
对其进行参数化,以便
P4 = P1 + t * (P2 - P1)
目标是找到P4
使得
(P3 - P4) . (P2 - P1) == 0
根据t
展开P4
并简化:
(P3 - P1 - t * (P2 - P1)) . (P2 - P1) == 0
(P3 - P1) . (P2 - P1) == t * ||P2 - P1||^2
t = (P3 - P1) . (P2 - P1) / ||P2 - P1||^2
因此你有
D = ||P3 - P4|| = ||P3 - (P3 - P1) . (P2 - P1) / (||P2 - P1||^2)||
我在我的实用程序库中编写了一个名为haggis
的函数。 您可以使用haggis.math.segment_distance
计算到整条线(不仅仅是有界线段)的距离,如下所示:
d = haggis.math.segment_distance(P3, P1, P2, segment=False)
多亏了DotPi的解决方案,我为该行编写了一个模块来计算这个和其他一些用 c++ 实现的简单的行操作,它工作得非常快。 您可以通过 pip 安装FastLine ,然后以这种方式使用它:
from FastLine import Line
# define a line by two points
l1 = Line(p1=(0,0), p2=(10,10))
# or define a line by slope and intercept
l2 = Line(m=0.5, b=-1)
# compute distance
d1 = l1.distance_to((20,50))
# returns 21.213203435596427
d2 = l2.distance_to((-15,17))
# returns 22.807893370497855
3D 距离应该使用 np.dot defthreeD_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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.