我的任务是用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是问题吗?其他一切工作正常,这只是洪水填充是不正确的工作。
1条答案
按热度按时间brvekthn1#
在MATLAB中,参数是按值传递的,当你改变函数中的
M
时,你改变了它的一个副本。你需要返回修改后的M
,代码才能正常工作: