IFS為迭代函數系統,是一種構造分形的方法。
方法的核心是以概率p的方式對初始點進行仿射平移變換。
變換公式為:
x(k+1)=a*x(k) + b*y(k) + e
y(k+1)=c*x(k) + d*y(k) + f
關鍵是確定IFS碼表,只要碼表確定了,后面的編程套路基本一樣。
下面列兩個常見的碼表及分形效果。
Sierpinski墊IFS碼表:
w | a | b | c | d | e | f | p |
1 | 0.5 | 0 | 0 | 0.5 | 0 | 0 | 0.333 |
2 | 0.5 | 0 | 0 | 0.5 | 0.25 | 0.433 | 0.333 |
3 | 0.5 | 0 | 0 | 0.5 | 0.5 | 0 | 0.333 |
matlab代碼如下:
clear all; close all; clc; n=500000; x=zeros(n,1); y=zeros(n,1); for k=2:n p=rand(1); if p < 0.33 x(k)=0.5*x(k-1)+0*y(k-1); y(k)=0*x(k-1)+0.5*y(k-1); elseif p< 0.66 x(k)=0.5*x(k-1)+0*y(k-1)+0.25; y(k)=0*x(k-1)+0.5*y(k-1)+0.433; else x(k)=0.5*x(k-1)+0*y(k-1)+0.5; y(k)=0*x(k-1)+0.5*y(k-1); end end plot(x,y,'.')
效果:
Barnsley羊齒葉IFS碼表:
w | a | b | c | d | e | f | p |
1 | 0 | 0 | 0 | 0.16 | 0 | 0 | 0.01 |
2 | 0.85 | 0.04 | -0.04 | 0.85 | 0 | 1.6 | 0.85 |
3 | 0.2 | -0.26 | 0.23 | 0.22 | 0 | 1.6 | 0.07 |
4 | -0.15 | 0.28 | 0.26 | 0.24 | 0 | 0.44 | 0.07 |
matlab代碼如下:
clear all; close all; clc; n=100000; x=zeros(n,1); y=zeros(n,1); for k=2:n p=rand(1); if p < 0.01 y(k)=0.16*y(k-1); elseif p < 0.86 x(k)=0.85*x(k-1)+0.04*y(k-1); y(k)=-0.04*x(k-1)+0.85*y(k-1)+1.6; elseif p < 0.93 x(k)=0.2*x(k-1)-0.26*y(k-1); y(k)=0.23*x(k-1)+0.22*y(k-1)+1.6; else x(k)=-0.15*x(k-1)+0.28*y(k-1); y(k)=0.26*x(k-1)+0.24*y(k-1)+0.44; end end plot(x,y,'.');
效果:
如何構造IFS碼表是一個難點,有碼表后生成分形其實是比較簡單的。