Java:利用递归实现分形[通俗易懂]

Java:利用递归实现分形[通俗易懂]Java:利用递归实现分形分形,具有以非整数维形式充填空间的形态特征。通常被定义为“一个粗糙或零碎的分形,具有以非整数维形式充填空间的形态特征。通常被定义为“一个粗糙或零碎的几何形状,可以分成数个部分,且每一部分都(至少近似地)是整体缩小后的形状”,即具有自相似的性质。例如谢尔宾斯基三角形、谢尔宾斯基地毯、康托尔三分集。如何实现分形根据分形的定义我们知道,图形可被分成数个部分,每一部分都是完整图形的缩小版。以康托尔三分集为例,第一条线段被分成三部分,左右两边的部分又继续被分成三部分,如此循环下去。因此

大家好,又见面了,我是你们的朋友全栈君。

分形,具有以非整数维形式充填空间的形态特征。通常被定义为“一个粗糙或零碎的分形,具有以非整数维形式充填空间的形态特征。通常被定义为“一个粗糙或零碎的几何形状,可以分成数个部分,且每一部分都(至少近似地)是整体缩小后的形状”,即具有自相似的性质。例如谢尔宾斯基三角形谢尔宾斯基地毯康托尔三分集

如何实现分形

根据分形的定义我们知道,图形可被分成数个部分,每一部分都是完整图形的缩小版。以康托尔三分集为例,第一条线段被分成三部分,左右两边的部分又继续被分成三部分,如此循环下去。因此我们可以用递归的方法实现分形。

递归

按照套娃的想法来理解,递归算法有三个要素:

  1. 边界条件(出口)

    边界条件决定了何时终止递归,若没有终止条件程序便会一直运行下去或报错。也就是确定最小的娃娃的大小,当娃娃达到边界大小的时候就不能再套了。

  2. 基本内容

    递归的每一次循环动作都是相同的,每个娃娃的模样都一样,只不过都比上一个小了点,我们需要先画出娃娃的模样。

  3. 递归部分

    套娃的递归方式是把下一个娃娃装在此刻这个娃娃的肚子里,同理,在递归函数里我们要继续调用递归函数,这样才能让函数连续调用,一个套一个。

在写递归算法时一定注意,不要试图弄清每一次循环调用之间的关系,只需写好出口和递归部分,让计算机去进行递归。

分形实例:康托尔三分集

//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);
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/160332.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 解决: java.net.ConnectException: Connection refused: connect

    解决: java.net.ConnectException: Connection refused: connectjava.net.ConnectException:Connectionrefused:connect1.报错如上。2.原因和解决:1)端口号被占用:杀死占用端口号(一般为8080)的进程,释放端口;彻底关闭Tomcat服务器,或者重新启动项目。2)使用以下命令检查服务器中允许的最大进程数:ulimit-u。如果将此值设置为较低值,例如1024,则使用以下…

    2022年4月30日
    42
  • MAC NavicatPremium15 永久激活码[免费获取]

    (MAC NavicatPremium15 永久激活码)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月20日
    318
  • halcon联合C#_halcon调用自己的模型

    halcon联合C#_halcon调用自己的模型20210221版最新C#联合halcon开发框架源码,傻瓜式拖拽,匹配,测量,条码识别,ocr,定位引导,对位等,支持plc通讯,支持相机sdk无缝对接

    2025年7月2日
    3
  • 树、二叉树(完全二叉树、满二叉树)概念图解「建议收藏」

    树、二叉树(完全二叉树、满二叉树)概念图解「建议收藏」1、树的定义树是n个结点的有限集合,有且仅有一个根结点,其余结点可分为m个根结点的子树。2、树的概念结点的度:一个结点拥有子树的个数称为度。比如A的度为3,C的度为2,H的度为0。度为0的结点称为叶子节点(D,F,G,H)。树的度是树中所有结点的度的最大值,此树的度为3。 树中结点的最大层次成为树的深度或高度。此树的深度为4。 父节点A的子结点B,C,D;B,C,D也是兄弟节点…

    2022年7月13日
    17
  • 联合索引在B+树上的存储结构及数据查找方式

    联合索引在B+树上的存储结构及数据查找方式能坚持别人不能坚持的,才能拥有别人未曾拥有的。关注编程大道公众号,让我们一同坚持心中所想,一起成长!!引言上一篇文章《MySQL索引那些事》主要讲了MySQL索引的底层原理,且对比了B+Tree作为索引底层数据结构相对于其他数据结构(二叉树、红黑树、B树)的优势,最后还通过图示的方式描述了索引的存储结构。但都是基于单值索引,由于文章篇幅原因也只是在文末略提了一下联合索引,并没有大篇幅的展…

    2022年6月4日
    46
  • java标识符与关键字_4、Java标识符和关键字

    java标识符与关键字_4、Java标识符和关键字标识符:Java对各种变量,方法和类等要素命名时使用的字符序列称为标识符。(凡是自己可以起名的地方都叫标识符,都遵循标识符的规则)Java的命名规则:1、标识符由字母、下划线”_”、美元符”$”或数字组成;2、标识符应以字母、下划线、美元符开头;3、Java标识符大小写敏感,长度无限制;4、Java标识符选取应注意“见明知意”且不能与Java语言的关键字重名(约定俗成)合法的标识符HelloWor…

    2022年7月7日
    19

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号