- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试使用 numpy 或 python 中的任何东西找到从点 (x0,y0,z0) 到由 (x1,y1,z1) 和 (x2,y2,z2) 连接的线的最小距离。不幸的是,我在网上能找到的所有内容都与二维空间有关,而且我对 python 还很陌生。任何帮助将不胜感激。提前致谢!
最佳答案
StackOverflow 不支持 Latex,因此我将掩盖一些数学问题。一种解决方案的想法是,如果您的线跨越点 p
和 q
,那么该线上的每个点都可以表示为 t*(p-q)+ q
为一些实值 t
。然后,您想要最小化给定点 r
与该线上任意点之间的距离,而距离很方便地是单个变量 t
的函数,因此标准的微积分技巧起作用美好的。考虑以下示例,它计算 r
与 p
和 q
所跨越的线之间的最小距离。通过手写,我们知道答案应该是 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 亿。唯一真正的约束是 p
和 q
必须是不同的点,以便它们之间有一条唯一的线。
我在上面的例子中分解了代码,以显示我在数学上思考它的方式所产生的两个不同的步骤(找到 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/
Hackerrank - Dijkstra 最短距离 2 我被卡在了 TestCase 7(我唯一失败的一个),我认为这是我的错。我下载了测试用例并检查了我生成的输出。 我执行 git diff,我看
我是一名优秀的程序员,十分优秀!