一、引入
什么是分形?
说的简单点就是“部分与整体以某种形式相似的形,称为分形。”我觉得这个定义就可以基本解释了分形的内涵
二、为什么分形
在递归中寻找规律,在敲代码中发现自然之美,我觉得主要就是锻炼思维,在循环和递归中发现规律
所以关键词:规律
最后我们会发现,多姿多彩的分形是多么的美~~
三、简单分形实例:科赫曲线
科赫曲线是一种外形像雪花的几何曲线,所以又称为雪花曲线,它是分形曲线中的一种。
关键词:递归 寻找一致性
基本思路:每条线段在一次分形变换中都被分为了四条线段并且中间的是一个没有底
的正三角形,在经过四次以上变换之后我们发现它变成了一种类似于雪花的形状
四、简单分形实例:希尔宾斯三角形
谢尔宾斯基三角形
基本思路:谢尔宾斯基三角形,最基本就是在一个等边三角形中将三边的中点连接再画一个三角形,再在其分出的三角形中重复此步骤,构成递归。
什么是分形?
说的简单点就是“部分与整体以某种形式相似的形,称为分形。”我觉得这个定义就可以基本解释了分形的内涵
二、为什么分形
在递归中寻找规律,在敲代码中发现自然之美,我觉得主要就是锻炼思维,在循环和递归中发现规律
所以关键词:规律
最后我们会发现,多姿多彩的分形是多么的美~~
三、简单分形实例:科赫曲线
科赫曲线是一种外形像雪花的几何曲线,所以又称为雪花曲线,它是分形曲线中的一种。
关键词:递归 寻找一致性
基本思路:每条线段在一次分形变换中都被分为了四条线段并且中间的是一个没有底
的正三角形,在经过四次以上变换之后我们发现它变成了一种类似于雪花的形状
public class 啊啊啊 {
private int depth=1;
public void paint(Graphics g) {
super.paint(g);
KehePaint(150,500,650,500,this.depth);
}
public void KehePaint(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+x2)/3;
double y3=(2*y1+y2)/3;
double x4=(x1+2*x2)/3;
double y4=(y1+2*y2)/3;
double x5=0,y5=0;
double k=(y4-y3)*(x4-x3);
if(y3==y4){
x5=(x3+x4)/2;
y5=y3-(x4-x3)*Math.sqrt(3)/2;
}else if(k<0){//右上斜
y5=y4;
x5=x3-(x4-x3);
}else if(k>0){//右下斜
y5=y3;
x5=x4+(x4-x3);
}if(x3==x4){
x5=x3;
y5=y3;
}
KehePaint(x1,y1,x3,y3,depth-1);
KehePaint(x3,y3,x5,y5,depth-1);
KehePaint(x5,y5,x4,y4,depth-1);
KehePaint(x4,y4,x2,y2,depth-1);
}
}
@Override
public void mouseClicked(MouseEvent e) {
if(e.getButton()==1&&this.depth<12){
this.depth++;
this.repaint();
}else if(e.getButton()==3&&this.depth>1){
this.depth--;
this.repaint();
}
}
}
四、简单分形实例:希尔宾斯三角形
谢尔宾斯基三角形
基本思路:谢尔宾斯基三角形,最基本就是在一个等边三角形中将三边的中点连接再画一个三角形,再在其分出的三角形中重复此步骤,构成递归。
public Listener (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;
draw(x1,y1,x2,y2,10);
}
public void draw(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);
draw(x1,y1,x11,y11,t);
draw(x11,y11,x2,y2,t);
draw(x33,y33,x22,y22,t);
}