Algorithm 如何在景观上模仿水

Algorithm 如何在景观上模仿水,algorithm,Algorithm,我有一个双数组,包含每个“地块”的地面高度和水面高度,我正在尝试创建一个函数move\u water(),该函数将对该数组进行变异,以便重复调用该函数将模拟水沿地形移动 我的第一反应是: 对于每个区块,查看附近的4个其他区块,并比较水位 将1/2的水从中间块注入其他4块(均匀分开,但仅当它们较低时) 但这并不是很有效,而且会产生一些奇怪的波形,因为任何给定区块的水位似乎在2个值之间振荡 水的模拟不一定要完美,我只想让它流到最低点,因为你说它不一定要完美,按照移动了多少水的步骤进行更新,这可能

我有一个双数组,包含每个“地块”的地面高度和水面高度,我正在尝试创建一个函数
move\u water()
,该函数将对该数组进行变异,以便重复调用该函数将模拟水沿地形移动

我的第一反应是:

  • 对于每个区块,查看附近的4个其他区块,并比较水位
  • 将1/2的水从中间块注入其他4块(均匀分开,但仅当它们较低时)
但这并不是很有效,而且会产生一些奇怪的波形,因为任何给定区块的水位似乎在2个值之间振荡


水的模拟不一定要完美,我只想让它流到最低点,因为你说它不一定要完美,按照移动了多少水的步骤进行更新,这可能不是问题——即使一半的水移动所需的时间会因坡度和水量的不同而不同。因此,陡坡上一半的大量水与不太陡坡上的少量水花费的时间相同,这看起来可能仍然很奇怪。但是你的方法仍然有潜力

虽然我不清楚,如果你每次调用都更新一个区块,或者每次调用都更新所有区块来移动水,我将假设这不仅仅是一个区块,因为这看起来很奇怪

假设您处理了所有的块,您的规则将根据处理块的顺序给出不同的结果。如果你只是按照增加x坐标的顺序处理它们,我可以想象为什么你会看到非自然波(一个较低的块可以从另一个块获得,然后给另一个块,然后再次获得)。另一方面,如果先处理最高点,或按最高高差的顺序处理,则可能会得到更好的结果

你需要考虑陆地和水的高度组合,我建议试着移动一半的高度差,而不是总水量的一半。

如果你还没有做到这一点,你可能会发现考虑1个维度,平坦的地形,在块中放置不同数量的水来启动,这有助于更容易地了解正在发生的事情。


最后,如果你的意思是向上、向下、向左和向右移动,而没有水沿对角线移动,那么仅仅将水移动到周围的4个街区看起来会有点奇怪。一旦你的水流在一维上运行良好,考虑到2D情况下的所有8个附近的块(假设块是在矩形网格中)

< P>如果你不关心侵蚀或水源的位置,那么我会用你从你那里得到的简单的解决方案。你必须从你的景观中构建一个一维阵列,在获得新的平均值(见我的答案)后,你运行二维阵列并调整低于该平均值的高度。

你想让水在某个时间点停止流动吗?我认为波浪是现实的,但不确定你是否想要波浪。也许你可以通过给其他4个街区的最大(!)1/2的水来解决这个问题。如果
otherblocks.waterlevel+newWater>currentblock.waterlevel-newWater
,则只需将它们相等即可。对于“真实”模拟,您还需要考虑水流速度(假设水流速度仅为垂直)。显示代码。