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 がここで役立つ可能性があると述べられていました.... ポイント間を補間する関数を作成するために、これを理解しようとします。
from 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)
matplotlib.pyplot を plt としてインポート
plt.plot(x,y,'o',xnew,f(xnew),'-', xnew, f2(xnew),'--')
plt.legend(['data', 'linear', 'cubic'], loc='best')
plt.show()