趣味编程指南(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
没有了吗?后期还会有教程吗?还没看过瘾就没啦
页:
[1]