在Python中从点云数据创建曲面栅格

在Python中从点云数据创建曲面栅格,python,matplotlib,plot,Python,Matplotlib,Plot,下面是一个创建点云的示例,我希望将网格曲面拟合到该点云。最后,当我尝试将meshgrid数组传递给插值数据的函数时,问题出现了: import numpy as np from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt # Create some point cloud data: c = 1 a = 3 b = 4 slice = {} t = np.linspace(0,2*np.pi,50)

下面是一个创建点云的示例,我希望将网格曲面拟合到该点云。最后,当我尝试将meshgrid数组传递给插值数据的函数时,问题出现了:

import numpy as np
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt

# Create some point cloud data:
c = 1
a = 3
b = 4

slice = {}
t = np.linspace(0,2*np.pi,50)

for s in np.linspace(1,9,10):
    c = 5*s
    r = (-s**2+10.0*s)/10.0
    X = r*np.cos(t)
    Y = r*np.sin(t)
    Z = c*(Y**2/b**2 - X**2/a**2) + c
    slice[str(int(s))] = np.vstack([X,Y,Z])


# Visualize it:

fig = plt.figure()
ax = fig.gca(projection = '3d')

for k,v in slice.iteritems():
    print type(v)
    print np.shape(v)
    X = v[0,:]
    Y = v[1,:]
    Z = v[2,:]
    ax.scatter(X,Y,Z)
plt.show()
看起来是这样的:

# stack all points from each slice into one vector for each coordinate:
Xs = []
Ys = []
Zs = []
for k,v in slice.iteritems():
    #ax.plot_surface(X,Y,Z)
    X = v[0,:]
    Y = v[1,:]
    Z = v[2,:]
    Xs = np.hstack((Xs,X))
    Ys = np.hstack((Ys,Y))
    Zs = np.hstack((Zs,Z))

XX, YY = np.meshgrid(Xs,Ys)

from scipy import interpolate
f = interpolate.interp2d(Xs,Ys,Zs, kind = 'cubic')
ZZ = f(XX,YY)

我现在需要基于这些点创建曲面网格。在这种情况下,曲面有多种解释,因为我只有点云而不是函数z=f(x,y),但在这种情况下,正确的曲面应该是创建空心“扭曲圆柱体”的曲面。我想这样来解决这个问题:

# stack all points from each slice into one vector for each coordinate:
Xs = []
Ys = []
Zs = []
for k,v in slice.iteritems():
    #ax.plot_surface(X,Y,Z)
    X = v[0,:]
    Y = v[1,:]
    Z = v[2,:]
    Xs = np.hstack((Xs,X))
    Ys = np.hstack((Ys,Y))
    Zs = np.hstack((Zs,Z))

XX, YY = np.meshgrid(Xs,Ys)

from scipy import interpolate
f = interpolate.interp2d(Xs,Ys,Zs, kind = 'cubic')
ZZ = f(XX,YY)
然后我就可以用

fig = plt.figure()
ax = fig.gca(projection = '3d')

ax.plot_surface(XX, YY, ZZ)
plt.show()
但是,插值函数似乎不接受数组作为输入,因此此方法可能不起作用。有人能提出一个建议,如何正确地做到这一点吗

编辑: 实际上,数据显然不能表示为函数,因为它不是一对一的