递归写Koch雪花的算法-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

递归写Koch雪花的算法

知与谁同 2018-07-19 11:17:09 600
递归写Koch雪花的算法
算法
分享到
取消 提交回答
全部回答(1)
  • 知与谁同
    2019-07-17 22:55:19
    现在绘制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();
    }
    0 0
人工智能
使用钉钉扫一扫加入圈子
+ 订阅

了解行业+人工智能最先进的技术和实践,参与行业+人工智能实践项目

推荐文章
相似问题
推荐课程