我正在编写一个基于 voronoi 的世界生成器,我在其中区分山脉、湖泊、森林和海洋等地理特征。
每个功能都有一个 ID,以便识别和引用。我使用洪水填充算法来确定单元格属于哪些特征。
我已经意识到几个类似的案例,我想将一个功能拆分成多个较小的功能。最直接的例子是两片大森林由一条狭窄的森林带相连。实际上,它应该被视为两片森林,在窄带周围彼此分开,但我的填充算法直接穿过并将所有内容标记为一个大森林的一部分。
我想最终给它们贴上“West 100 Acre Wood”和“East 100 Acre Wood”的标签,让它们知道它们来自同一片连续的森林。我查找了部分泛洪填充逻辑,但由于缺少主题术语,我的搜索停滞不前。
如果您想查看我正在使用的代码: https://github.com/olinkirkland/map
最佳答案
您通常会使用“形态学开口” see Wikipedia definition这是一种形态学腐 eclipse ,然后是膨胀。如果您想象黑色背景上有一个感兴趣的白色前景物体,腐 eclipse 将侵 eclipse (蚕食其边缘)物体,而膨胀将扩大/加厚边缘 - 从而去除小 strip 和狭窄的连接。
您可以使用 Python 中的 Scikit-Image 模块,或者使用 Python 或 C++ 中的 OpenCV 来完成。我选择使用 ImageMagick 在终端的命令行中执行此操作,它安装在大多数 Linux 发行版上并且适用于 macOS 和 Windows。
因此,使用这张 map 图像:
我加载它,反转/否定它使森林变白,然后应用我提到的形态学开口,然后反转并保存:
magick convert map.png -negate -morphology open disk:5 -negate result.png
关于algorithm - 部分洪水填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55453880/