我尝试在MATLAB中使用递归Flood_Fill算法填充一个圆,但它不起作用

tkqqtvp1  于 2022-12-27  发布在  Matlab
关注(0)|答案(1)|浏览(171)

我的任务是用MATLAB中的4路递归Flood_Fill算法填充两个重叠圆之间的差。我用鼠标选择起点,并为它创建了一个函数。

function [] = Flood_Fill(M,x,y,new_color,old_color,border_color)

if(x < 0 || y < 0 || x >= 60 || y >= 60 || M(x,y) ~= old_color) % M is a 60x60 array
    return
else
    M(x,y) = new_color;
    pause(0.16);
    image(M');

Flood_Fill(M,x+1,y,new_color,old_color,border_color);
Flood_Fill(M,x-1,y,new_color,old_color,border_color);
Flood_Fill(M,x,y+1,new_color,old_color,border_color);
Flood_Fill(M,x,y-1,new_color,old_color,border_color);

end
disp("looped");
end

我在我的程序中调用这个函数,它确实工作了,部分地,它开始填充圆。但是当它检测到一个角,它不填充它,留下一个非彩色的像素。它也“忘记”它曾经在像素上绘制时,它“返回”。例如,这里它进入一个无限循环,因为它绘制了一条线,满足3个相邻的已经绘制的像素,返回,然后再做一次(明亮颜色补丁右下角的空白区域):Flood fill algorithm entered a loop
据我所知,我的算法看起来不错,但我不知道为什么它忘记了它已经设置了M(x,y)= new_color。我也不知道程序将如何完成,即使它已经填充了圆圈,一旦它“返回”,它忘记了绘制的像素,所以它肯定会卡住。我真的很困惑,我真的不熟悉MATLAB。
8路算法效果更好,但这意味着我必须画出至少2个像素的圆圈边界,这样才不会重叠。我试着扩大搜索范围,例如,循环x+n(其中n = 1,2,3 ...)在所有递归调用中,显然,这给出了一个错误...我试图添加一些“边缘情况”,它会跳过一行或填充边界旁边的像素,但正如我所说的,它忘记了曾经发生过的事情。它看起来也很可怕的代码方面。在所有的材料洪水填补在互联网上,它似乎只是填补空间。我坚持尝试做一个递归算法。MATLAB是问题吗?其他一切工作正常,这只是洪水填充是不正确的工作。

brvekthn

brvekthn1#

在MATLAB中,参数是按值传递的,当你改变函数中的M时,你改变了它的一个副本。你需要返回修改后的M,代码才能正常工作:

function M = Flood_Fill(M,x,y,new_color,old_color,border_color)

if(x < 0 || y < 0 || x >= 60 || y >= 60 || M(x,y) ~= old_color) % M is a 60x60 array
    return
else
    M(x,y) = new_color;
    pause(0.16);
    image(M');

M = Flood_Fill(M,x+1,y,new_color,old_color,border_color);
M = Flood_Fill(M,x-1,y,new_color,old_color,border_color);
M = Flood_Fill(M,x,y+1,new_color,old_color,border_color);
M = Flood_Fill(M,x,y-1,new_color,old_color,border_color);

end
disp("looped");
end

相关问题