
2.5 源码剖析
在“生成元.py”源码中同样自定义了三个函数,分别为Restore(p)、Get_point和Generator(A,B,L,gene,ratio,n),前面两个函数和“科赫曲线.py”源码中的函数相同。
第三个函数Generator(A,B,L,gene,ratio,n)除了采用生成元算法来生成曲线外,还采用统一计算、统一绘图的方式来生成曲线,从而提高了图形的生成效率。Generator(A,B,L,gene,ratio,n)函数共有6个参数,第1个参数A为起始点的海龟状态,即一个三元组(x,y,d);第2个参数B为结束点的海龟状态,同样是一个三元组(x,y,d);第3个参数L为线段AB的长度;第4个参数gene为生成元,可参看表2-1中不同生成元的列表值;第5个参数ratio为缩小率,可参看表2-1的值;第6个参数n为迭代次数。
在Generator(A,B,L,gene,ratio,n)函数的定义中,采用一个嵌套元组的列表来表示递归过程中所要递归的中间点(如科赫曲线的C、D、E点)的信息,以及最后要绘制生成的图形所包含的点的信息,其中,每一个点都使用一个三元组(x,y,d)来表示。开始时,要初始化这个结构为一个空列表:
points=[]
“生成元.py”源码中获取图形各个中心点的位置和方向,同样采用和“科赫曲线.py”源码中一样的笨办法,也就是用和背景色颜色相同的画笔在画布上画一遍生成元,在绘图过程中获取中间点的海龟状态并进行保存,最后将画笔颜色恢复原样,只是采用了读取生成元gene列表数据的方式来进行绘图:

接下来,Generator(A,B,L,genu,ratio,n)函数开始递归调用自身,和“科赫曲线.py”源码不同,这里调用的次数不是4次,而是要依据传入的生成元gene的数据而定,比如生成元1和科赫曲线一样,都是递归调用自身4次,而生成元2递归调用自身的次数是9次。
同样,只有当迭代次数为1时,才真正地绘制图形:

这里采用的是Turtle模块中的Setpos函数直接将列表points中的点用画笔连接起来。而当迭代次数不为1时,就使用保存在points列表中的中间点的信息,使用生成元替换中间线段:

可以看到,Generator函数中的L*ratio是逐层缩小的,直到n-1等于1时才结束。比如科赫曲线,在递归第一层时,L*ratio等于L/3;向下分解到第二层时,L*ratio=(L/3)/3等于 L/9;以此类推,层层分解、缩小,直到到达迭代次数,所以,ratio 这个参数被称为缩小率。