Я немножко лентяй и не захотел разбираться с новым алгоритмом, но постарался модифицировать старый. Для этого я после каждого перекрашивания точки стал выводить матрицу в виде рисунка и смотреть, как наш алгоритм закрашивает матрицу. Посмотрел, и мне это не понравилось: из-за того, что у нас вполне определенное направление обхода соседних точек, закрашивание выстраивается в линию, и большая область единиц может обходиться таким образом, что каждая следуюшая точка будет новым вложением рекурсии, значит, подумал я, надо искусственно задать обход точек по такому направлению, чтобы рекурсия почаще замыкалась и глубина вложения была поменьше. Как это сделать? А давайте запустим закраску маленькими закручивающимися спиралями, тогда по окончанию этого "закручивания" для всех внутренних точек этой спирали рекурсионная цепочка будет обрываться... Конечно, нет гарантий, что для большой области, мы не превысим отведенный нам максимум вложений, но, во всяком случае, мы сможем работать со значительно бОльшими областями. Вот, что у меня получилось:
Код:
function sol=es()
set(0,'RecursionLimit',2000)
global M;
global count
count=1;
X=2;
M=imread('Ttext1.tif');
M=double(M);
[a b]=size(M);
for v=1:a
for w=1:b
if ( M(v,w) == 1 )
M;
find_pattern(v,w,X);
contourf(M,X,'EdgeColor','none')
pause(0.1);
X=X+1;
end
end
end
sol=M;
Код:
function z=find_pattern(i,j,X)
global M count
if( M(i,j) == 1 )
count=mod(count,30)+1;
M(i,j)= X;
% contourf(M,X,'EdgeColor','none')
% pause(0.0001);
switch count
case {1,2,3,4,5,6,7,8,9}
if M(i-1,j)==1 z=feval('find_pattern',i-1,j,X); end
if M(i,j+1)==1 z=feval('find_pattern',i,j+1,X); end
if M(i+1,j)==1 z=feval('find_pattern',i+1,j,X); end
if M(i,j-1)==1 z=feval('find_pattern',i,j-1,X); end
case {10,11,12,13,14,15,16,17}
if M(i,j+1)==1 z=feval('find_pattern',i,j+1,X); end
if M(i+1,j)==1 z=feval('find_pattern',i+1,j,X); end
if M(i,j-1)==1 z=feval('find_pattern',i,j-1,X); end
if M(i-1,j)==1 z=feval('find_pattern',i-1,j,X); end
case {18,19,20,21,22,23,24}
if M(i+1,j)==1 z=feval('find_pattern',i+1,j,X); end
if M(i,j-1)==1 z=feval('find_pattern',i,j-1,X); end
if M(i-1,j)==1 z=feval('find_pattern',i-1,j,X); end
if M(i,j+1)==1 z=feval('find_pattern',i,j+1,X); end
case {25,26,27,28,29,30}
if M(i,j-1)==1 z=feval('find_pattern',i,j-1,X); end
if M(i-1,j)==1 z=feval('find_pattern',i-1,j,X); end
if M(i,j+1)==1 z=feval('find_pattern',i,j+1,X); end
if M(i+1,j)==1 z=feval('find_pattern',i+1,j,X); end
end
z=M;
end