大家好,又见面了,我是你们的朋友全栈君。
分形,具有以非整数维形式充填空间的形态特征。通常被定义为“一个粗糙或零碎的分形,具有以非整数维形式充填空间的形态特征。通常被定义为“一个粗糙或零碎的几何形状,可以分成数个部分,且每一部分都(至少近似地)是整体缩小后的形状”,即具有自相似的性质。例如谢尔宾斯基三角形、谢尔宾斯基地毯、康托尔三分集。
如何实现分形
根据分形的定义我们知道,图形可被分成数个部分,每一部分都是完整图形的缩小版。以康托尔三分集为例,第一条线段被分成三部分,左右两边的部分又继续被分成三部分,如此循环下去。因此我们可以用递归的方法实现分形。
递归
按照套娃的想法来理解,递归算法有三个要素:
-
边界条件(出口)
边界条件决定了何时终止递归,若没有终止条件程序便会一直运行下去或报错。也就是确定最小的娃娃的大小,当娃娃达到边界大小的时候就不能再套了。
-
基本内容
递归的每一次循环动作都是相同的,每个娃娃的模样都一样,只不过都比上一个小了点,我们需要先画出娃娃的模样。
-
递归部分
套娃的递归方式是把下一个娃娃装在此刻这个娃娃的肚子里,同理,在递归函数里我们要继续调用递归函数,这样才能让函数连续调用,一个套一个。
在写递归算法时一定注意,不要试图弄清每一次循环调用之间的关系,只需写好出口和递归部分,让计算机去进行递归。
分形实例:康托尔三分集
//1.边界条件:线段长度<=0时终止
//2.基本内容:画出一条线段,把该线段分为三部分,画出左右部分
//3.递归部分:线段的左右部分重复调用此函数
public void CantorLine(Graphics gr,int x1,int x2,int y) {
gr.drawLine(x1, y, x2, y); //画出一条线段:左端点(x1,y) 右端点(x2,y)
int size=(x2-x1)/3; //size是线段长度的三分之一
if(size<=0) {
return; } //出口
int ax=x1+size,bx=x2-size;
int cy=y+50;
gr.drawLine(x1, cy, ax, cy); //左部分线段以x1、ax为端点
gr.drawLine(bx, cy, x2, cy); //右部分线段以bx、x2为端点
//以上为基本内容,每一次执行函数都画出了三条线段
//-------------------------------------------------------//
//以下为递归部分,左右两侧的线段再次调用递归函数
CantorLine(gr,x1,ax,cy);
CantorLine(gr,bx,x2,cy);
}
其他分形
谢尔宾斯基三角形
public void SierpinskiTri(Graphics g,int x1,int x2,int y) {
if(x2-x1<=20) {
return; } //出口
int ax=(x1+x2)/2,bx=(x1+ax)/2,cx=(ax+x2)/2;
int dy=y-(x2-x1)/2;
//基本内容
Triangle(g,x1,x2,y);
Triangle(g,x1,ax,y);
Triangle(g,ax,x2,y);
g.setColor(Color.lightGray);
fillTri(g,bx,cx,dy,ax,y);
g.setColor(Color.black);
//递归部分
SierpinskiTri(g,bx,cx,dy);
SierpinskiTri(g,x1,ax,y);
SierpinskiTri(g,ax,x2,y);
}
谢尔宾斯基地毯
public void SierpinskiSqr(Graphics gr,int x1,int x2,int y) {
int size0=(x2-x1)/3;
if(size0<=0) {
return; } //出口
int ax=x1+size0,bx=x2-size0,cy=y+size0;
//基本内容
gr.fillRect(ax, cy, size0, size0);
//递归部分
SierpinskiSqr(gr,x1,ax,y);
SierpinskiSqr(gr,ax,bx,y);
SierpinskiSqr(gr,bx,x2,y);
SierpinskiSqr(gr,x1,ax,cy);
SierpinskiSqr(gr,bx,x2,cy);
SierpinskiSqr(gr,x1,ax,cy+size0);
SierpinskiSqr(gr,ax,bx,cy+size0);
SierpinskiSqr(gr,bx,x2,cy+size0);
}
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/160332.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...