参考前五幅插图,下图示意了使用我们的 diamond-square 算法两次经过数组时发生的情况。 对于第一遍经过 diamond 步时,我们依据四个角的值在数组中心生成一个值。我们平均四个角的值(如果种子值相等则完全没必要),并加上一个 -1.0 到 1.0 之间的随机值。在插图 b 中,新值显示成黑色,已经存在的点显示为灰色。
对于 square 步,我们在相同的范围内生成随机值。这一步时有四个棱锥;他们在数组中心相交,这样我们计算四个 diamond 中心。 diamonds 的角被平均以找出新值的基数。插图 C 用黑色显示新值,现存值为灰色。
以上是第一遍,如果用线将这 9 个点边起来,就可以得到一个线框的表面,看起来就象:
现在进行第二遍。再次从 diamond 步开始。第二遍与第一遍有两点不同。首先,我们现在有四人四边形面不是一个,因此我们得计算四个方面的中心。其次,这是关键,生成随机数的范围已经被减小了。因为例子的缘故,让我们认为正在使用一个 H=1.0 的值。这将把我们的随机数取值范围将从 (-1.0,1.0) 到 (-0.5,0.5) 。在插图 D 中,我们这一步计算得到的四个正方形中心值显示为黑色。
最后,我们进行第二遍的 square 步。有 12 个棱锥中心,我们现在需要计算 12 个新值,如图 e 中黑色所示。
现在数组中全部 25 个元素都已经生成。我们可以得到如下的线框曲面。
如果分配更大的数组,我们可以进行更多遍,每一遍加入更多细节。例如, 5 遍之后表面看起来如下所示:
前面提到过,数组维数需要为 2 的整数次方加 1 。这是因为 2D 数组中的浮点数必须等于 (2n+1)2 。 8 次迭代将需要一个 257X257 的浮点数组,对于标准的 32 位 IEEE 浮点数来说超过 256K 内存。
好了,它就是这么大。用 char 取代 floats 会有所帮助。例子程序使用 floats ,但你要真的关注内存使用那么使用 char 。修改例子使用之使用 -128 到 128 的范围是很容易的,但别忘了将你生成的值限定在 -128 到 128 范围里,子序列通过时会生成该范围以外的值,这会导致溢出。这在使用较小的 H 时尤其可能。
例子程序演示了处理尺寸的另外一种方法。用一个大数组依据 diamond-square 算法进行定位及拼嵌。然后从平行投影体顶视图进行绘制。这个图像被读回来并用作已经拼嵌成较小范围的第二个数组上的纹理图。然而,例子程序并没有这样做,一但图像从帧缓冲读回,第一个数组就被释放了。