现在绘制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