gpt4 book ai didi

python - 最近的交叉点到 python 中的多条线

转载 作者:行者123 更新时间:2023-11-28 20:01:04 31 4
gpt4 key购买 nike

我需要一个好的算法来计算最接近 python 中的线集合的点,最好是使用最小二乘法。我在一个不起作用的 python 实现上发现了这篇文章:

Finding the centre of multiple lines using least squares approach in Python

而且我在 Matlab 中发现了这个资源,似乎每个人都喜欢......但我不确定如何将其转换为 python:

https://www.mathworks.com/matlabcentral/fileexchange/37192-intersection-point-of-lines-in-3d-space

我很难相信有人还没有这样做过……这肯定是 numpy 的一部分或标准包,对吧?我可能只是没有在寻找合适的术语 - 但我还没有找到它。我可以通过每两个点或一个点和一个方向来定义线。任何帮助将不胜感激!

这是我正在处理的一组示例点:

第一组线的初始 XYZ 点

array([[-7.07107037,  7.07106748,  1. ],
[-7.34818339, 6.78264559, 1. ],
[-7.61352972, 6.48335745, 1. ],
[-7.8667115 , 6.17372055, 1. ],
[-8.1072994 , 5.85420065, 1. ]])

属于第一组线的角

[-44.504854, -42.029223, -41.278573, -37.145774, -34.097022]

第二组线的初始 XYZ 点

array([[ 0., -20. ,  1. ],
[ 7.99789129e-01, -19.9839984, 1. ],
[ 1.59830153e+00, -19.9360366, 1. ],
[ 2.39423914e+00, -19.8561769, 1. ],
[ 3.18637019e+00, -19.7445510, 1. ]])

属于第二组线的角

[89.13244, 92.39087, 94.86425, 98.91849, 99.83488]

解决方案应该是原点或非常接近原点(数据只是有点嘈杂,这就是为什么这些线不能完全相交于一个点)。

最佳答案

这是一个使用 this link 中描述的方法的 numpy 解决方案

def intersect(P0,P1):
"""P0 and P1 are NxD arrays defining N lines.
D is the dimension of the space. This function
returns the least squares intersection of the N
lines from the system given by eq. 13 in
http://cal.cs.illinois.edu/~johannes/research/LS_line_intersect.pdf.
"""
# generate all line direction vectors
n = (P1-P0)/np.linalg.norm(P1-P0,axis=1)[:,np.newaxis] # normalized

# generate the array of all projectors
projs = np.eye(n.shape[1]) - n[:,:,np.newaxis]*n[:,np.newaxis] # I - n*n.T
# see fig. 1

# generate R matrix and q vector
R = projs.sum(axis=0)
q = (projs @ P0[:,:,np.newaxis]).sum(axis=0)

# solve the least squares problem for the
# intersection point p: Rp = q
p = np.linalg.lstsq(R,q,rcond=None)[0]

return p

作品

enter image description here

编辑:这是一个用于噪声测试数据的生成器

n = 6
P0 = np.stack((np.array([5,5])+3*np.random.random(size=2) for i in range(n)))
a = np.linspace(0,2*np.pi,n)+np.random.random(size=n)*np.pi/5.0
P1 = np.array([5+5*np.sin(a),5+5*np.cos(a)]).T

关于python - 最近的交叉点到 python 中的多条线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52088966/

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