资讯动态

程序化河网的D8流向:坡度、洼地与出水口别混成一件事

发布时间:2026/10/25 14:54:21 来源:尧图企业网站定制
给每个格子找一个更低的邻居似乎就能画出河流。但如果只比较高度差斜向邻居会占便宜如果地形里存在封闭洼地水也不会凭算法的名字自动流进海洋。先把流向、积水和出水边界分开才能讨论河网是否合理。下面先验证D8的局部流向规则后续再扩展到填洼和流域边界。比较高差除以距离正交邻居距离是一格对角距离是根号二格。单位格长相同时坡降应计算为(当前高度-邻居高度)/距离。没有正坡降返回“无下游”而不是随意选一个方向。平地会带来额外问题严格下降策略可能把整片平台当成终点允许等高随意流又可能构成环。处理平地、填洼和切穿出口都需要独立策略不宜藏在D8函数的注释里。流向有了流量仍需守恒每格初始雨量给定后沿无环下降图向下游累加。若采用拓扑推进处理计数应等于参与格子数少处理一部分可能存在未被解释的平地环或无效索引。跨地形块时块边界不是天然海岸。离开当前块的水需要进入邻块或显式外部出口否则边界会莫名其妙吞水。导航系统也不能只看河流好看Recast这类导航工具需要根据实际几何和角色通行条件生成可走区域。一个邻域足以检查方向约定下面只查一个3×3邻域x向右、y向下。返回绝对格子坐标方便与数组索引核对。第二个输入是封闭低洼应该明确返回None而不是编出一条河。D8需要按实际邻居距离计算坡降封闭洼地与指定出水口是不同的边界条件。把关键规则缩成一个可运行例子下面使用 Python 3 标准库表达算法规则保存为example.py后运行python3 example.py。它便于观察输入和输出不替代引擎中的 C、Shader 或模型实现。from math import hypot def downstream(grid, x, y): best, best_slope None, 0.0 for dy in (-1, 0, 1): for dx in (-1, 0, 1): if not (dx or dy): continue nx, ny x dx, y dy if 0 ny len(grid) and 0 nx len(grid[0]): slope (grid[y][x] - grid[ny][nx]) / hypot(dx, dy) if slope best_slope: best, best_slope (nx, ny), slope return best grid [[8, 8, 8], [8, 10, 8], [8, 8, 7]] assert downstream(grid, 1, 1) (2, 2) assert downstream([[9,9,9],[9,1,9],[9,9,9]], 1, 1) is None print(diagonal slope normalized; closed sink retained)本例输出diagonal slope normalized; closed sink retained河网生成不需要一开始就承诺复现真实流域。先列明雨量、地形尺度、出口和洼地政策再用流量平衡与连通性测试判断实现是否符合自己的模型。侵蚀、泥沙和地貌可信度应在另一组试验里讨论。适用范围未实现填洼、真实降雨、侵蚀或流域校准代码只检查局部流向与低洼返回值。相关资料Recast Navigation官方仓库

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑