让我们构建一个通用的MCVE,首先我们导入所需的软件包:
import numpy as npfrom scipy import interpolateimport matplotlib.pyplot as pltfrom mpl_toolkits import mplot3dimport matplotlib.tri as mtrinp.random.seed(123456) # Fix the random seed
现在,我们为曲面生成3D点的集合
S(注意,它是不规则的网格):
NS = 100Sx = np.random.uniform(low=-1., high=1., size=(NS,))Sy = np.random.uniform(low=-1., high=1., size=(NS,))Sz = -(Sx**2 + Sy**2) + 0.1*np.random.normal(size=(NS,))
和一个参数曲线
P:
NP = 100t = np.linspace(-1, 1, NP)Px = tPy = t**2 - 0.5Pz = t**3 + 1
解决您的问题的关键是
LinearNDInterpolator在N个维度上执行分段线性插值:
PSz = interpolate.LinearNDInterpolator(list(zip(Sx, Sy)), Sz)(list(zip(Px,Py)))
只需重新整形数据以使方法签名从单独的向量适应形状矩阵
(Nsample,Ndims)即可转换为:
list(zip(Sx, Sy))
我们可以从顶部检查数据:
tri = mtri.Triangulation(Sx, Sy)fig, axe = plt.subplots()axe.plot(Sx, Sy, '+')axe.plot(Px, Py)axe.triplot(tri, linewidth=1, color='gray')axe.set_aspect('equal')axe.grid()
完整的3D结果如下所示:
axe = plt.axes(projection='3d')axe.plot_trisurf(tri, Sz, cmap='jet', alpha=0.5)axe.plot(Px, Py, Pz)axe.plot(Px, Py, PSz, linewidth=2, color='black')axe.scatter(Sx, Sy, Sz)axe.view_init(elev=25, azim=-45)
axe.view_init(elev=75, azim=-45)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)