1 回答

TA貢獻(xiàn)2037條經(jīng)驗 獲得超6個贊
讓我們構(gòu)建一個通用的 MCVE,首先我們導(dǎo)入所需的包:
import numpy as np
from scipy import interpolate
import matplotlib.pyplot as plt
from mpl_toolkits import mplot3d
import matplotlib.tri as mtri
np.random.seed(123456) # Fix the random seed
現(xiàn)在我們?yōu)橐粋€表面生成一個 3D 點的集合S(注意它是一個不規(guī)則的網(wǎng)格):
NS = 100
Sx = 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,))
和一個參數(shù)曲線P:
NP = 100
t = np.linspace(-1, 1, NP)
Px = t
Py = t**2 - 0.5
Pz = t**3 + 1
解決問題的關(guān)鍵是LinearNDInterpolator在 N 維中執(zhí)行分段線性插值:
PSz = interpolate.LinearNDInterpolator(list(zip(Sx, Sy)), Sz)(list(zip(Px,Py)))
只需要重塑數(shù)據(jù)以適應(yīng)方法簽名,從單獨的向量到形狀矩陣,(Nsample,Ndims)可以轉(zhuǎn)換為:
list(zip(Sx, Sy))
我們可以從頂部查看數(shù)據(jù):
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 結(jié)果如下所示:
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)
添加回答
舉報