ifs碼就是下面這個線性方程的係數

[a,b,e,c,d,f]

x(0)=0

y(0)=0

x(n)=a*x(n-1)+b*y(n-1)+e

y(n)=c*x(n-1)+d*y(n-1)+f

每一組[a,b,e,c,d,f]能把x0,y0代入方程後迭代n次,射到n個地方。其中a,b,c,d負責縮小和旋轉,e,f負責平移。a,b,c,d必須是0-1之間的數。要不然就可能吧xn射到無窮遠。e,f可以大於1。這樣的變換叫仿射變換

一組[a,b,e,c,d,f]通常無法形成分形圖。引入一個p是概率,決定射到這一組的點佔全部點的百分比。我們以4組為例:

a=[0 , 0.85, 0.2 , -0.15];

b=[0, 0.04, -0.26 ,0.28];

c=[0, -0.04 ,0.23 ,0.26];

d=[0.16 ,0.85 ,0.22 , 0.44];

e=[0, 0, 0 , 0 ];

f=[0 , 1.6, 1.6 , 0.44];

p=[0.01, 0.85, 0.07, 0.07];

這組數字就叫IFS(迭代函數系統)碼

下面利用這個ifs碼畫蕨類植物

n=100000;%至少10萬個點才能組成一幅圖

v=rand(n,1); %隨機數用於每一步做概率係數

x0=0;y0=0 ; %設定初始點(0 ,0)

x=[x0;zeros(n-1,1)]; y=[y0;zeros(n-1,1)]; %給x,y預設為n個0,先把空間占上。

for i=2:n %按規則計算下一點坐標

vv=v(i); %取概率

if vv<p(1) %概率小於p裡面第1數的點按照下面的規則進行仿射變換

x(i)=a(1)*x(i-1)+b(1)*y(i-1)+e(1);

y(i)=c(1)*x(i-1)+d(1)*y(i-1)+f(1);

elseif vv<p(1)+p(2) %概率小於p裡面前2個數的和的點按照下面的規則進行仿射變換

x(i)=a(2)*x(i-1)+b(2)*y(i-1)+e(2);

y(i)=c(2)*x(i-1)+d(2)*y(i-1)+f(2);

elseif vv<p(1)+p(2)+p(3)%概率小於p裡面前3個數的和的點按照下面的規則進行仿射變換

x(i)=a(3)*x(i-1)+b(3)*y(i-1)+e(3);

y(i)=c(3)*x(i-1)+d(3)*y(i-1)+f(3);

else%概率小於p裡面前4個數的和的點按照下面的規則進行仿射變換

x(i)=a(4)*x(i-1)+b(4)*y(i-1)+e(4);

y(i)=c(4)*x(i-1)+d(4)*y(i-1)+f(4);

end

end

plot(x(1:n),y(1:n),b.,markersize,1) ;%仿射變換完成以後把這些點列印到屏幕上。

axis equal

推薦閱讀:

相关文章