L-System分形
部分与整体以某种形式相似的形称为分形。即部分以相同的函数、不同某些变量以某中确定的规则不断迭代或递归所画出整体的图形。
下面是分形的几个经典例子。
※※神奇的色子※※
1.平面上随机选A,B,C三个点。再随机选一个点记为P。
2.有一个三面色子每丢一次则选中ABC三个中一点。
开始游戏
1.重复丢色子如果选中A则取A和P的中点P1画黑
2.如果选中B则取B和P1的中点P2画黑
3.如果选中A则取A和P2的中点P3画黑
4….一直重复(如每点一下鼠标丢10000次色子。
思路为画图面板添加鼠标监听器方法在鼠标释放的时候获取坐标值。收集上诉四个点的坐标值其中前三个点分别为ABC第四点位P。以一个0到2的随机数来确定ABC选中的点。每次计算选中点和P的中中点以该中点替代P点。迭代。
public void mouseReleased(MouseEvent e) {
if(djf.buttonText().equals("色子")){
if(count0){//第一次释放鼠标时获得A点坐标
x1e.getX();
y1e.getY();
count;
}else if(count1){//第二次释放鼠标时获得B点坐标
x2e.getX();
y2e.getY();
count;
}else if(count2){//第三次释放鼠标时获得C点坐标
x3e.getX();
y3e.getY();
count;
}else if(count3){//第四次释放鼠标时获得P点坐标
xpe.getX();
ype.getY();
for(int i0;i<100000;i){//迭代100000次
Random rnew Random();
int nr.nextInt(3);
switch(n){
case 0://选中A点
xp(x1xp)/2;
yp(y1yp)/2;//取AP中点替代P点
g.setColor(new Color(yp/3,yp/4,yp/64));
g.drawLine(xp, yp, xp, yp);//画出该点
break;
case 1://选中B点
xp(x2xp)/2;
yp(y2yp)/2;//取BP中点替代P点
g.setColor(new Color(yp/3,yp/4,yp/64));
g.drawLine(xp, yp, xp, yp);//画出该点
break;
case 2://选中C点
xp(x3xp)/2;
yp(y3yp)/2;//取CP中点替代P点
g.setColor(new Color(yp/3,yp/4,yp/64));
g.drawLine(xp, yp, xp, yp);//画出该点
break;
}
}
count;
}else if(count4){
x1y10;
x2y20;
x3y30;
count0;
}
}
效果图如下
※※美丽的窗花※※
迭代函数如下(注意sign为符号函数)
X(n1)Y(n)-sign(X(n))|bX(n)-c|^(1/2)
其中a1b4c60
public void chuanghua(){
xx1;
yy1;
double x2;
double y2;
double a1;
double b4;
double c60;
for(int j0;j<2000000;j){
x2y-Math.signum(x)*Math.sqrt(Math.abs(b*x-c));
y2a-x;
xx2;
yy2;
if(j%30){
g.setColor(Color.red);
}
if(j%31){
g.setColor( Color.green);
}
if(j%32){
g.setColor( Color.blue);
}
g.drawLine((int)(x)300,(int) (y)250,(int)(x)300,(int) (y)250);
}
}
}
效果图如下
若把系数稍作修改则得到如下截然不同的图形
doublea0.4;
doubleb1;
doublec0;
※※逼真的树叶※※
http://paulbourke.net/fractals/ifs_fern_a/
好多图形都有迭代公式。比如
以下是系数的选取。共有四组每组取到的概率不相等分别为0.01,0.07,0.07,0.85。以一个0到99的随机数指示取到的组别。
public void shuye(){
double a,b,c,d,ee,f;
double x5,y5,x520,y520;
for(int i0;i<200000;i){
Random rrnew Random();
int rrr.nextInt(100);
if (r0){
a0;
b0;
c0;
d0.16;
ee0;
f0;
}else if (r>17) {
a0.2;
b-0.26;
c0.23;
d0.22;
ee0;
f1.6;
}else if (r>8 14) {
a-0.15;
b0.28;
c0.26;
d0.24;
ee0;
f0.44;
}else{
a0.85;
b0.04;
c-0.04;
d0.85;
ee0;
f1.6;
}
x5a*x52b*y52ee;
y5c*x52d*y52f;
int tempx-(int)(x5*50)300;
int tempy-(int)(y5*50)550;
g.setColor(new Color(20,i/(200000/255),20));
g.drawLine(tempx,tempy,tempx,tempy);
x52x5;
y52y5;
}
}
效果图如下