algorithm - 如何在风景上模仿水

标签 algorithm

我有一个双数组,其中包含每个“ block ”土地的地面高度和水高,我正在尝试创建一个函数 move_water() 来改变这个数组,以便重复调用该函数将模仿水沿着地形移动...

我的第一直觉是:

  • 对于每个街区,查看附近的其他 4 个街区并比较水位。
  • 将中间 block 的 1/2 水分配给其他 4 个 block (均匀分配,但前提是它们较低)。

虽然这并不是很好,但会产生一些奇怪的波浪模式,因为任何给定 block 上的水位似乎在 2 个值之间振荡

水的模拟不需要很完美,只要能流到最低点就可以了

最佳答案

既然你说它不一定是完美的,根据移动的水量定义的步骤更新可能不是问题 - 即使移动一半的水所需的时间会有所不同根据坡度和水量。它可能看起来仍然很奇怪,因此陡坡上的大量水的一半花费的时间与不太陡峭的斜坡上的少量水花费的时间相同。但您的方法可能仍有潜力。

我不清楚如果每次调用更新一个 block 或每次调用 move_water 更新所有 block ,我会假设它不只是一个,因为这看起来很奇怪。

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

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

如果您还没有这样做,您可能会发现考虑一维、平坦的地形、在开始时在方 block 中放置不同量的水会有所帮助 - 只是为了更容易弄清楚正在发生的事情。

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

关于algorithm - 如何在风景上模仿水,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46068271/

相关文章:

.net - 如何检测某个短语或正则表达式的 "typo"?

javascript - 如何执行符合我需要的 Javascript 对象递归搜索?

algorithm - 二维网格可达目的地

algorithm - 整数序列的最佳压缩算法

algorithm - 给定一个只包含0和1的矩阵,并且矩阵的每一行都已排序,请找出哪一行包含最多的1

c++ - 具有大值跨度的 double 组求和 : proper algorithm

python - python 中的直接列表分配 - 不插入

algorithm - 查找一个非常大的文件的 k-最大元素(当 k 非常大时)

python - 查找两个不同大小的数组的所有匹配项

java - 描述这棵树的最佳方式,如 UML 中的多项选择题/答案算法