分形,通常被定义为“一个粗糙或零碎的几何形状,可以分成数个部分,且每一部分都(至少近似地)是整体缩小后的形状”,即具有自相似的性质。分形是奇妙的,我们可以从图形任何一个部分看到图形整体的样子。比如康托三分集、谢尔宾斯基三角形等。
分形通常要用到递归,程序调用自身的编程技巧称为递归,说白了就是多次调用自身的方法。实现康托三分集和谢尔宾斯基三角形的代码如下:
package 递归;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
@SuppressWarnings("serial")
public class digui extends JFrame{
public static void main(String[] args){
digui dl = new digui();
dl.showUI();
}
private void showUI() {
this.setTitle("递归线段");
this.setDefaultCloseOperation(3);
this.setSize(600, 600);
this.setVisible(true);
this.setLayout(new FlowLayout());
JButton btn01 = new JButton("康托三分集");
this.add(btn01);
JButton btn02 = new JButton("谢尔宾斯基三角形");
this.add(btn02);
btn01.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
draw01(20,100,380,100);
}
});
btn02.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
draw02(27,100,473,100,250,450);
}
});
}
public void draw01(int x1,int y1,int x2,int y2){
int len=x2-x1;
if(len<2)
return;
//得到窗体的画布对象
Graphics g = this.getGraphics();
g.drawLine(x1, y1, x2, y2);
int x3=x1+len/3;
int x4=x2-len/3;
int y=y1+20;
draw01(x1, y, x3, y);
draw01(x4, y, x2, y);
}
public void draw02(int x1,int y1,int x2,int y2,int x3,int y3){
int len=x2-x1;
if(len<2)
return;
//得到窗体的画布对象
Graphics g = this.getGraphics();
g.drawLine(x1, y1, x2, y2);
g.drawLine(x2, y2, x3, y3);
g.drawLine(x1, y1, x3, y3);
int x4=(x1+x2)/2;
int x5=(x2+x3)/2;
int x6=(x1+x3)/2;
int y4=(y1+y2)/2;
int y5=(y2+y3)/2;
int y6=(y1+y3)/2;
g.drawLine(x4, y4, x5, y5);
g.drawLine(x5, y5, x6, y6);
g.drawLine(x4, y4, x6, y6);
draw02(x1,y1,x4,y4,x6,y6);
draw02(x4,y4,x2,y2,x5,y5);
draw02(x6,y6,x5,y5,x3,y3);
}
}