我正在尝试在间距为 1m 或 0.5m 的固定网格上创建 3D 表面,其中表面是由多个点的横截面定义的通道。理想情况下,它应该是任意数量的点。例如横截面,例如:
PTS = [[0.0,10.0],[3.0,9.0],[30.0,8.5],[33.0,8.0],[35.0,7.8],[37.0,8.0],[40.0,8.5],[67.0,9.0] ,[70.0,10.0]] 这里的河道宽 70 m,截面为双梯形。
我已经尝试过对此进行编码,但未能成功:
我想读取这些点,然后根据间距进行插值以提供计算出的高程(Z 值)。这应该填充 X 和 Y 的域,从而提供 3D 地形的 XYZ 值
这个例子应该创建一个 70 m 宽的 1500 m 长的通道
代码:
设置计算域
length = 50.0 # change back to 3500
width = 30.0 #changed this
dx = dy = 1.0 # Resolution: of grid on both axes
h=2.21 # Constant depth
slope_X=1/100
def topography(x,y):
z = -x*slope_X
PTS = [[0.0,10.0],[3.0,9.0],[30.0,8.5],[33.0,8.0],[35.0,7.8],[37.0,8.0],[40.0,8.5],[67.0,9.0],[70.0,10.0]]
N = len(x)
for i in range(N):
# Construct Cross section from LIST of PTS
for j in range(len(PTS)):
if j == 0:
pass
else:
m = (PTS[j][1]-PTS[j-1][1])/(PTS[j][0]-PTS[j-1][0])
b = PTS[j-1][1]-(PTS[j][1]-PTS[j-1][1])/(PTS[j][0]-PTS[j-1][0])*PTS[j-1][0]
z[i]= m *y[i]+b
if x[i]==10:
print 'Z =', z[i]
return z
当代码遍历 X 时,基本 Z 提供了一个倾斜的床,然后定义的横截面在 Y 的范围内创建了 Z
理想情况下,这也可以沿多段线应用,而不是仅在 x 方向上应用。这样,通道可以沿曲线或 S 形弯曲产生
我希望有人对如何解决这个问题有一些聪明的想法......谢谢
有人提到 scipy 可能会在这里提供帮助....我将尝试理解这一点,以创建一个在点之间进行插值的函数:
从 scipy.interpolate 导入 interp1d
x = np.linspace(0, 10, 10)
y = np.exp(-x/3.0)
f = interp1d(x, y)
f2 = interp1d(x, y, kind='cubic')
xnew = np.linspace(0, 10, 40)
将 matplotlib.pyplot 导入为 plt
plt.plot(x,y,'o',xnew,f(xnew),'-',xnew, f2(xnew),'--')
plt.legend(['data', 'linear', 'cubic'], loc='best')
plt.show()