将闭合曲线拟合到一组离散点并找到它的周长

时间:2018-02-23 12:33:34

标签: python curve-fitting spline

我有一组点pts,形成一个如下所示的循环: Closed curve

我使用的代码如下:

  pts=np.array( [ [1145,1130],
                [1099.5,1056.5],
                [1026,1062],
                [950.3,1054.3],
                [909,1130],
                [940.4,1215.6],
                [1026,1264],
                [1111.6,1215.6]
                ])


    pts = np.vstack([pts, pts[0]])
    #pts = np.array([...]) # Your points

    x, y = pts.T
    i = np.arange(len(pts))

    # 5x the original number of points
    interp_i = np.linspace(0, i.max(), 5 * i.max())

    xi = interp1d(i, x, kind='cubic')(interp_i)
    yi = interp1d(i, y, kind='cubic')(interp_i)

    fig, ax = plt.subplots()
    ax.plot(xi, yi)
    ax.plot(x, y, 'ko')
    plt.show()

我想知道如何找到此曲线的长度/此图的周长。有没有办法做到这一点?

1 个答案:

答案 0 :(得分:1)

您可以将曲线的周长逼近线段的总和。

如果(xj,yj)和(xj + 1,yj + 1)是位于xy平面上的线段的起点和终点的坐标,则其长度可写为:

L_j = sqrt{[x_(j+1) - x_(j)]^2 + [y_(j+1) - y_(j)]^2}

因此,您可以对所有L_j段求和,得到闭合曲线周长的近似值。

执行此操作的python代码示例是:

L = np.sqrt((xi[-1] - xi[0])**2 + (yi[-1] - yi[0])**2) # let the initial value of L be the length of the line segment between the last and the first points
for j in range(0,len(xi)):
  L = L + np.sqrt((xi[j+1] - xi[j])**2 + (yi[j+1] - yi[j])**2)
print L