第二代和第一代有些许不同,每体积沙子被雨水打到后会增加一定量的含水量,当最上面一层的含水量平均值大于某个值得时候,最上面一层沙子就会塌陷。
不多说啥了,看代码(个人练习记录,大佬轻喷)
clear all;
% 设置GUI按键
plotbutton=uicontrol('style','pushbutton','string','运行', 'fontsize',12, 'position',[150,400,50,20], 'callback', 'run=1;');
erasebutton=uicontrol('style','pushbutton','string','停止','fontsize',12,'position',[250,400,50,20],'callback','freeze=1;');
quitbutton=uicontrol('style','pushbutton','string','退出','fontsize',12,'position',[350,400,50,20],'callback','stop=1;close;');
%设置元胞大小
n=100;
C = zeros(n,n);
%设置种类 0:空气 1:沙子 2:雨滴
ca= zeros(n,n);
wa=zeros(n,n);%含水量
%沙堆和雨滴的数量
numsand=zeros(10000,1);
numrain=zeros(10000,1);
numceng=zeros(10000,1);
time=0;
%设置沙堆
for i=10:90
for j=1:n
if i<=35
if j<=sqrt(i-10)*5
ca(j,i)=1;
wa(j,i)=10;
end
elseif i<=65
if j<=25
ca(j,i)=1;
wa(j,i)=10;
end
else
if j<=sqrt(90-i)*5
ca(j,i)=1;
wa(j,i)=10;
end
end
end
end
%绘制沙堆
for i=2:98
for j=3:97
k=0;
for i1=1:3
for j1=1:3
if ca(j+j1-2,i+i1-2)==1
k=k+1;
end
end
end
if k==1||k==2||k==3
C(j,i)=60;
elseif k==4||k==5||k==6
C(j,i)=57;
elseif k==7||k==8||k==9
C(j,i)=55;
end
end
end
image(C)
set(gca,'YDir','normal')
stop= 0; run = 0;freeze = 0;
% for i1=2:8
% C(100,i1*10)=20;
% end
while stop==0
if run==1
%沙堆重绘 颜色由上方五个决定
for i=2:98
for j=3:97
k=0;
for i1=1:3
for j1=1:3
if ca(j+j1-2,i+i1-2)==1
k=k+1;
end
end
end
if k==1||k==2||k==3
C(j,i)=60;
elseif k==4||k==5||k==6
C(j,i)=57;
elseif k==7||k==8||k==9
C(j,i)=55;
end
end
end
%模拟雨滴下落及对沙堡的影响
for j2=2:100
for i2=1:100
if ca(j2,i2)==2
C(j2,i2)=0;
ca(j2,i2)=0;
if ca(j2-1,i2)==1 %雨滴遇到沙砾时
wa(j2-1,i2)=wa(j2-1,i2)+15; %沙砾含水量增加,预定增加15%
%判断含水量的变化会不会冲刷沙堡形状
sum=0;k_1=0;
for i_1=1:100
if ca(j2-1,i_1)==1
sum=sum+wa(j2-1,i_1);
k_1=k_1+1;
end
end
avg=sum/k_1;
if avg>=55
for i_1=1:100
ca(j2-1,i_1)=0;
end
%填入塌陷的沙砾
num_sand=k_1;
for j_2=1:100
for i_2=2:50
if num_sand>0
if ca(j_2,i_2+1)==1&&ca(j_2,i_2-1)==0
ca(j_2,i_2)=1;
num_sand=num_sand-1;
end
end
end
for i_2=98:-1:51
if num_sand>0
if ca(j_2,i_2-1)==1&&ca(j_2,i_2+1)==0
ca(j_2,i_2)=1;
num_sand=num_sand-1;
end
end
end
end
end
else %正常下落
ca(j2-1,i2)=2;
C(j2-1,i2)=20;
end
end
end
end
%生成雨滴
a=unidrnd(n);
C(n,a)=20;
ca(n,a)=2;
%数据储存
time=time+1;
for j3=1:100
for i3=1:100
if ca(j3,i3)==1
numsand(time)=numsand(time)+1;
end
end
end
numrain(time)=time/(1375-numsand(time));
for j_3=1:100
if ca(j_3,50)==1
numceng(time)=numceng(time)+1;
end
end
%图像更新
image(C)
set(gca,'YDir','normal')
if time==3000
run=0;
end
% run=0;
end
if freeze==1
run = 0;
freeze = 0;
end
drawnow %更新图窗并处理回调
end