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

use*_*675 14 python numpy point vector scipy

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

(P1, P2, P3); 
Run Code Online (Sandbox Code Playgroud)

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

在矢量符号中,这将非常简单,但我对python/numpy相当新,并且无法获得任何有效(甚至关闭)的东西.

任何提示赞赏,谢谢!

Dot*_*tPi 25

尝试使用norm函数numpy.linalg

d = norm(np.cross(p2-p1, p1-p3))/norm(p2-p1)
Run Code Online (Sandbox Code Playgroud)

  • 应该是`np.abs(np.cross(p2-p1,p1-p3))/ norm(p2-p1))`? (11认同)
  • 您需要将这些点转换为numpy数组。可以这样完成:`p1 = np.asarray(p1)` (3认同)
  • -:'tuple'和'tuple'不受支持的操作数类型?这是什么? (2认同)
  • `abs((x2-x1)*(y1-y0) - (x1-x0)*(y2-y1)) / np.sqrt(np.square(x2-x1) + np.square(y2-y1)) ` 我以这种方式使用它,它在 python 中给了我相同的答案 (2认同)
  • 这是否假设线延伸到无穷远,或者随着点“P3”远离由“P1,P2”生成的线段的端点,它生成的距离变得更大? (2认同)
  • @ajayramesh如果你有p1、p2和p3向量,你需要abs;或者可以说 Nx2 阵列。由于我们在 2D 中工作,因此 2D 坐标没有叉积,Z 轴会附加值 0。Numpy 文档对于 np.cross 说“如果两个输入向量的维度都是 2,则 Z 轴的 z 分量返回叉积。”,因此您将收到一个 Nx1 标量数组,但从数学上讲,您会收到一个 Nx3 向量数组(x 和 y 等于 0)。如果使用 np.norm,您将得到 Nx1 数组的范数,但您想要的是 Nx3 数组中每个向量的范数。 (2认同)

Mar*_*tle 6

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

d=np.cross(p2-p1,p3-p1)/norm(p2-p1)
Run Code Online (Sandbox Code Playgroud)

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

  • @dinosaur,因为 `norm` 会将 `np.cross` 返回的一维数组视为一个大向量并返回其“大小”。 (2认同)
  • 在删除第一个范数后,我只得到了一个_signed_距离,也就是说,根据某种约定,这个距离告诉我该点是在线的右侧还是左侧。 (2认同)

小智 5

为了使上述答案有效,这些点必须是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)
Run Code Online (Sandbox Code Playgroud)


小智 5

如果有斜率和截距,要查找从点到线的距离,可以使用 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)
Run Code Online (Sandbox Code Playgroud)

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


aja*_*esh 5

基于已接受的答案

\n\n

用下面的直线方程进行测试 -

\n\n
\n

求从点 (5, 6) 到直线 \xe2\x88\x922x + 3y + 4 = 0 的垂直距离

\n
\n\n\n\n
import numpy as np\nnorm = np.linalg.norm\n\np1 = np.array([0,-4/3])\np2 = np.array([2, 0])\n\np3 = np.array([5, 6])\nd = np.abs(norm(np.cross(p2-p1, p1-p3)))/norm(p2-p1)\n# output d = 3.328201177351375\n\n
Run Code Online (Sandbox Code Playgroud)\n