分形——毕达哥拉斯树
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);
}