欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

分形基础及实例(java)

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


分形基础及实例(java)
            
    
    博客分类: java基础  


分形基础及实例(java)
            
    
    博客分类: java基础  



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

分形基础及实例(java)
            
    
    博客分类: java基础  


/************************************************************/
主界面
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)));
	   }
   }

}


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

雪花曲线的代码就这么多,如果想更多地了解下分形,我们可以是着将每回转过的角度改变,看会发生什么样的事。。。也可以将界面优化。。。实现渐变等
  • 分形基础及实例(java)
            
    
    博客分类: java基础  
  • 大小: 52.9 KB
  • 分形基础及实例(java)
            
    
    博客分类: java基础  
  • 大小: 19.1 KB
  • 分形基础及实例(java)
            
    
    博客分类: java基础  
  • 大小: 5.6 KB
  • 分形基础及实例(java)
            
    
    博客分类: java基础  
  • 大小: 5.6 KB