分形基础及实例(java)
程序员文章站
2022-05-23 10:40:29
...
在我们这个美丽的世界,哪里都能够看到分型的影子,小到花草树木的花纹图案,大到宇宙万物。从大到小看来,它们都满足同样的规律,也就是迭代,用计算机的语言来说,这就是递归的内涵所在。
首次接触分形,就发现了它的魅力真的很大,一个对你来说似乎毫无意义的公式,通过用计算机根据这个公式不断迭代画上几十万个点后,竟然形成了想也想不到的美丽图形,如下图
如何画一个雪花曲线呢?对于新手来说,的确十分难。但彻底理解了递归的概念后,加上一点数学知识以及足够的耐心是能够画出来的,下面给出源代码及注释。
/*************************************************/
雪花曲线的代码就这么多,如果想更多地了解下分形,我们可以是着将每回转过的角度改变,看会发生什么样的事。。。也可以将界面优化。。。实现渐变等
首次接触分形,就发现了它的魅力真的很大,一个对你来说似乎毫无意义的公式,通过用计算机根据这个公式不断迭代画上几十万个点后,竟然形成了想也想不到的美丽图形,如下图
如何画一个雪花曲线呢?对于新手来说,的确十分难。但彻底理解了递归的概念后,加上一点数学知识以及足够的耐心是能够画出来的,下面给出源代码及注释。
/************************************************************/ 主界面 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))); } } }
/*************************************************/
雪花曲线的代码就这么多,如果想更多地了解下分形,我们可以是着将每回转过的角度改变,看会发生什么样的事。。。也可以将界面优化。。。实现渐变等