美国杰出的物理学家( 两弹元勋 、现代广义相对论之父)、物理学思想家、物理学教育家惠勒( Wheeler )断言: “ 可以相信,明天谁不熟悉分形,谁就不能被认为是科学上的文化人。”可以看出分形强大的影响力,当然个人也比较喜欢分形,因为利用分形可以画出很多美丽的图形,利用分形我们可以描绘出 树叶的纹路、画出完整的一棵树、形状酷似病毒的图形,混沌 ( chaos )、孤立子( solitons )和分形 ( fractals )是非线性科学 ( nonlinear science ) 中三个最重要的概念。
分形是其组成部分以某种方式与整体相似的形,亦即:如果一个图形其组成部分以某种方式与整体相似,则称该图形为分形。可以依靠递归实现。所谓递归就是函数自己调用自己
举例:
谢尔宾斯基三角形
思想:观察谢尔宾斯基三角形,最基本就是在一个等边三角形中将三边的中点连接再画一个三角形,再在其分出的三角形中重复此步骤,构成递归。然而要完成基本图形(一个三角形被中点分为四个三角形)只需要已知两个点的坐标(x1,y1.x2.y2)就可以把其他点的坐标画出来(第三个顶点、中点)接着用递归(递归中要保证递归的边的一致性)。
以下是详细代码
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
public class AListener implements ActionListener {
private Graphics g;
int x1,y1,x2,y2,x3,y3;
//int count=10;
public AListener (Graphics g){
this.g=g;
}
public void actionPerformed(ActionEvent e){
draw(e);
}
public void draw(ActionEvent e){
x1=100;
y1=500;
x2=400;
y2=500;
drawDiGui(x1,y1,x2,y2,10);
}
public void drawDiGui(int x1,int y1,int x2,int y2,int t){
t--;
if(t>0){
x3=(int)Math.abs(x1+x2)/2;
y3=(int)Math.abs(y2-Math.sqrt(3)*(x2-x1)/2);
g.drawLine(x1, y1, x2, y2);
g.drawLine(x1, y1, x3, y3);
g.drawLine(x2, y2, x3, y3);
int x11=(x1+x2)/2;
int y11=(y1+y2)/2;
int x22=(x3+x2)/2;
int y22=(y3+y2)/2;
int x33=(x1+x3)/2;
int y33=(y1+y3)/2;
g.drawLine(x11, y11, x33, y33);
g.drawLine(x11, y11, x22, y22);
g.drawLine(x22, y22, x33, y33);
drawDiGui(x1,y1,x11,y11,t);
drawDiGui(x11,y11,x2,y2,t);
drawDiGui(x33,y33,x22,y22,t);
}
}
}
import java.awt.FlowLayout;
import java.awt.Graphics;
import javax.swing.JButton;
import javax.swing.JFrame;
public class DrawingSan extends JFrame{
/*
* 创建对象并调用初始化函数
*/
public static void main(String [] args){
DrawingSan ds=new DrawingSan();
ds.initUI();
}
/**
* 定义初始化函数
*/
public void initUI(){
this.setSize(500,600);
this.setTitle("三角分形");
this.setDefaultCloseOperation(3);
this.setLocationRelativeTo(null);
this.setLayout(new FlowLayout());
this.setResizable(false);
this.setVisible(true);
JButton jbsanjiao=new JButton("三角");
this.add(jbsanjiao);
Graphics g=this.getGraphics();
AListener a2=new AListener(g);
jbsanjiao.addActionListener(a2);
}
}