分形

分形——毕达哥拉斯树
1.思路:
        首先,画一个正方形(相当于树干,是最下面的一个正方形;
        其次,以上一个正方形最上面的边(顶边)为直角三角形的斜边;
                 以该边的左边一点为下一个正方形的底边上的一点,旋转一定角度画正方形(左边正方形;
                 同样的方法,以另一点(右边)再画一个正方形(右边正方形;
                 这两个正方形的底边与上一个正方形顶边组成一个直角三角形; 
        然后,用递归(即重复以上方法)画出整个分形;

2.分析:左右两边的正方形旋转的角度加和为90度;
        先假设左边的正方形旋转30度,即右边为60度(每次旋转角度相同)
        每次同时画左右两边

3.操作:在监听器中实现(新正方形顶边左(a1,a2)右(b1,b2)直角三角形直角顶点(c1,c2))
  
 public void mouseReleased(MouseEvent e) {
    	//基础正方形
		g.drawRect(500, 500, 100, 100);
		//调用分形的方法
		Draw(500,600,600,600,0,0);
	}
	//分形的方法
    public void Draw(double x1,double y1,double x2,double y2,double jiaodu,int n){
		//上一个正方形的边长左(x1,y1)右(x2,y2)
		double s1=Math.hypot(Math.abs(x2-x1), Math.abs(y2-y1));
		//jiaodu---上一个正方形转动的角度,P为3.1415,Q1为每次左边正方形的转动角度,Q2为每次右边正方形的转动角度
		double sin1=Math.sin(jiaodu*P/180);  
		double cos1=Math.cos(jiaodu*P/180);  
		double b=s1*Math.cos(Q1*P/180);  
		          
		double a1,a2,b1,b2,c1,c2;  
		a1=x1-s1*sin1;   a2=y1-s1*cos1;  
		b1=x2-s1*sin1;   b2=y2-s1*cos1;  
		c1=a1+b*Math.cos((jiaodu+Q1)*P/180);  
		c2=a2-b*Math.sin((jiaodu+Q1)*P/180);  
		         
		g.drawLine((int)x1, (int)y1, (int)x2, (int)y2);  
	         g.drawLine((int)x1, (int)y1, (int)a1, (int)a2);  
		g.drawLine((int)a1, (int)a2, (int)b1, (int)b2);  
		g.drawLine((int)b1, (int)b2, (int)x2, (int)y2);  
		g.drawLine((int)a1, (int)a2, (int)c1, (int)c2);  
		g.drawLine((int)c1, (int)c2, (int)b1, (int)b2);  
		//递归次数
		n++;  
		if(n>11) return; 
		//递归调用
		//左边正方形
		Draw(a1,a2,c1,c2,jiaodu+Q1,n);
		//右边正方形
		Draw(c1,c2,b1,b2,jiaodu-Q2,n);  
	}  

你可能感兴趣的:(分形)