kaka 发表于 2017-7-12 11:34:02

趣味编程指南(8-2)-自定义函数与分形递归

本帖最后由 kaka 于 2017-8-18 08:27 编辑

好久没更新了,最近事情太多
这次来谈分形
分形

现在你可以通过递归函数探索另一个魅力无穷的世界 - 分形。


分形(Fractal),又称碎形、残形,通常被定义为“一个粗糙或零碎的几何形状,可以分成数个部分,且每一部分都(至少近似地)是整体缩小后的形状”,即具有自相似的性质。自然界中就能看到许多分形。



现在,相信你对分形已经有些直观的印象了。在程序中设计分形图形相当简单。通过递归你可以用极简的法则创造出丰富的细节。参看下面例子代码示例(8-8):void setup() {
      size(400, 400);
    }

    void draw() {
      background(255);
      translate(width/2, height/2);
      recursion(200, 0);
    }

    void recursion(float r, int num) {
      if (r > 10) {
      if (r > 30) {
          noFill();
          stroke(0);
      } else {
          fill(0);
      }
      float ratio = mouseX/(float)width;
      if (ratio > 0.6) {
          ratio = 0.6;
      }
      r = r * ratio;
      num ++;

      // 绘制中心矩形
      rectMode(CENTER);
      rect(0, 0, r * 2, r * 2);

      // 绘制四周矩形
      pushMatrix();
      rotate(millis()/1000.0 * num);
      translate(-r, -r);
      recursion(r, num);
      popMatrix();

      pushMatrix();
      rotate(millis()/1000.0 * num);
      translate(-r, r);
      recursion(r, num);
      popMatrix();

      pushMatrix();
      rotate(millis()/1000.0 * num);
      translate(r, -r);
      recursion(r, num);
      popMatrix();

      pushMatrix();
      rotate(millis()/1000.0 * num);
      translate(r, r);
      recursion(r, num);
      popMatrix();
      }
    }


[*]在一个递归函数的函数中,函数是可以调用多次的。上面的示例就调用了四次,从而创造了多重分支
[*]图形的繁复程度之所以是动态的。是因为用鼠标的横坐标控制了 ratio 的比例。“ ratio = mouseX/(float)width ”。ratio 的值越大,r 值的递减速度就越慢,所以递归的次数会增多,图形数量也会增多
[*]ratio 之后添加的一个判断,if(ratio > 0.6){ratio = 0.6;} 是为了让 ratio 的值不超出 0.6。避免程序因为绘制的图形过多而发生崩溃。
[*]rotate 可以用注释符隐藏,能更清晰地看见整体的枝干结构。变量 num 的作用是记录当前递归的次数。最终通过 num 影响旋转的速度。可以看到递归的次数越多,方块的旋转速度越快
[*]


转自www.inslab.cn

wuxing0911 发表于 2017-8-29 11:41:02

没有了吗?后期还会有教程吗?还没看过瘾就没啦
页: [1]
查看完整版本: 趣味编程指南(8-2)-自定义函数与分形递归