clc
clear
close all
row=20;%栅格的行和列
col=24;
sign=zeros(row,col);%障碍矩阵
sign(10,9:12)=1;%设置障碍
sign(4:6,6:9)=1;%设置障碍
sign(15:16,11:14)=1;%设置障碍
figure(1)%画图
hold on
axis([0 col 0 row]);
grid on;
title('分区图1')
for i=1:row
for j=1:col
if sign(i,j)==1
y=[i-1,i-1,i,i];
x=[j-1,j,j,j-1];
h=fill(x,y,'k');
set(h,'facealpha',1)
end
end
end
sign_ori=sign;%记录原始的障碍矩阵
sign_fenqu=[];
fenqu_num=1;%分区数量初始值
while true
sign_temp=zeros(row,col);
for i=1:col
if ~isempty(find(sign(:,i)==0))
S_col=i;%区域的起始列
break
end
end
flag_fangxiang=0;%搜索方向是自下而上还是自上而下
if sign(1,S_col)==1&&sign(row,S_col)==0
flag_fangxiang=1;
end
flag1=0;
if flag_fangxiang==0%自下而上搜索
for i=1:row
if flag1==0&&sign(i,S_col)==0
S1_row=i;%记录起始行
flag1=1;
end
if flag1==1&&sign(i,S_col)==1
E1_row=i-1;%记录终止行
break
elseif flag1==1&&i==row
E1_row=i;
end
end
sign(S1_row:E1_row,S_col)=1;%探索过的部分标为1
sign_temp(S1_row:E1_row,S_col)=1;
if S_col~=col
for j=S_col+1:col
flag1=0;
for i=1:row
if flag1==0&&sign(i,j)==0
S2_row=i;%记录起始行
flag1=1;
end
if flag1==1&&sign(i,j)==1
E2_row=i-1;
break
elseif flag1==1&&i==row
E2_row=i;
end
end
flag_S=test_fun([S1_row j-1],[S2_row j],sign_ori);%判断相邻两列的上端点是否连续
flag_E=test_fun([E1_row j-1],[E2_row j],sign_ori);%判断相邻两列的下端点是否连续
if flag_S==1||flag_E==1
sign_fenqu{fenqu_num}=sign_temp;
fenqu_num=fenqu_num+1;
break
end
sign(S2_row:E2_row,j)=1;
sign_temp(S2_row:E2_row,j)=1;
S1_row=S2_row;
E1_row=E2_row;
end
else
sign_fenqu{fenqu_num}=sign_temp;
end
elseif flag_fangxiang==1%自上而下搜索
for i=row:-1:1
if flag1==0&&sign(i,S_col)==0
S1_row=i;%记录起始行
flag1=1;
end
if flag1==1&&sign(i,S_col)==1
E1_row=i+1;
break
elseif flag1==1&&i==1
E1_row=i;
end
end
sign(E1_row:S1_row,S_col)=1;
sign_temp(E1_row:S1_row,S_col)=1;
if S_col~=col
for j=S_col+1:col
flag1=0;
for i=row:-1:1
if flag1==0&&sign(i,j)==0
S2_row=i;%记录起始行
flag1=1;
end
if flag1==1&&sign(i,j)==1
E2_row=i+1;
break
elseif flag1==1&&i==1
E2_row=i;
end
end
flag_S=test_fun([S1_row j-1],[S2_row j],sign_ori);%判断相邻两列的上端点是否连续
flag_E=test_fun([E1_row j-1],[E2_row j],sign_ori);%判断相邻两列的下端点是否连续
if flag_S==1||flag_E==1
sign_fenqu{fenqu_num}=sign_temp;
fenqu_num=fenqu_num+1;
break
end
sign(E2_row:S2_row,j)=1;
sign_temp(E2_row:S2_row,j)=1;
S1_row=S2_row;
E1_row=E2_row;
end
else
sign_fenqu{fenqu_num}=sign_temp;
end
end
if isempty(find(sign==0))
sign_fenqu{fenqu_num}=sign_temp;
break
end
end
yanse={'r','m','c','b','y','g'};%分区的颜色
for ii=1:length(sign_fenqu)
sign_temp=sign_fenqu{ii};
for i=1:row
for j=1:col
if sign_temp(i,j)==1
y=[i-1,i-1,i,i];
x=[j-1,j,j,j-1];
h=fill(x,y,yanse{mod(ii,6)+1});
set(h,'facealpha',0.5)
end
end
end
ind=find(sign_temp);
ind2=zeros(length(ind),2);
[ind2(:,1),ind2(:,2)]=ind2sub([row,col],ind);
ind2=fliplr(ind2-0.5);
ind3=mean(ind2);
text(ind3(1),ind3(2),num2str(ii))
sub_num=sum(sum(sign_temp));
disp(['区域',num2str(ii),'格子数:',num2str(sub_num)])
end
sign=sign_ori;
fenqu_num=length(sign_fenqu);%分区的数量
figure(2)%画图
hold on
axis([0 col 0 row]);
grid on;
title('分区图2')
for i=1:row
for j=1:col
if sign(i,j)==1
y=[i-1,i-1,i,i];
x=[j-1,j,j,j-1];
h=fill(x,y,'k');
set(h,'facealpha',1)
end
end
end
sign_border=sign_fenqu;%画边界图
for ii=1:fenqu_num
sign_temp=sign_fenqu{ii};
sign_temp=bwperim(sign_temp);
sign_border{ii}=sign_temp;
for i=1:row
for j=1:col
if sign_temp(i,j)==1
y=[i-1,i-1,i,i];
x=[j-1,j,j,j-1];
h=fill(x,y,yanse{mod(ii,6)+1});
set(h,'facealpha',0.5)
end
end
end
ind=find(sign_temp);
ind2=zeros(length(ind),2);
[ind2(:,1),ind2(:,2)]=ind2sub([row,col],ind);
ind2=fliplr(ind2-0.5);
ind3=mean(ind2);
text(ind3(1),ind3(2),num2str(ii))
end
for ii=1:fenqu_num
sign_temp=sign_border{ii};
ind=find(sign_temp);
ind2=zeros(length(ind),2);
[ind2(:,1),ind2(:,2)]=ind2sub([row,col],ind);
ind2=fliplr(ind2-0.5);
add=[num2str(ii),'.xlsx'];
xlswrite(add,ind2)
end
评论0