这样就消除了递归实现中出现的棱锥角丢失问题。但在生成数组边界的点时还是会碰到这个问题。下图中,数组中构成棱锥角的位置用亮灰色表示。它们应该被平均以找出新的基本值,即图中黑色的点。 注意用黑色标记的两个值。它们实际上是相同的值。每次你在 square 步计算一个边界上的值时,记得同时把它保存在数组对面边上。
这意味着前面插图 e 中,我们实际上不必计算 12 个单独的值,因为其中的四个在数组相对的两条边上重复。实际上只有 8 个值需要计算。
感兴趣的读都可以练习一下:取出源代码并使用它在边界的值不重复时也能工作。这对算法正常工作是没有必要的,按我写的方式去做就成。
如果你还没运行过例子程序,现在或许是时候打开看看了。它从两次迭代生成的曲面开始。曲面是用线框绘制的,只是简单的将数组中的值用线段边接起来。数组中的值被当作 Y 值,而 X 和 Z 坐标是在数组分析时即时生成的。通过将一个方形分成两个三角形可以轻易的使用三角形绘制出这个曲面。三角形通常都是很好的图元,因为它总是凸性的平面。
用 View Opeions 对话框调节 RAndom seed 值。这会导致生成不同的曲面。调高 iterations 值给曲面增加细节。代码限制这个值到 10 ,这对于我 32M 内存的 PentiumPro 系统有点多,看起来是黑的(或许五年以后,人们会在新的处理器和更高分辨率的显示器上运行这个程序,会对我为什么将它限制到 10 十分奇怪的……)。
第一个 H 值控制表面粗糙度,默认值为 0.7 。试着设得更高或更低看看结果如何。
是的这个算法偶尔会产生局部尖刺或皱折。但我偏爱尖或皱折不明显依赖于观察角度或飞过它的速度这种超自然的效果。