给定存储为Numpy数组的虚拟高度图(或数字高程模型),如下所示:
import numpy as np
import matplotlib.pyplot as plt
line = np.flip(np.arange(0, 10))
dem = np.tile(line, (10, 1))我可以这样计算它的坡度和坡度:
x, y = np.gradient(dem)
slope = np.degrees(np.arctan(np.sqrt(x**2 + y**2)))
aspect = np.degrees(np.arctan2(x, -y))并把它想象成:
fig = plt.figure()
ax = fig.add_subplot(111, projection="3d")
y, x = np.mgrid[:10, :10]
ax.scatter(x, y, dem)
ax.set_title(f"Slope={np.mean(slope)}, Aspect={np.mean(aspect)}")

但我该怎么做呢?
我想要生成一个固定大小的空白2D Numpy数组,然后用一个已知的斜率和角度(从任意海拔开始,例如0)填充它。
发布于 2022-04-05 13:29:16
由于gradient的步长为1,所以用N点和给定的slope和offset绘制直线的一般公式是
slope * np.arange(N) + offset你所说的斜率是坡度的大小,作为一个角度。你所称的斜率是x方向和y方向的部分斜率,也是一个角度。你有以下非线性方程组:
np.tan(np.radians(slope))**2 = sx**2 + sy**2
np.tan(np.radians(aspect)) = -sx / sy幸运的是,您可以很容易地使用替换来解决这个问题:
p = np.tan(np.radians(slope))**2
q = np.tan(np.radians(aspect))
sy = np.sqrt(p / (q**2 + 1))
sx = -q * sy现在,您所需要做的就是取两行斜率sx和sy的外和。
dem = offset + sx * np.arange(NX)[::-1, None] + sy * np.arange(NY)下面是一个示例:
投入:
aspect = -30
slope = 45
offset = 1
NX = 12
NY = 15梯度:
p = np.tan(np.radians(slope))**2
q = np.tan(np.radians(aspect))
sy = np.sqrt(p / (q**2 + 1)) # np.sqrt(3) / 2
sx = -q * sy # 0.5结果:
dem = offset + sx * np.arange(NX)[::-1, None] + sy * np.arange(NY)
fig, ax = plt.subplots(subplot_kw={'projection': '3d'})
ax = fig.add_subplot(111, projection="3d")
ax.scatter(*np.mgrid[:NX, :NY], dem)

您的约定可能会被一个标志所忽略,您应该能够通过查看情节来轻松地解决这个问题。
https://stackoverflow.com/questions/71752250
复制相似问题