三维随机分形地形生成(10)
时间:2025-02-21
时间:2025-02-21
早先还到过用迭代实现这个例程比递归好。原因是:一个递归实现可能翻采用如下形式:
执行 diamond 步;
执行 square 步;
减小随机数范围
调用自己四次。
这是个很简洁的实现,而且毫无疑问它能工作。但它要求用不充足的数据生成某些点。为什么呢?经过第一遍之后,你将再次调用以执行 square 步,但这时并没有一个棱锥四个角的全部数据。 与之相反,我用个迭代实现,伪码如下:
当 square 边长度大于 0 时{
遍历数组,对每个正方形表达执行 diamond 步
遍历数组,对每个棱锥表达执行 diamond 步
减小随机数范围
}
这样就消除了递归实现中出现的棱锥角丢失问题。但在生成数组边界的点时还是会碰到这个问题。下图中,数组中构成棱锥角的位置用亮灰色表示。它们应该被平均以找出新的基本值,即图中黑色的点。
注意用黑色标记的两个值。它们实际上是相同的值。每次你在 square 步计算一个边界上的值时,记得同时把它保存在数组对面边上。
这意味着前面插图 e 中,我们实际上不必计算 12 个单独的值,因为其中的四个在数组相对的两条边上重复。实际上只有 8 个值需要计算。
感兴趣的读都可以练习一下:取出源代码并使用它在边界的值不重复时也能工作。这对算法正常工作是没有必要的,按我写的方式去做就成。