2.2.5 迭代函数系统

科学家发现,通过简单的计算过程,可获得出人意料的复杂视觉图形。借助stdrandom、stddraw和stdarray模块,我们可以方便地研究这种系统的行为。

1. 谢尔宾斯基三角形(Sierpinski triangle)

作为第一个例子,我们考虑如下简单过程:一开始,在给定等边三角形的一个顶点绘制一个点;然后在三个顶点中随机选择一个顶点,并在前一个绘制点与随机选择的顶点之间连线的中点位置绘制一个点。重复上述过程。每次循环过程,均随机从三角形的顶点中选择一个,并将前一个连线的中点作为下一个绘制点。因为每次的选择都随机,所以绘制的点应该具有随机点的某些特征。通过若干次迭代后,其结果如图2-2-6所示。

图2-2-6 随机过程

为了研究上述过程的大量迭代结果,可编写如下脚本代码,以遵循指定规则绘制n个点:

我们使用数组cx[]和cy[]分别存储三角形顶点的x坐标和y坐标。使用stdrandom.uniformInt()函数从这些数组中随机选择一个索引下标r,即随机选择的顶点坐标为(cx[r],cy[r])。从点(xy)到随机选择的顶点之间线段的中点的x坐标为:(x + cx[r])/2.0,类似的计算表达式可计算y坐标。通过调用stddraw.point()函数,并将该代码放置在循环中可完成实现。值得注意的是,尽管过程具有随机性,但经过大量的迭代后,最终的形状大致相同!这种形状称为“谢尔宾斯基三角形”(具体参见2.3节习题第27题),如图2-2-7所示。理解为什么这样一个随机过程会产生一个如此有规则的图形是一个有趣的问题。 ...

Get 程序设计导论:Python语言实践 now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.