% Fablab 2013, flower-wall / foldable fans function flower_wall(void) %Flower coordinates for(i=1:4) for(j=1:4) flowers((i-1)*4+j,1:3) = [(j-0.5)*5, (i-0.5)*5, 0]; end end %Output file: movOut = VideoWriter('FlowerWall.avi'); movOut.FrameRate = 5; open(movOut); frms = []; for(iterations=1:139) close all; figure(1); axis([0 20 0 20]); axis square; hold on; %Update in random order shuffled_array = randperm(16); for(i=1:16) if(shuffled_array(i)+4 <= 16), angle_north = flowers(shuffled_array(i)+4,3); else angle_north = 400; end %default if(shuffled_array(i)-4 > 0), angle_south = flowers(shuffled_array(i)-4,3); else angle_south = 400; end %default if(shuffled_array(i)~= 1 && shuffled_array(i)~= 5 && shuffled_array(i)~= 9 && shuffled_array(i)~= 13), angle_west = flowers(shuffled_array(i)-1,3); else angle_west = 400; end %default if(shuffled_array(i)~= 4 && shuffled_array(i)~= 8 && shuffled_array(i)~= 12 && shuffled_array(i)~= 16), angle_east = flowers(shuffled_array(i)+1,3); else angle_east = 400; end %default if((~mod(iterations,20)) && i==6) % shuffled_array(i) == 6 sensor = 720; %270/4; else sensor = 0; end flowers(shuffled_array(i),3) = calc_angle(flowers(shuffled_array(i),3), angle_south, angle_west, angle_north, angle_east, sensor); if(flowers(shuffled_array(i),3) > 270/4) myAngleLimit = 270/4; else myAngleLimit = flowers(shuffled_array(i),3); end draw_flower(flowers(shuffled_array(i),1:2), myAngleLimit); end currFrame = getframe; writeVideo(movOut,currFrame); end close(movOut); function myAngle = calc_angle(myAngle, south, west, north, east, sensor) avg = 0; avg_samples = 0; %Calc average of neighbors if(south~=400), avg = avg+south; avg_samples = avg_samples+1; end if(north~=400), avg = avg+north; avg_samples = avg_samples+1; end if(west~=400), avg = avg+west; avg_samples = avg_samples+1; end if(east~=400), avg = avg+east; avg_samples = avg_samples+1; end avg = avg/avg_samples; myAngle = myAngle*0.7+avg*0.2+map(sensor); end function angle = map(sensor) %Include time factor.. automatically there? angle = sensor; end function draw_flower(axel_coord, angle) draw_circle([axel_coord(1)+cos((270-angle*4)/180*pi)*1 axel_coord(2)+sin((270-angle*4)/180*pi)*1], 1.25, [1 0.8 0.1]); draw_circle([axel_coord(1)+cos((270-angle*3)/180*pi)*1 axel_coord(2)+sin((270-angle*3)/180*pi)*1], 1.25, [0 1 0]); draw_circle([axel_coord(1)+cos((270-angle*2)/180*pi)*1 axel_coord(2)+sin((270-angle*2)/180*pi)*1], 1.25, [0.2 0.2 1]); draw_circle([axel_coord(1)+cos((270-angle)/180*pi)*1 axel_coord(2)+sin((270-angle)/180*pi)*1], 1.25, [1 0.5 1]); draw_circle([axel_coord(1)+cos(3/2*pi)*1 axel_coord(2)+sin(3/2*pi)*1], 1.25, [1 1 1]); end function draw_circle(center, radius, color) %draw filled circle: THETA=linspace(0,2*pi,50); RHO=ones(1,50)*radius; [X,Y] = pol2cart(THETA,RHO); X=X+center(1); Y=Y+center(2); h=fill(X,Y,color); end end