之前,我们在蓝杰学习了分形图形的画法,分形不跟其他的程序一样,基础的学习之后,我们发现,分形就是通过简单的循环递归,或者根据某种规律实现一步步的画图,画出一些根据某种特殊关系形成的图形。
拿最基础的我们画过了谢尔宾斯基三角形,和一些简单的通过函数画成的图形来说:
谢尔宾斯基三角形
画谢尔宾斯基三角形的重点是,掌握好每次的递归规律:
首先它的递归规律是,先画出一个大三角形A,然后再取出它的各个边中点连接,之后再把每个边上的三角形当成一个大三角形A,重复上面的步骤。
下面是代码:
/**
* 1.画谢尔宾斯基三角形
* @param count 循环的次数
*/
public void drawSJX(double x1,double y1,double x2,double y2,double x3,double y3,int count){
//第一次循环时画出最大的三角A
if(count==10){
g.drawLine((int)x1, (int)y1,(int) x2,(int) y2);
g.drawLine((int)x1, (int)y1, (int)x3, (int)y3)
g.drawLine((int)x2, (int)y2, (int)x3, (int)y3);
}
//开始递归
if(count>0){
//画大三角A的中位线
g.drawLine((int)(x1+x3)/2, (int)(y1+y3)/2,(int)(x2+x3)/2,(int) (y2+y3)/2);
g.drawLine((int)(x1+x3)/2, (int)(y1+y3)/2,(int)(x2+x1)/2, (int)(y2+y1)/2);
g.drawLine((int)(x2+x3)/2,(int) (y2+y3)/2,(int) (x2+x1)/2, (int)(y2+y1)/2);
//分别把角上三个小三角当作大三角A重复画中位线的步骤
drawSJX(x1,y1,(x2+x1)/2,(y2+y1)/2,(x1+x3)/2,(y1+y3)/2,count-1);
drawSJX((x2+x1)/2,(y2+y1)/2,x2,y2,(x2+x3)/2,(y2+y3)/2,count-1);
drawSJX((x1+x3)/2,(y1+y3)/2,(x2+x3)/2,(y2+y3)/2,x3,y3,count-1);
}
}
之后再在按钮实现类里编写相关画图的方式:
//实现接口中的方法
public void actionPerformed(ActionEvent e) {
String str=e.getActionCommand();
System.out.println("str="+str);
//开始绘制图形
if(str.equals("谢尔宾斯基三角形")){
double x1=100,y1=600;
double x2=600,y2=600;
double x3=(x2+x1)/2,y3=y1-Math.sqrt(3.00d)*(x3-x1);
int count=10;
drawSJX( x1, y1, x2, y2, x3, y3,count);
}else if(str.equals("清空")){
g.clearRect(100, 130, 980, 628);
}
}