分形基础及实例(java)

在我们这个美丽的世界,哪里都能够看到分型的影子,小到花草树木的花纹图案,大到宇宙万物。从大到小看来,它们都满足同样的规律,也就是迭代,用计算机的语言来说,这就是递归的内涵所在。
首次接触分形,就发现了它的魅力真的很大,一个对你来说似乎毫无意义的公式,通过用计算机根据这个公式不断迭代画上几十万个点后,竟然形成了想也想不到的美丽图形,如下图


[img]http://dl.iteye.com/upload/attachment/0081/9801/4696bd2d-ae24-39f3-a6c2-a16da34ea394.png[/img]


[img]http://dl.iteye.com/upload/attachment/0081/9803/2783c5b4-430f-3f72-8240-43d769e8318a.png[/img]


如何画一个雪花曲线呢?对于新手来说,的确十分难。但彻底理解了递归的概念后,加上一点数学知识以及足够的耐心是能够画出来的,下面给出源代码及注释。

[img]http://dl.iteye.com/upload/attachment/0081/9811/a9a8c1e0-4167-3ce3-a406-282fd69d70e8.png[/img]



/************************************************************/
主界面
package cn.test0313;

import java.awt.Graphics;

import javax.swing.JFrame;

import cn.test0320.XueHua;

///新建一个类继承了JFrame
public class XieEr extends JFrame{
/**
* @兰天
*/
public static void main(String[] args) {
XieEr jf=new XieEr();
jf.init();
}
public int l=300,i=5;
private Graphics g;
public void init(){
this.setSize(800,700);
this.setTitle("雪花曲线");
this.setDefaultCloseOperation(3);
this.setLocationRelativeTo(null);
//设置可见后获取画布
this.setVisible(true);
g=this.getGraphics();

}
//将画雪花曲线定义在重绘中
public void paint(Graphics g){
super.paint(g);
XueHua xh=new XueHua(g);
xh.init(l, i,100,200);
}

/**************************************************************/

//画雪花曲线的类
/****************************************************************/

package cn.test0313;

import java.awt.Graphics;

public class XueHua {

/**
* @兰天
*/
private int l,i;
//角度v
private Graphics g;
//一个三的N次方的数组
public int[] a=new int[]{1,3,9,27,81,243,729,2187};
//构造函数,传入画板
public XueHua(Graphics g){
this.g=g;
}

public void init(int l,int i,int x,int y){
this.l=l;
this.i=i;
//将雪花曲线的三角形的三边分别进行递归
this.xuehua(x, y, 0, 1);
this.xuehua(x+l, y, 2*Math.PI/3, 1);
this.xuehua(x+l/2, y+l*Math.sin(Math.PI/3), -2*Math.PI/3, 1);
}
//将利用这个函数进行递归,x,y起始点坐标,z角度 ,n用来判断到递归底层画曲线的长度
public void xuehua(double x,double y,double z,int n){
if (n<a[i]){
int i;
//第一次递归
xuehua(x,y,z,3*n);
//计算第二个点坐标
double x2=x+l*Math.cos(z)/(3*n),y2=y+l*Math.sin(z)/(3*n);
//改变角度
z=z-Math.PI/3;
xuehua(x2,y2,z,3*n);
//计算第三个点坐标
double x3=x2+l*Math.cos(z)/(3*n),y3=y2+l*Math.sin(z)/(3*n);
//改变角度
z=z+2*Math.PI/3;
xuehua(x3,y3,z,3*n);
double x4=x3-l*Math.cos(Math.PI-z)/(3*n),y4=y3+l*Math.sin(z)/(3*n);
z=z-Math.PI/3;
xuehua(x4,y4,z,3*n);
}else{
//若已经到了底层则画线
g.drawLine((int)x, (int)y, (int)(x+l*Math.cos(z)/(n)), (int)(y+l*Math.sin(z)/(n)));
}
}

}


/*************************************************/

雪花曲线的代码就这么多,如果想更多地了解下分形,我们可以是着将每回转过的角度改变,看会发生什么样的事。。。也可以将界面优化。。。实现渐变等
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值