spline interpolation coefficients of a line curve in 3d space

后端 未结 1 1953
余生分开走
余生分开走 2020-12-28 09:26

I am new to python. I have a line curve in the 3D space defined by a set of given points. Can anyone suggest how I can use the interpolate with spline functions of the scip

相关标签:
1条回答
  • 2020-12-28 09:57

    I too am new to python, but my recent searching led me to a very helpful scipy interpolation tutorial. From my reading of this I concur that the BivariateSpline family of classes/functions are intended for interpolating 3D surfaces rather than 3D curves.

    For my 3D curve fitting problem (which I believe is very similar to yours, but with the addition of wanting to smooth out noise) I ended up using scipy.interpolate.splprep (not to be confused with scipy.interpolate.splrep). From the tutorial linked above, the spline coefficients your are looking for are returned by splprep.

    The normal output is a 3-tuple, (t,c,k) , containing the knot-points, t , the coefficients c and the order k of the spline.

    The docs keep referring to these procedural functions as an "older, non object-oriented wrapping of FITPACK" in contrast to the "newer, object-oriented" UnivariateSpline and BivariateSpline classes. I would have preferred "newer, object-oriented" myself, but as far as I can tell UnivariateSpline only handles the 1-D case whereas splprep handles N-D data directly.

    Below is a simple test-case that I used to figure out these functions:

    import numpy as np
    import matplotlib.pyplot as plt
    from scipy import interpolate
    from mpl_toolkits.mplot3d import Axes3D
    
    
    # 3D example
    total_rad = 10
    z_factor = 3
    noise = 0.1
    
    num_true_pts = 200
    s_true = np.linspace(0, total_rad, num_true_pts)
    x_true = np.cos(s_true)
    y_true = np.sin(s_true)
    z_true = s_true/z_factor
    
    num_sample_pts = 80
    s_sample = np.linspace(0, total_rad, num_sample_pts)
    x_sample = np.cos(s_sample) + noise * np.random.randn(num_sample_pts)
    y_sample = np.sin(s_sample) + noise * np.random.randn(num_sample_pts)
    z_sample = s_sample/z_factor + noise * np.random.randn(num_sample_pts)
    
    tck, u = interpolate.splprep([x_sample,y_sample,z_sample], s=2)
    x_knots, y_knots, z_knots = interpolate.splev(tck[0], tck)
    u_fine = np.linspace(0,1,num_true_pts)
    x_fine, y_fine, z_fine = interpolate.splev(u_fine, tck)
    
    fig2 = plt.figure(2)
    ax3d = fig2.add_subplot(111, projection='3d')
    ax3d.plot(x_true, y_true, z_true, 'b')
    ax3d.plot(x_sample, y_sample, z_sample, 'r*')
    ax3d.plot(x_knots, y_knots, z_knots, 'go')
    ax3d.plot(x_fine, y_fine, z_fine, 'g')
    fig2.show()
    plt.show()
    

    0 讨论(0)
提交回复
热议问题