疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

分形——递归的艺术


 

       利用递归的方式画出一系列漂亮而有规律的图形,在我看来是个既简单又复杂的事情。对于分析接触的不算很多,写得程序画出的图都有限。

  Java的一点好处就是做界面比较容易,所以既然要画图形出来,有个界面可以显示还是很方便的。界面的构建比较容易,在界面上加一个按钮,最基础的工作就做完了。这篇博客我就是介绍一个我自己画的谢宾斯基三角形,也算是很基础的分形了。

  新建一个监听器类,用来监听界面上的按钮是否被操作。按钮被按下的话就要画出类中所写的分形图案了。

  Java代码

  //建一个类,继承动作监听器

  public class DrawSanLis implements ActionListener{

  //定义最初三角形的三个顶点

  private int x1=250,y1=50,x2=50,y2=400,x3=450,y3=400;

  //实现动作监听器自带的抽象方法

  public void actionPerformed(ActionEvent e) {

  dr.update(g);

  //第一个三角形

  g.drawLine(x1, y1, x2, y2);

  g.drawLine(x1, y1, x3, y3);

  g.drawLine(x2, y2, x3, y3);

  //引用自己构造的DrawNext的方法,画出分形图案

  DrawNext(x1,y1,x2, y2, x3, y3,6);

  }

  //构造一个向下递归的方法,a表示递归的次数

  public void DrawNext(int x1,int y1,int x2,int y2,int x3,int y3,int a){

  //先将三角形的三条边的中点连成一个三角形将大三角形分成四个小三角形下面会在三个小三角形中画出各自的递归

  g.drawLine((x1+x2)/2, (y1+y2)/2, (x1+x3)/2, (y1+y3)/2);

  g.drawLine((x1+x2)/2, (y1+y2)/2, (x2+x3)/2, (y2+y3)/2);

  g.drawLine((x1+x3)/2, (y1+y3)/2, (x2+x3)/2, (y2+y3)/2);

  //画一次三角形a就自减一次,再进入递归画图中

  a--;

  //如果在递归中a小于0,则中止画图

  if(a<0){

  return;

  }else{//否则a大于0的时候一直画下去

  DrawNext(x1,y1,(x1+x2)/2,(y1+y2)/2,(x1+x3)/2,(y1+y3)/2,a);

  DrawNext((x1+x2)/2,(y1+y2)/2,x2,y2,(x2+x3)/2, (y2+y3)/2,a);

  DrawNext(x3,y3, (x1+x3)/2, (y1+y3)/2,(x2+x3)/2,(y2+y3)/2,a); }

  }

  }

  最后在这个监听器类中重载构造方法,将界面类和画布对象作为参数。则用监听器的时候,新建一个监听器对象引入监听器类中的构造方法,将监听器加到按钮上就可以实现整个分形图案的画出。

  Java代码

  Graphics g1=this.getGraphics();

  DrawSanLis dsl=new DrawSanLis(g1,this);

  bu1.addActionListener(dsl);

  分形确实是学习技术中的艺术品,它可以通过很多变化,变化出不同的图案。在学习中继续探究分形,是一件有难度但是快乐的事情。对于分形的认识还比较浅,还需要继续研究。