现在绘制3条Koch曲线就构成了Koch雪花。
 kochCurve(x0, y0, angle, length, n);
 x0 += length*cos(angle);
 y0 += length*sin(angle);
 angle -= pi*2/3;
 kochCurve(x0, y0, angle, length, n);
 x0 += length*cos(angle);
 y0 += length*sin(angle);
 angle -= pi*2/3;
 kochCurve(x0, y0, angle, length, n);
下一次的迭代同样要用到这样的方法,所以我们可以把这些代码放倒kochCurve函数中。于是kochCurve成了一个递归函数。
为了控制递归的深度,我们需要给kochCurve添加一个参数n。
void kochCurve(double x0, double y0, double angle, double length, int n)
{
 if(n == 0) {
 double x1 = x0 + length*cos(angle);
 double y1 = y0 + length*sin(angle);
 glBegin(GL_LINES);
 glVertex2d(x0, y0);
 glVertex2d(x1, y1);
 glEnd();
 }
 else {
 length /= 3;
 n --;
 kochCurve(x0, y0, angle, length, n);
 x0 += length*cos(angle);
 y0 += length*sin(angle);
 angle += pi/3;
 kochCurve(x0, y0, angle, length, n);
 x0 += length*cos(angle);
 y0 += length*sin(angle);
 angle -= pi*2/3;
 kochCurve(x0, y0, angle, length, n);
 x0 += length*cos(angle);
 y0 += length*sin(angle);
 angle += pi/3;
 kochCurve(x0, y0, angle, length, n);
 }
}
n是函数递归的层数,也是Koch曲线迭代的次数。
kochCurve(x0, y0, angle, length, 0)画出的是初始的图形
kochCurve(x0, y0, angle, length, 1)画出第一次迭代
下面是n = 2, 3, 4, 5的结果。
这里用线段的起点(x0, y0),方向(和正向x轴之间的角度)及长度来描述一条线段。
绘制一条从(-1.0, 0.0)到(1.0, 0.0)的Koch曲线用下面的方法:
 double length = 2.0;
 double angle = 0.0;
 double x0 = -1.0;
 double y0 = 0.0;
 kochCurve(x0, y0, angle, length);
一条Koch曲线是由4条比例缩写为整体1/3的Koch曲线组成。
 length = 2.0/3;
 kochCurve(x0, y0, angle, length);
 x0 += length*cos(angle);
 y0 += length*sin(angle);
 angle += pi/3;
 kochCurve(x0, y0, angle, length);
 x0 += length*cos(angle);
 y0 += length*sin(angle);
 angle -= pi*2/3;
 kochCurve(x0, y0, angle, length);
 x0 += length*cos(angle);
 y0 += length*sin(angle);
 angle += pi/3;
 kochCurve(x0, y0, angle, length);
这样就画出了第一次迭代的结果。
理论上说,Koch曲线是由无数无限短的线段组成。绘图的时候当然不可能画出无限短的线段。所以我们根据要求,用若干线段组成。
首先,绘制构造Koch曲线的初始图形,也就是一条直线。
void kochCurve(double x0, double y0, double angle, double length)
{
 double x1 = x0 + length*cos(angle);
 double y1 = y0 + length*sin(angle);
 glBegin(GL_LINES);
 glVertex2d(x0, y0);
 glVertex2d(x1, y1);
 glEnd();
}
                                        
                                      2019-07-17 22:55:22