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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • git 回滚到指定版本_git回滚多了怎么办

    git 回滚到指定版本_git回滚多了怎么办我们在GIT操作项目时,往往会遇到很多需要回滚的代码。我们可以回滚到任意之前的版本,case如下:1.首先找到你需要回滚的版本号,可以通过日志查看命令行:gitlog-32.选择上图红色箭头执行的commit版本号,第一个时最后提交的,我们回滚到第二个commit:f3eb8f9df34dc6ba47e477e05c8772a62d653fbb命令行:gitr

    2022年10月25日
  • linux 实时查看日志 最新最后100行 tail「建议收藏」

    linux 实时查看日志 最新最后100行 tail「建议收藏」(1)实时查看日志文件tail-f日志文件名(2)只查看日志文件后100行tail-f-n100日志文件名(3)搜寻字符串grep‘搜寻字符串’日志文件名按ctrl+c退出————————————————版权声明:本文为CSDN博主「wanghai76」的原创文章,遵循CC4.0BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:http…

  • 6种不同画法画平行线_平行线的画法_中小学试题|家庭教育题库|辅导习题「中国戏曲学院附属中等戏曲学校」…

    6种不同画法画平行线_平行线的画法_中小学试题|家庭教育题库|辅导习题「中国戏曲学院附属中等戏曲学校」…平行线怎么画第五章《数学活动1》—-你有几种画平行线的方法【活动理念】通过让学生积极参与此次活动,获得成功的体验,感受活动课的乐趣.通过观察、操作、推理归纳,让学生进一步知道相交线、平行线以及垂线的概念,利用平行线的判定解决一些实际问题,利用平移可以绘制一些优美的图案等.【活动目标】一、知识与技能1、两直线平行的条件,掌握两种以上最快捷的画平行线的方法.2、进一步理解相交线、平行线以及垂线的概…

  • 软件项目管理案例分析

    软件项目管理案例分析高水平项目管理是软件项目成功的关键,也是软件产品质量的根本保证,具有这方面理论和实践的人员是目前软件组织中急需的高层次人才。为建立符合中国国情的软件开发过程和组织体系,培训中心特举办“软件项目管理案例分析”培训班,具体事宜通知如下:一、培训对象软件开发机构高级管理人员、项目经理、系统架构师、系统分析师、资深开发人员、质量保证人员以及其他对提升软件开发质量负有责任的人员。二、学员基础

  • gtest宏列表_指定宏怎么用

    gtest宏列表_指定宏怎么用简介总结gtest中的所有断言相关的宏。gtest中,断言的宏可以理解为分为两类,一类是ASSERT系列,一类是EXPECT系列。一个直观的解释就是:ASSERT_*系列的断言,当检查点失败时,退出当前函数(注意:并非退出当前案例)。EXPECT_*系列的断言,当检查点失败时,继续往下执行。布尔值检查FatalassertionNonfatalassertion…

  • numpy如何求矩阵的逆_numpy矩阵

    numpy如何求矩阵的逆_numpy矩阵1.矩阵求逆importnumpyasnpa=np.array([[1,2],[3,4]])#初始化一个非奇异矩阵print(a.I)print(np.linalg.inv(a))#与上一步等同,对应于MATLAB中inv()函数2.矩阵求伪逆importnumpyasnp#定义一个奇异阵AA=np.zeros((4,…

发表回复

您的电子邮箱地址不会被公开。

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