【问题标题】:Partial Flood Fill部分洪水填充
【发布时间】:2019-08-22 13:06:36
【问题描述】:

我正在编写一个基于 voronoi 的世界生成器,我在其中区分山脉、湖泊、森林和海洋等地理特征。

每个特征都被赋予一个 id,以便可以识别和引用。我使用洪水填充算法来确定单元格属于哪些特征。

我发现了几个类似的情况,我想将一个功能拆分为多个较小的功能。最直接的例子是由一条狭长的森林连接的两个大森林。实际上,它应该被视为两片森林,在窄带周围彼此分开,但我的填充算法只是直接穿过并将所有内容标记为一个大森林的一部分。

我想最终将它们标记为“West 100 Acre Wood”和“East 100 Acre Wood”,让他们知道它们来自同一片连续的森林。我查找了部分洪水填充逻辑,但由于缺少主题术语,我的搜索卡住了。

如果您想查看我正在使用的代码: https://github.com/olinkirkland/map

【问题讨论】:

    标签: algorithm graph-theory theory geography flood-fill


    【解决方案1】:

    您通常会使用 “形态开口” see Wikipedia definition,这是一种形态腐蚀,然后是膨胀。如果您在黑色背景上想象一个感兴趣的白色前景对象,则腐蚀会侵蚀(蚕食掉对象的边缘),而膨胀会将边缘扩大/变胖 - 从而消除小条和狭窄的连接。

    您可以使用 Python 中的 Scikit-Image 模块或 Python 或 C++ 中的 OpenCV 来完成。我选择在终端的命令行中使用 ImageMagick 来完成,它安装在大多数 Linux 发行版上,可用于 macOS 和 Windows。

    所以,使用这张地图图片:

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

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

    【讨论】:

    • 请注意,如果省略两个-negate 运算符并将open 替换为close,则效果相同。
    • 注意这里有 Anthony Thyssen 对形态学的精彩介绍...imagemagick.org/Usage/morphology
    • 我不确定我是否理解如何将此逻辑应用于构成我的地图的 voronoi 多边形。
    • 嗯,我们似乎陷入了僵局,恐怕我在您的代码中看不到任何东西,例如图像或 Numpy 数组或任何我认识或可以使用的东西 - 我不知道甚至不知道.as.swc 文件是什么。我担心我们将不得不将我的答案作为我们无法实施的理论练习。抱歉,我们的世界相距太远 :-(
    • 没关系! .as 与 .js 非常相似;这是一个动作脚本文件。我真的很喜欢这个问题的各种答案,因为它展示了解决这个问题的完全不同的方法。我正在尝试尽可能地保留 voronois 的内容,以便以后可以完全访问点及其属性(以标记森林的边缘、空地等)
    【解决方案2】:

    找到连通区域后,您可以使用右手定则 (https://en.wikipedia.org/wiki/Maze_solving_algorithm#Wall_follower) 在内部进行追踪。

    要找到可以产生良好分割点的单像素路径,然后,您可以在此内部路径中查找被访问两次(每个方向一次)的像素。如果分割两侧的路径长度足够长,那么您可以在该像素处将区域一分为二,然后再尝试使用较小的区域。

    如果你想找到超过一个像素宽的分割点,或者确保两边的森林足够“结实”,我建议使用一种基于像素的方法,将其与其他方法相结合:

    1. BFS 去除距离边界小于 w 的像素。

    2. 找到每个剩余的连接区域。每个人都将成为森林的“中心”。

    3. 检查每个中心,确保其像素距离边缘足够远,可以成为森林的中心。

    4. 重新添加移除的像素,将它们连接到最近的中心。

    【讨论】:

    • 如果森林又长又窄(1 像素厚)呢?不会被标记为“拆分”吗?
    • 是的,我猜这些不太可能来自您的生成算法,但如果您需要检查,您可以在任一侧进行 BFS 以确保有一些像素距离边界足够远。如果要查找厚度超过 2 个像素的切割点,也可以从一开始的边界使用 BFS。
    • 当您执行此操作时,此答案开始看起来像其他答案。我会进行编辑
    • 我将使用这种方法,但使用 voronoi 点而不是像素。
    【解决方案3】:

    您可以使用图像处理中的一种技术,该技术使用模糊并应用 50% 的阈值。通过这种方式,细连接和尖峰减少,特征通常变得更圆,而对象的整体大小不应该在一个特定方向上发生变化。这是重复应用该过程的图像:

    Separation of forests by blurring and applying a threshold

    上面的图片代表了你的原始情况,两片森林由一条细长的走廊相连。该过程逐步移除走廊。

    您可以在此过程中调整一些参数,例如。 G。模糊半径和步数,因此您可以根据需要进行调整。

    【讨论】:

    • 我非常喜欢这种方法,因为它非常简单,但我不知道如何将它应用于我的 voronoi 多边形。整个过程需要在多边形级别上应用,而模糊更多是一种视觉解决方案。我可以将其作为叠加层并仅将森林重新应用到其下方的点,但我正在寻找一种无需依赖绘图即可实现的解决方案。
    • 您还可以通过拆分三角形并让生成的较小的三角形混合其邻居的颜色来模糊三角形网格(例如,请参阅i.imgur.com/6L6iT1M.png,阅读它的左上角→左下角,然后顶部-middle → bottom-middle,然后是右上角)但如果您认为这不适合您的情况,我可以理解。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多