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

推荐阅读:

相关文章