2017-09-06 45 views
0

我有一个双数组,包含地块的高度和每块地块的水高度,我试图创建一个函数move_water(),它会改变这个数组,使得重复调用该功能会模仿水顺着地势移动...如何在风景上模仿水

的我的第一反应是:

  • 对于每个块,看看附近的其他4块和比较水位。
  • 从中间的水块中取1/2的水到其他4个块(均匀分开,但只限于较低的时候)。

这并没有真正很好地工作,但并创造一些奇怪的电波模式为任何给定的块上的水位似乎2个值

之间振荡水模拟并不一定是完美的,我只是想让它流向最低点

+0

你想让水在某个时间点停止流动吗?我认为浪潮是现实的,但不确定你是否想要它们。 – anatolyg

+0

也许你可以通过给予max(!)1/2水来修复其他4个街区。如果'otherblocks.waterlevel + newWater> currentblock.waterlevel - newWater'就等于它们。 – CFrei

+0

对于“现实”的模拟,您还需要考虑水的流速*(假定它只是垂直的)。 – meowgoesthedog

回答

1

既然你说它不一定是完美的,按照多少水已经移动定义的步骤更新可能不是一个问题 - 即使数量一半的水需要移动的时间将根据坡度和水量而变化。它仍然看起来很奇怪,因此陡坡上的大量水的一半需要的时间与较小坡度上的较少量相同。但是你的方法可能仍然有潜力。

它对我来说不是很清楚,但是如果每次调用更新一个块或者每次调用move_water时都更新一个块,我将假设它不仅仅是一个,因为这看起来很奇怪。

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

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

如果您还没有做到这一点,您可能会发现考虑1维,平坦地形,在块中放入不同数量的水有助于开始 - 只是为了更容易地计算出发生的情况。

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

0

如果您不关心侵蚀或源水的位置,然后我会用你从last question得到的简单解决方案。你必须从你的风景建立一个一维数组,并且在你得到新的含义之后(请参阅我的答案),通过二维数组运行并调整低于平均值的高度。