gpt4 book ai didi

c# - 我用于检查某物是否与点相邻的算法存在问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:16:54 24 4
gpt4 key购买 nike

作为我正在进行的项目的一部分,我想将含水的图 block 分为“海洋”和“湖泊”。这是通过首先找到 map 边缘的所有水瓷砖并将它们指定为“海”瓷砖来完成的。所有与海洋板 block 相邻(没有对角线)的水板 block 也是海洋板 block 。所有其他水砖都是“湖”砖。

我找到第一个海图 block (在板的边缘)的方法完美无缺。然而,我寻找其他海图 block 的方法经常漏掉应该是海图的大矩形区域。代码如下:(seed是一个 bool 数组,其中true是陆地,false是水,seas是另一个 bool 数组,其中 true 是海瓷砖而 false 不是)

for (int x = 0; x < length; x++)
{
for (int y = 0; y < height; y++)
{
if (!seed[x, y])
{
if (x + 1 < length && seas[x + 1, y])
seas[x, y] = true;
else if (x - 1 >= 0 && seas[x - 1, y])
seas[x, y] = true;
else if (y + 1 < height && seas[x, y + 1])
seas[x, y] = true;
else if (y - 1 >= 0 && seas[x, y - 1])
seas[x, y] = true;
}
}
}

我这辈子都找不到这段代码中的拼写错误,也许新的一双眼睛会有所帮助?

我的代码的下一步是找到所有不是海洋瓷砖的水瓷砖并将它们指定为湖泊瓷砖。这是通过以下代码片段完成的:(seasseed 与上面相同,lakes 是一个 bool 数组,其中 true 是湖泊瓷砖而 false 不是)

for (int x = 0; x < length; x++)
{
for (int y = 0; y < height; y++)
{
if (!seed[x, y] && !seas[x, y])
{
lakes[x, y] = true;
}
}
}

这是另一个可能的错误来源,但我又一次不知道它是如何被破坏的。

附件是根据生成的三个 bool 数组生成的图像。绿色是陆地板 block ,蓝色是海洋板 block ,浅绿色(或浅蓝色)是湖泊板 block 。如您所见,海域附近有大片水域,应该也是海域,但实际上是湖域。 A broken map

提前谢谢你。

最佳答案

作为一个困惑的数学解决方案,您可以重复第一个代码块 N 次(其中 N 等于您的 length 变量可能 N-1 次,因为您在第一次进行 +-1 检查).原因是您可能会跳过一些其邻居尚未标记但稍后会标记的图 block 。所以你必须稍后再回来检查它的邻居是否被标记。显然有更多的优化方法需要更少的过程。

for (int z=0;z < length; z++){

for (int x = 0; x < length; x++)
{
for (int y = 0; y < height; y++)
{
if (!seed[x, y])
{
if (x + 1 < length && seas[x + 1, y])
seas[x, y] = true;
else if (x - 1 >= 0 && seas[x - 1, y])
seas[x, y] = true;
else if (y + 1 < height && seas[x, y + 1])
seas[x, y] = true;
else if (y - 1 >= 0 && seas[x, y - 1])
seas[x, y] = true;
}
}
}
}

关于c# - 我用于检查某物是否与点相邻的算法存在问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37123159/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com