分形树的绘制运用了递归的思想。绘制分形树有两点:树枝长度和下一次画树枝时偏转的角度。
1.树枝长度:先定义树干初始长度 len, 树枝的长度每次在原来的基础上乘以0.66 ,绘出树枝的终止条件是树枝长度len <=2。
2.树枝旋转的角度:角度 theta随着音乐频率大小的改变而改变。每次绘制完树枝时,画笔右转 theta 度,(theta 的大小对应音乐频率的大小二变化)。
具体过程如下:
先定义树干初始长度 len, 每次绘制完树枝时,画笔右转 theta度,绘制下一段树枝时,树枝的长度每次在原来的基础上乘以0.66 ,绘出树枝的终止条件是树枝长度len <=2 。达到终止条件后,画笔再左转 theta 度,绘制树枝, 再右转 theta 度,这时就回到了原来的方向,退回上一个节点,再左转、绘制、右转恢复原方向......按这样的步骤一直重复下去,直到回退到根节点。
代码如下:
import ddf.minim.analysis.*;
import ddf.minim.*;
PImage img;
Minim minim;
AudioPlayer music;
FFT fft;
float theta;
float h;
void setup()
{
size(1160, 720);
img=loadImage("beiing.png");
minim = new Minim(this);
music= minim.loadFile("music.mp3", 1024);
music.loop();
fft = new FFT(music.bufferSize(),music.sampleRate() );
}
void draw(){
background(0,0,0);
image(img,0,0 );
fft.forward(music.left);
stroke(255);
noFill();
for(int i=0;i<480;i+=2){
h=fft.getBand(i)*10;
theta=map(h,0,width,0,PI/2);
translate(width/2,height);
strokeWeight(3);
branch(160);
}
}
void branch(float len){
line(0,0,0,-len);
translate(0,-len);
len*=0.66;
if(len>2){
pushMatrix();
rotate(theta);
branch(len);
popMatrix();
pushMatrix();
rotate(-theta);
branch(len);
popMatrix();
}
}
效果如下:(因为无法上传自己录制的视频,所以给大家在视频中截了几张图附上)