开发者社区> 问答> 正文

递归写Koch雪花的算法

递归写Koch雪花的算法

展开
收起
知与谁同 2018-07-19 11:17:09 1519 0
1 条回答
写回答
取消 提交回答
  • 现在绘制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:19
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
数据+算法定义新世界 立即下载
袋鼠云基于实时计算的反黄牛算法 立即下载
Alink:基于Apache Flink的算法平台 立即下载