分形分形的遞歸算法

遞歸算法是把問題轉化爲規模縮小了的同類問題的子問題。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);


待續...

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章