Я пытаюсь создать трехмерную поверхность на фиксированной сетке, скажем, с интервалом 1 м или 0,5 м, где поверхность - это канал, определяемый поперечным сечением нескольких точек. В идеале это должно быть любое количество баллов. Например, сечение, такое как:
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 м и имеет двойное трапециевидное сечение.
Я пытался закодировать это, но до сих пор не смог:
Я хочу прочитать точки, а затем интерполировать на основе расстояния, чтобы получить вычисленную высоту (значение Z). Это должно заполнить область X & Y, тем самым предоставляя значения XYZ 3D ландшафта
В этом примере предполагается создать канал длиной 1500 м и шириной 70 м
КОД:
Настройка вычислительной области
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 обеспечивает наклонное основание, а затем определенное поперечное сечение создает Z в диапазоне Y
В идеале это также может быть применено вдоль ломаной линии, а не только в направлении x. Таким образом, канал может быть получен вдоль кривой или S-изгибом, например
Надеюсь, у кого-то есть какие-нибудь умные идеи, как решить эту проблему ... Спасибо
Было упомянуто, что Сципи может помочь здесь ... Я попытаюсь разобраться в этом, чтобы создать функцию для интерполяции между точками:
из scipy.interpolate import 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)
import matplotlib.pyplot as plt
plt.plot (x, y, ’o’, xnew, f (xnew), ’-’, xnew, f2 (xnew), ’-’)
plt.legend ([’data’, ’linear’, ’cubic’], loc = ’best’)
plt.show ()