【问题标题】:Finding the centre of multiple lines using least squares approach in Python在 Python 中使用最小二乘法查找多条线的中心
【发布时间】:2026-01-08 03:35:02
【问题描述】:

我有一系列大致(但不完全)相交的线。

我需要找到使中心每条线之间的距离最小的点。我一直在尝试遵循这种方法:

Nearest point to intersecting lines in 2D

当我在 Python 中创建脚本来执行此功能时,我得到了错误的答案:

这是我的代码,我想知道是否有人可以建议我做错了什么?或者更简单的方法来解决这个问题。每条线由两个点 x1 和 x2 定义。

def directionalv(x1,x2):
    point1=np.array(x1) #point1 and point2 define my line
    point2=np.array(x2)
    ortho= np.array([[0,-1],[1,0]]) #see wikipedia article
    subtract=point2-point1
    length=np.linalg.norm(subtract)
    fraction = np.divide(subtract,length)
    n1=ortho.dot(fraction)
    num1=n1.dot(n1.transpose())
    num = num1*(point1)
    denom=n1.dot(n1.transpose())
    return [num,denom]           

n1l1=directionalv(x1,x2) 
n1l2=directionalv(x3,x4)
n1l3=directionalv(x5,x6)
n1l4=directionalv(x7,x8)
n1l5=directionalv(x9,x10)

numerall=n1l1[0]+n1l2[0]+n1l3[0]+n1l4[0]+n1l5[0]  #sum of (n.n^t)pi from wikipedia article
denomall=n1l1[1]+n1l2[1]+n1l3[1]+n1l4[1]+n1l5[1] #sum of n.n^t
point=(numerall/denomall)

我的观点如下 Line1 由点 x1= [615, 396] 和 x2 = [616, 880] 组成

第 2 行,x3 = [799, 449] x4= [449, 799]

第 3 行,x5 = [396, 637] x6 = [880, 636]

第 4 行,x7 = [618, 396] x8 = [618, 880]

第 5 行,x9 = [483, 456] x10 = [777, 875]

任何帮助将不胜感激!

感谢您的宝贵时间。

【问题讨论】:

    标签: python-3.x math vector least-squares


    【解决方案1】:

    这可能仅仅是因为您应该在 Python 中将矩阵定义为 2 个向量(理解是矩阵的列,而不是行! 请参阅:How to define two-dimensional array in python),然后您应该像这样定义ortho 矩阵:

        ortho= np.array([[0,1],[-1,0]])
    

    否则,以下是什么意思?

        numerall=n1l1[0]+n1l2[0]+n1l3[0]+n1l4[0]+n1l5[0]  #sum of (n.n^t)pi from wikipedia article
        denomall=n1l1[1]+n1l2[1]+n1l3[1]+n1l4[1]+n1l5[1] #sum of n.n^t        
        point=(numerall/denomall)
    

    我不明白您对矩阵转置的解释;并且矩阵的逆不等于除法。

    使用现有的 Python 库(如 Numpy) 进行计算,而不是自己实现。见:https://docs.scipy.org/doc/numpy-1.10.4/reference/generated/numpy.matrix.html

    【讨论】:

    • 我知道转置不等于除法,但这不会改变代码的输出。 Numerall 是我认为*文章中给出的最后一个分数的分子。?即文章中 (ni.ni^t)pi 的总和。与 denomall 相同。感谢您的宝贵时间。
    • 贝特曼,有逆矩阵(-1)和转置矩阵(T)。你在哪里看到公式中的分数? wikimedia.org/api/rest_v1/media/math/render/svg/…
    • 好的,我明白你的意思了。如果我将 point 更改为: point = (np.linalg.inv(denomall)).dot(numerall) 则会收到错误消息,因为我的 denomall 值不是二维的。
    • 如果我尝试对 denomll 执行逆操作,我会遇到错误,因为 denomll 不是二维数组。这意味着我的脚本的这一部分是不正确的。
    • 建议:在你的函数directionalv 中,只计算ni 向量。然后,您可以将公式与总和一起应用。