1、function =testCA(n)z = zeros(n,n); cells = z; cells(n/2,.25*n:.75*n) = 1; cells(.25*n:.75*n,n/2) = 1;imh = image(cat(3,cells,z,z); set(imh, erasemode, none) axis equal axis tight %nx=52; %must be divisible by 4 ny=100; Pbridge = .05; z=zeros(nx,ny); o=ones(nx,ny); sand = z;sandNew = z;gnd = z ;gnd(1
2、:nx,ny-3)=1 ;% the ground line gnd(nx/4:nx/2+4,ny-15)=1; %the hole line gnd(nx/2+6:nx,ny-15)=1; %the hole line gnd(nx/4, ny-15:ny) = 1; %side line gnd(3*nx/4, 1:ny) = 1 ; % for i=1:1000 p=mod(i,2); %margolis neighborhood sand(nx/2,ny/2) = 1; %add a grain at the top %upper left cell update xind = 1+p
3、:2:nx-2+p; yind = 1+p:2:ny-2+p; %randomize the flow - 10% of the time vary = rand(nx,ny) .9 ; vary1 = 1-vary; sandNew(xind,yind) = . gnd(xind,yind).*sand(xind,yind) + . (1-gnd(xind,yind).*sand(xind,yind).*sand(xind,yind+1) .* . (sand(xind+1,yind+1)+(1-sand(xind+1,yind+1).*sand(xind+1,yind); sandNew(
4、xind+1,yind) = . gnd(xind+1,yind).*sand(xind+1,yind) + . (1-gnd(xind+1,yind).*sand(xind+1,yind).*sand(xind+1,yind+1) .* . (sand(xind,yind+1)+(1-sand(xind,yind+1).*sand(xind,yind); sandNew(xind,yind+1) = . sand(xind,yind+1) + . (1-sand(xind,yind+1) .* . ( sand(xind,yind).*(1-gnd(xind,yind) + . (1-san
5、d(xind,yind).*sand(xind+1,yind).*(1-gnd(xind+1,yind).*sand(xind+1,yind+1); sandNew(xind+1,yind+1) = . sand(xind+1,yind+1) + . (1-sand(xind+1,yind+1) .* . ( sand(xind+1,yind).*(1-gnd(xind+1,yind) + . (1-sand(xind+1,yind).*sand(xind,yind).*(1-gnd(xind,yind).*sand(xind,yind+1); %scramble the sites to m
6、ake it look better temp1 = sandNew(xind,yind+1).*vary(xind,yind+1) + . sandNew(xind+1,yind+1).*vary1(xind,yind+1); temp2 = sandNew(xind+1,yind+1).*vary(xind,yind+1) + . sandNew(xind,yind+1).*vary1(xind,yind+1); sandNew(xind,yind+1) = temp1; sandNew(xind+1,yind+1) = temp2; sand=sandNew; set(imh,cdata
7、,cat(3,z,sand,gnd) drawnow end %build the GUI %define the plot button plotbutton=uicontrol(style,pushbutton,string,Run,fontsize,12,position,100,400,50,20, callback, run=1;); %define the stop button erasebutton=uicontrol(style,pushbutton,string,Stop, fontsize,12,position,200,400,50,20,callback,freeze
8、=1;);%define the Quit button quitbutton=uicontrol(style,pushbutton,string,Quit,fontsize,12,position,300,400,50,20,callback,stop=1;close;);number = uicontrol(style,text, string,1, fontsize,12, position,20,400,50,20); stop= 0; %wait for a quit button push run = 0; %wait for a draw freeze = 0; %wait fo
9、r a freeze while (stop=0) if (run=1) %nearest neighbor sum sum(x,y) = cells(x,y-1) + cells(x,y+1) +cells(x-1, y) + cells(x+1,y) +cells(x-1,y-1) + cells(x-1,y+1) + cells(3:n,y-1) + cells(x+1,y+1); % The CA rule cells = (sum=3) | (sum=2 & cells); %draw the new image set(imh, cdata, cat(3,cells,z,z) ) %update the step number diaplay stepnumber = 1 + str2num(get(number,string); set(number,string,num2str(stepnumber) end if (freeze=1) run = 0; freeze = 0; end drawnow %need this in the loop for controls to workend