algorithm - 部分洪水填充

标签 algorithm graph-theory theory geography flood-fill

我正在编写一个基于 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 图像:

enter image description here

我加载它,反转/否定它使森林变白,然后应用我提到的形态学开口,然后反转并保存:

magick convert map.png -negate -morphology open disk:5 -negate result.png 

enter image description here

关于algorithm - 部分洪水填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55453880/

相关文章:

algorithm - Levenshtein Automata 和 Damerau-Levenshtein 距离算法有什么区别?

algorithm - 比较不同大小的图形的好方法?

javascript - RegExp 等价于 array.indexOf( str )

algorithm - 卡在B树的形成算法中,具体算法是什么?

java - 使用哈希表和/或尝试的 Anagram 算法

python - 从不同位置的管道排出的液体体积

algorithm - 哪种数据结构最适合代表三人棋盘?

c# - 在城市使用公共(public)汽车的公共(public)交通

正则表达式 (a?)* 不是指数?

sql-server-2005 - SQL Server 架构有什么好处?