gpt4 book ai didi

python - 3维空间中点到线的最短距离

转载 作者:太空宇宙 更新时间:2023-11-04 09:43:33 24 4
gpt4 key购买 nike

我正在尝试使用 numpy 或 python 中的任何东西找到从点 (x0,y0,z0) 到由 (x1,y1,z1) 和 (x2,y2,z2) 连接的线的最小距离。不幸的是,我在网上能找到的所有内容都与二维空间有关,而且我对 python 还很陌生。任何帮助将不胜感激。提前致谢!

最佳答案

StackOverflow 不支持 Latex,因此我将掩盖一些数学问题。一种解决方案的想法是,如果您的线跨越点 pq,那么该线上的每个点都可以表示为 t*(p-q)+ q 为一些实值 t。然后,您想要最小化给定点 r 与该线上任意点之间的距离,而距离很方便地是单个变量 t 的函数,因此标准的微积分技巧起作用美好的。考虑以下示例,它计算 rpq 所跨越的线之间的最小距离。通过手写,我们知道答案应该是 1

import numpy as np

p = np.array([0, 0, 0])
q = np.array([0, 0, 1])
r = np.array([0, 1, 1])

def t(p, q, r):
x = p-q
return np.dot(r-q, x)/np.dot(x, x)

def d(p, q, r):
return np.linalg.norm(t(p, q, r)*(p-q)+q-r)

print(d(p, q, r))
# Prints 1.0

这适用于任何数量的维度,包括 2、3 和 10 亿。唯一真正的约束是 pq 必须是不同的点,以便它们之间有一条唯一的线。

我在上面的例子中分解了代码,以显示我在数学上思考它的方式所产生的两个不同的步骤(找到 t 然后计算距离)。这不一定是最有效的方法,如果您想知道各种点和同一条线的最小距离,那肯定不是——如果维数很小,则更是如此。要获得更有效的方法,请考虑以下事项:

import numpy as np

p = np.array([0, 0, 0]) # p and q can have shape (n,) for any
q = np.array([0, 0, 1]) # n>0, and rs can have shape (m,n)
rs = np.array([ # for any m,n>0.
[0, 1, 1],
[1, 0, 1],
[1, 1, 1],
[0, 2, 1],
])

def d(p, q, rs):
x = p-q
return np.linalg.norm(
np.outer(np.dot(rs-q, x)/np.dot(x, x), x)+q-rs,
axis=1)

print(d(p, q, rs))
# Prints array([1. , 1. , 1.41421356, 2. ])

可能有一些我遗漏的简化或其他可以加快速度的东西,但这至少应该是一个好的开始。

关于python - 3维空间中点到线的最短距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50727961/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com