【问题标题】:Identifying lakes in a bit mask in JavaScript在 JavaScript 中使用位掩码识别湖泊
【发布时间】:2012-12-17 17:50:43
【问题描述】:

我有一个使用单纯形噪声生成“大陆”的算法,因此它会生成高度图,当像素/图块高于某个水平时,它将被识别为陆地,否则为水。

我遇到的问题是有时陆地会包围低于海平面的部分。我希望能够识别这些区域,因为它们不是海洋,而是陆地或湖泊。

所以后面的0代表水,1代表土地:

000000000
001110100
011111110
011001110
001101100
001111000
000000000

中间的 3 个 0 将被识别为非海。

我熟悉洪水填充算法。所以我可以做到的一种方法是遍历随机点,如果我找到水,则使用洪水填充,如果它超过一定大小,那么它将是大海。然后,一旦识别出海洋,我就可以通过并识别非海洋水体。

这似乎效率低下,因为我必须处理比加载区域更大的区域,否则它会错误地将区域识别为非海洋。

有没有更好的办法?

【问题讨论】:

  • 你对 watersea 的使用让我很困惑。话虽如此,您从未提到该位图中的10 代表什么
  • 在检查方块的边界时必须加载相邻的方块似乎并不是一个容易避免的问题。
  • Alex 我已经澄清了 1 和 0。水覆盖世界,最大的水体是大海。
  • airza 你可能是对的,如果有其他解决方案来解决这个问题还是很高兴
  • 能否先生成没有湖泊的大陆,然后再随机挖掘湖泊?

标签: javascript algorithm flood-fill


【解决方案1】:

您提到您已经熟悉洪水填充。为什么不从地图边缘进行洪水填充以获得大海?任何没有从边缘泛滥的水体都将成为湖泊。

【讨论】:

  • 土地可能出现在地图的边缘。对不起,我会提供一张照片,但它不允许我。
  • @user1494801:但是土地不能出现在地图的每个边缘像素上,因为如果出现了,那么就不会有海——任何水都将成为其中的一部分或更多湖泊!因此,找到所有非陆地边缘像素并从每个像素中进行填充。
  • 是的,但湖边有可能会出现。我要说的是边缘像素并不比任何其他像素/图块更特别
  • @user1494801:如果边缘的水可以是湖,你如何确定海是什么? :) 在任何人想出一种算法来对水进行分类之前作为大海或湖泊,你需要想出一个清晰的定义哪个是哪个。
【解决方案2】:

您只想计算所有0 单元格的connected components。最大的组成部分是海,任何其他组成部分都是湖泊。这可以在线性时间内完成(请参阅链接页面的算法部分)。

【讨论】:

    猜你喜欢
    • 2021-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-17
    • 2023-03-07
    相关资源
    最近更新 更多