几何图形应用中有一种十分重要的应用——分形,分形图形虽然整体上看十分不规则,在小尺度上,图形又有一些规则性,整体看上去非常漂亮(像Koch曲线整体看上去就好像是雪花)! 在Java中,可以通过运用递归或迭代等的的思想实现分形。
Koch曲线(雪花)的绘制:
设想一个等边三角形,取每边中间的三分之一,接上去一个形状完全相似的但边长为其三分之一的三角形,结果是一个六角形。现在取六角形的每个边做同样的变换,即在中间三分之一接上更小的三角形,以此重复,直至无穷。外界的变得原来越细微曲折,形状接近理想化的雪花。
代码如下:
//界面类
package fengxing;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JFrame;
public class MainUI extends JFrame{
private Graphics g;
private int depth=1;
public void showUI(){
this.setTitle("分形");
this.setSize(600,600);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(3);
this.setVisible(true);
g=this.getGraphics();
this.addMouseListener(mouse_listener);
}
public void change(double x1,double y1,double x2,double y2,int depth){
if(depth<=1)
g.drawLine((int)x1, (int)y1, (int)x2, (int)y2);
else {
double x3=2*x1/3+x2/3;
double y3=2*y1/3+y2/3;
double x4=x1/3+2*x2/3;
double y4=y1/3+2*y2/3;
double x5=(x4+x3)/2+(y3-y4)*Math.sqrt (3)/2;
double y5=(y4+y3)/2+(x4-x3)*Math.sqrt (3)/2;
change(x1,y1,x3,y3,depth-1);
change(x3,y3,x5,y5,depth-1);
change(x5,y5,x4,y4,depth-1);
change(x4,y4,x2,y2,depth-1);
}
}
public void paint(Graphics g){
super.paint(g);
change(300, 400-300*Math.sqrt (3)/2,150, 400,depth);
change(150, 400,450, 400,depth);
change(450,400,300, 400-300*Math.sqrt (3)/2,depth);
}
MouseAdapter mouse_listener=new MouseAdapter(){
public void mouseClicked(MouseEvent e){
int action=e.getButton();
switch (action){
case 1: depth++;
repaint();
break;
case 3: depth--;
repaint();
break;
}
}
};
}
//测试类
package fengxing;
public class Test{
public static void main(String[] args){
MainUI ui =new MainUI();
ui.showUI();
}
}
运行结果: