`
daihongtao110121
  • 浏览: 15194 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

分形与分形树

    博客分类:
  • java
阅读更多
     一 引入现在分形学说发展越来越成熟,各种各样的描述分形也变得越来越多。美国杰出屋里学家,物理教育学家惠勒断言:“可以相信以后要是谁不熟悉分形,那么他将不可能被当做是地球上的文明人”。从这里我们可以看出分形的重要性,那么到底什么是分形呢?
      二 分形的定义
   分形是其组成部分以某种方式与整体具有相似的形。如果一个图形及其组成部分以某种方式与整体相似,我们就将该图形叫做分形。
      三 分形的形成   分形是图形通过简单的递归方式按照无数迭代的方式形成的。例如细胞的分裂。因其满足细胞的组成通过分裂的方式与整体相识。生活中也有很多图形都是分形,树叶的组成结构...
     四 分形的程序编写
通过上面我们知道分形是通过简单的递归方式按照无数迭代的方式形成的,那么我们就可以在计算机中通过编程,按照相同的规律来实现。下面我将举出几个例子来更深入的了解分形
      五:具体的分形例子实现代码:
1. 分形数的代码  :
    1.1  首先要建立一个窗体类
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
/**
 * 实现分型数的类
 * 继承窗体类
 *  
 */
public class MyTree extends JFrame {
   public static void main(String []args){
	   MyTree mt=new MyTree();   //实例化一个对象,用来调用显示窗体的方法
	   mt.initUI();
   }
   /**
    * 定义显示窗体的方法
    */
   public void initUI(){
	   //设置窗体的相应属性
	   this.setTitle("我的项目图形");
	   this.setSize(700,700);
	   this.setDefaultCloseOperation(3);
	   this.setBackground(Color.GRAY);
	   this.setResizable(false);   
	   this.setLayout(new BorderLayout());
	   //实例化两个画板类 
	  JPanel jp1=new JPanel();
	  JPanel jp2=new JPanel();
	  this.add(jp1,BorderLayout.NORTH);
	  this.add(jp2,BorderLayout.CENTER);
	  //给第一个画板设置新的背景用来区分和其他的
	  jp1.setBackground(Color.LIGHT_GRAY);
	 jp1.setLayout(new FlowLayout());
	  
	  JButton jb1 =new JButton("山林");
	  JButton jb2 =new JButton("野风");
	  JButton jb3 =new JButton("随叶");
	  
	  jp1.add(jb1);jp1.add(jb2); jp1.add(jb3);
	  
	  //实例化动作监听器对象,给按钮安装监听器
	  BtnActionListener  ban=new BtnActionListener(jp2);
	  jb1.addActionListener(ban);
	  jb2.addActionListener(ban);
	  jb3.addActionListener(ban);
	  
	   this.setVisible(true);
   }
}



1.2 建立监听器类,在监听器类中具体实现画分形数的方法
 import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;

import javax.swing.JPanel;

/**
 * 实现动作监听器类
  *
 */
public class BtnActionListener implements ActionListener{
         private Graphics g;       //定义一个画布对象的属性
	private JPanel jp;       //声明画板的属性
	Random ran =new Random();  //实例化一个随机化对象
	int num;    //取得1~6个数字
	/**
	 * 用构造器的方法用来接收画板对象
	 * @param jp 接收的画板对象
	 */
	public BtnActionListener(JPanel jp){
		this.jp=jp;   
	}
    /**
     * 实现监听器类的抽象方法
     */
	public void actionPerformed(ActionEvent e) {
		if("山林".equals(e.getActionCommand())){
			draw1();   //调用次方法
		}
		if("野风".equals(e.getActionCommand())){
			draw2();
		}
		if("随叶".equals(e.getActionCommand())){
//			draw3();
			draw4();
		}
	}
         /**
	 * 画分型树的方法
	 */
	public void draw1(){
		g=jp.getGraphics();        //取得面板的画布对象
		Color color=new Color(0,129,59);
		int x=0,y=0; 
		float x1=0f,y1=0f,x2,y2;   //要把x2和y2都放在外面 
		float a=0,b=0,c=0,d=0,e=0,f=0;
		for(int i=0;i<100000;i++){  //循环1000次
		int num=ran.nextInt(10)+1; //随机取得一个1~10的数字
		if(num<=8){
			//定义要画图形的相关属性
			 a=0.824074f;b=0.281428f;c=-0.212346f;d=0.864198f;e=-1.882290f;f=-0.110607f ;
		}
		if(num>=9){
			 a=0.088272f;b=0.520988f;c=-0.463889f;d=-0.377778f;e=0.785360f;f=8.095795f ;
		}
		x2=a*x1+b*y1+e;
		y2=c*x1+d*y1+f;
		 //将x2与y2,强制装换成整形;
		 x=(int)(30*x2+250);
		 y=(int)(30*y2+200);
		 x1=x2;
		 y1=y2;
		 g.drawLine(x, y, x, y);
		 g.setColor(color);
		}
	}
        /**
	 * 画野风方法
	 */
     public void draw2(){
    	g=jp.getGraphics();    //取得面板的画布对象
    	Color color=new Color(0,148,0);  //设置颜色
        int x=0,y=0; 
        double x1=0f,y1=0f,x2,y2;   //要把x2和y2都放在外面
        double r=0,s=0,theta=0,phi=0,e=0,f=0;
        for(int i=0;i<100000;i++){
         int num=ran.nextInt(6)+1;
         if(num==1){  //值不一样的时候改变参数的值
          r=0.0500; s=0.6000; theta=0.0000; phi=0.0000; e=0.0000; f=0.0000;
         }
         if(num==2){ //值不一样的时候改变参数的值
            r=0.0500; s=-0.5000; theta=0.0000; phi=0.0000; e=0.0000; f=1.0000;
         }
         if(num==3){ //值不一样的时候改变参数的值
              r=0.6000; s=0.5000; theta=0.6980; phi=0.6980; e=0.0000; f=0.6000;
           }
         if(num==4){ //值不一样的时候改变参数的值
             r=0.5000; s=0.4500; theta=0.3490; phi=0.3492; e=0.0000; f=1.1000;
           }
         if(num==5){ //值不一样的时候改变参数的值
              r=0.5000; s=0.5500; theta=-0.5240; phi=-0.5240; e=0.0000; f=1.0000;
           }
         if(num==6){ //值不一样的时候改变参数的值
              r=0.5500; s=0.4000; theta=-0.6980; phi=-0.6980; e=0.0000; f=0.7000;
           }
         x2=r*Math.cos(theta)*x1-s*Math.sin(phi)*y1+e;
 		y2=r*Math.sin(theta)*x1+s*Math.cos(phi)*y1+f;
 		x=(int)(-180*x2+300);
 		y=(int)(-180*y2+450);
 		g.drawLine(x, y, x, y); //画图
 		g.setColor(color);
 		x1=x2;      //将后面的值赋值给前面,,使得x和Y循环发生变化
 		y1=y2;
        }
     }
      /**
      * 定义一种花叶子的方法
      */
     public void draw4(){
    	 Graphics g=jp.getGraphics();   //取得画布对象
    	 Color color=new Color(0,148,0);
    	 double x1=0,y1=0,x2,y2;        //定义变量名,并且初始化
    	 double a=0,b=0,c=0,d=0,e=0,f=0;
    	 int x,y;
    	 for(int i=0;i<100000;i++){
    		 num=ran.nextInt(100)+1;     //随机产生1~100个数字
    		 if(num==1){                                          //概率为百分之1
    			  a=0.0;b=0.0;c=0.0;d=0.16;e=0.0;f=0.0;
    		 }
    		 if(num>=2&&num<=9){                                 //概率为百分之7
    			  a=0.2;b=-0.26;c=0.23;d=0.22;e=0.0;f=1.6;
    		 }
    		 if(num>9&&num<=16){                                 //概率为百分之7
    			  a=-0.15;b=0.28;c=0.26;d=0.24;e=0.0;f=0.44;    //初始化参数
    		 }
    		 if(num>=17&&num<=90){                              // 剩余的概率
    			  a=0.75;b=0.04;c=-0.04;d=0.85;e=0.0;f=1.6;     //初始化参数
    		 }
    		 x2=a*x1+b*y1+e;
			 y2=c*x1+d*y1+f;
			 x=(int)(-30*x2+350);
			 y=(int)(-30*y2+350);
			 x1=x2;                                              //将后面的赋值给前面的
			 y1=y2;                                             //将后面的赋值给前面的
			 g.drawLine(x, y, x, y);                            //画图形
			 g.setColor(color);
    	 }
     }
}


1.3 运行上面代码
   1.3.1 当点击山林按钮时候的结果如图:
  



   1.3.2 当点击野风按钮时候的结果如图:



 
   1.3.3 当点击随叶按钮的时候结果如图:
 


 
  • 大小: 35.3 KB
  • 大小: 18.5 KB
  • 大小: 48.4 KB
  • 大小: 48.4 KB
  • 大小: 18.5 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics