matlab画分形图之二:ifs码仿射变换法画蕨类植物
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
推荐阅读: