% Matlab code for a beautiful Fractal Fern 
% ... created from the IFS defined in Table III.3, pg.86 of the handout
% just type "Fern" in the Matlab command window to run it
clear all
iterations=10000; %the number of iterations
% recall, the transformations are of the form A*[x,y]+t
% and, there are four such transformations ...
A1=[0 0 ; 0 0.16];
A2=[0.85 0.04 ; -0.04 0.85];
A3=[0.2 -0.26 ; 0.23 0.22];
A4=[-0.15 0.28 ; 0.26 0.24];
t1=[0 ; 0];
t2=[0 ; 1.6];
t3=[0 ; 1.6];
t4=[0 ; 0.44];
% here are the probabilities with which each transformation is applied
% notice that p1+p2+p3+p4=1
p1=0.01;
p2=0.85;
p3=0.07;
p4=0.07;
%let's introduce a Rotation,
stp=200;
theta_max=2*pi;
%if we want to make an animation
mov=avifile('trippyFern.avi'); 
for j=1:stp+1
theta=(j-1)*(theta_max/stp);
R=[cos(theta) -sin(theta) ; sin(theta) cos(theta)];
% the initial point
x(1)=0;
y(1)=0;
% but, let's write the (x,y) points as a vector, v
v=[0;0]; % here is the intial point 
for n=2:iterations
  % choose a random number, k, between 0 and 1
  k=rand; 
  % depending on your random number ...
  % do one of the four transformations to get a new point
  if k<p1 
     v=A1*v+t1;
  elseif k<p1+p2
     v=R*A2*v+t2;
  elseif k<p1+p2+p3
     v=A3*v+t3;
  else
     v=A4*v+t4;
  end
  % now, go back and define your (x,y) point as elements of the vector v
  x(n)=v(1);
  y(n)=v(2);
end
%now, let's plot all those (x,y) points that we just computed!
figure(1)
%opengl software %this is a fix to ensure that Matlab won't crash :)
hold off
plot(x,y,'.','Color',[0 .5 0],'Markersize',1)
% uncomment the next two lines to see the initial point in red
% hold on
% plot(x(1),y(1),'r*','Markersize',4)
% axis('equal','off');
axis('square','off');
set(gcf, 'color', 'white');
F(j)=getframe;
mov=addframe(mov,F(j));
end;
mov=close(mov);