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)
上一篇 2022年7月16日 上午11:00
下一篇 2022年7月16日 上午11:16


相关推荐

  • DropDownList绑定数据库「建议收藏」

    DropDownList绑定数据库「建议收藏」//获取文本this.DropDownList1.SelectedItem.Text;本类内使用protectedvoidPage_Load(objectsender,EventArgse)   {       this.DropDownList1.Items.Clear();       this.DropDownList1.DataSource=DbHelperSQL.Query(“select*fromauthors”).Tables[0];       this.Drop

    2022年10月8日
    4
  • 盘点主流Multi-Agent智能体开发框架

    盘点主流Multi-Agent智能体开发框架

    2026年3月15日
    1
  • 关于爱未删减版高清_init not tainted

    关于爱未删减版高清_init not taintedhttp://blog.csdn.net/wangkaiblog/article/details/8741042http://blog.linux.org.tw/~jserv/archives/001954.html

    2022年8月11日
    9
  • 好用又好玩的微信小程序大全「建议收藏」

    小马哥去合肥坐公交车,把小程序推广的更加的接地气和实用,微信的巨大用户量,让小程序有天然的流量入口,其次小程序不用下载安装耗费流量,占用手机的存储空间,启动速度比APP相当,下面是网友整理的目前好用的微信小程序大全,有的是软件开放的,有的可能是在好建小程序免费生成的,建议大家根据自己的喜好和需要收藏!【热门小程序】美团外卖滴滴公交查询车来了

    2022年4月11日
    51
  • 多项式回归

    多项式回归

    2021年11月15日
    65
  • 数据库系统概论 第十章课后习题(部分)

    数据库系统概论 第十章课后习题(部分)本文是 数据库系统概论 的第十章 数据库恢复技术 的部分课后习题 题目来源 2019 2020 春学期 数据库作业 20 第十章 数据库恢复技术 不加目录啦 比较少 直接开始 我的手写解答 注意 已经提交了的需要重做 已经开始但未结束的需要回滚 其他情况不用 care 我的手写解答 系统恢复后值的变化只与需要重做的事务 即已经提交了的事务 有关系 那这两个习题就完成啦 注意一下总结的两个点就行 习题难度较简单 不过学了以后真正地运用了才能记得更牢

    2026年3月16日
    1

发表回复

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

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