分形<二>分形的递归算法

递归算法是把问题转化为规模缩小了的同类问题的子问题。1)核心的子问题算法。2)递归调用。3)给定递归出口。

递归设计使程序简洁,也体现了设计思路在整体-局部上结合的严谨,但仍不提倡程序设计使用,因为其运行效率低且占用栈的空间问题突出。作为解决思路的一种方式还是具有魅力。

分形的自我相似,自我复制和自我嵌套用递归算法来实现是合适的,事实上经典分形图的绘制大多数可采用递归算法。


一.canto三分集。

**渲染框架上有方便绘制几何图形的ShapeRenderer类,它和Batch画笔都封装了调用底层渲染的接口。

注:**标签的段落无关分形算法,是渲染框架上的一些笔记。


三分集递归算法:

private void canto(int ax,int ay,int bx,int by){
		if((bx-ax)<c){
			renderer.line(ax, ay, bx, by);
		}
		else{
			int cx,cy,dx,dy;
			renderer.line(ax, ay, bx, by);
			cx=ax+(bx-ax)/3;
			cy=ay+50;
			dx=bx-(bx-ax)/3;
			dy=by+50;
			ay=ay+50;
			by=by+50;
			canto(ax,ay,cx,cy);
			canto(dx,dy,bx,by);
		}
	}


效果:


二.Koch妖魔曲线

算法(修改:增加深度参数):

public void koch(float ax,float ay,float bx,float by,int depth){
		//delpth为深度
		if(depth<1){
			renderer.line(ax, 600-ay, bx, 600-by);
		}
		else{
			float cx,cy,dx,dy,ex,ey;
			float l,alfa;
			
			depth-=1;
			
			cx=ax+(bx-ax)/3;
			cy=ay+(by-ay)/3;
			ex=bx-(bx-ax)/3;
			ey=by-(by-ay)/3;
			
			l=(float) Math.sqrt((ex-cx)*(ex-cx)+(ey-cy)*(ey-cy));
			alfa=(float) Math.atan((ey-cy)/(ex-cx));
			
			//绝对角度在方向上的修正
			if((alfa>=0&&(ex-cx)<0)||(alfa<0&&(ex-cx)<0)){
				alfa=alfa+PI;
			}
			
			dx=(float) (cx+Math.cos(alfa+PI/3)*l);
			dy=(float) (cy+Math.sin(alfa+PI/3)*l);
			koch(ax,ay,cx,cy,depth);
			koch(ex,ey,bx,by,depth);
			koch(cx, cy, dx, dy,depth);
			koch(dx, dy, ex, ey,depth);
		}
	}


最终效果:


比起三分集,妖魔曲线复杂一些,涉及到角度和方向上的计算,如果你把每条线段看成是有方向的向量,这些计算会更容易接受。算法中的alpha是绝对角度,两条线段的相对夹角不变,为60度但绝对角度是变化的,绝对角度的计算需要方向上的修正。见下图可粗略体会下(图作得粗糙别吐槽)



如果注释修正绝对角度的代码,结果会是这样子



妖魔曲线基本的算法就是这样。它的基本图元是一条直线,在此基础上可以修改其基本图元为一个封闭的几何图形来模拟雪花。

public void kochIcing(int depth,float... vertexs){
		int length=vertexs.length;
		if(length%2!=0)
			Gdx.app.error("kochIcing", "vertexsNum must be even");
		for(int i=0;i<length-2;i+=2){
			koch(vertexs[i], vertexs[i+1],vertexs[i+2],vertexs[i+3], depth);
		}
		koch(vertexs[length-2], vertexs[length-1],vertexs[0],vertexs[1], depth);
	}
图元为一个等边三角形:

fractal.kochIcing(5, 180,120,360,432,540,120);


待续...

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity分算法的运用是将分应用于Unity引擎中的游戏或可视化项目。分是一种自相似的几何结构,通过重复应用相似的规则或算法,可以生成复杂而有趣的图案。在Unity中,可以使用分算法来创建各种状和效果,以增强游戏的视觉效果或创建艺术作品。 其中,对象的状态和行为在Unity中也是很重要的概念。对象的状态可以包括计算的数字或其他输入的数值,而对象的行为可以包括进行数学运算或执行其他操作的方法。这些概念与分算法的运用密切相关。通过使用归技术,可以在Unity中实现分算法,其中算法在自身中进行归调用。这样可以生成复杂的分图案,并将其应用于游戏场景或其他项目中。 另外,还可以使用其他的算法来实现分效果,比如k-means聚类算法。该算法是一种基本的划分方法,通过将数据集分成多个簇来实现聚类分析。虽然k-means聚类算法在初始聚类中心的选择上比较敏感,但是它具有很强的局部搜索力和快速的收敛速度,适用于处理大数据集。在Unity中,可以将k-means聚类算法与分算法结合使用,以生成更加复杂和多样化的分效果。 综上所述,Unity分算法的运用是将分应用于游戏或可视化项目中,通过对象的状态和行为的定义,以及使用归技术和其他算法来生成复杂而有趣的分图案。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Python程序设计与算法思维(2021版)课后答案](https://blog.csdn.net/j273384523/article/details/126861769)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [【图像聚类】基于matlab GUI K-means算法图像聚类【含Matlab源码 1787期】](https://blog.csdn.net/TIQCmatlab/article/details/123534314)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值