visualc++洪水填充图像递归算法错误
visual c++ flood fill image recursive algorithm error
我正在编写一个泛洪填充方法,用红色填充图像(狗的轮廓)。
在我的TestShellDlg.cpp中,是泛洪填充方法。CTestShellDlg::m_pScreenDb成员是一个包含图形并绘制图形的CDIB32位图类。
我想对当前像素进行采样,如果它不是黑色(轮廓的颜色),则将其染成红色。这是Dib3.cpp类中预先构建的getter:
void CDIB32::GetRGB(int x, int y, BYTE& r, BYTE& g, BYTE& b)
{
if (x >= Width() || y >= Height())
IERROR;
int off = y * ByteWid() + x * 4;
b = m_pBits[off];
g = m_pBits[off+1];
r = m_pBits[off+2];
}
下面是我在TestShellDlg.cpp类中的floodfill方法:
void CTestShellDlg::FloodFill(CPoint& mid)
{
byte r,g,b;
//while the current pixel colour is not black, set it to red and recursively loop
m_pScreenDib ->GetRGB(mid.x,mid.y, (byte) r,(byte) g,(byte)b);
while(r !=(byte)0, g !=(byte)0, b !=(byte)0)
{
m_pScreenDib -> SetRGB(mid.x, mid.y,(byte)255,(byte) 0,(byte) 0);
mid.x++;
FloodFill(mid);
mid.x--;
FloodFill(mid);
mid.y++;
FloodFill(mid);
mid.y--;
FloodFill(mid);
}
}
在构建和运行项目时,我在GetRGB()函数中的IERROR处获得了一个断点。
在堆栈中工作时,这种情况发生在x.x中期——经过几次运行之后。该程序似乎从未进入过中.y++.
我也尝试过将此作为我的停止条件:
while(mid.x < m_pScreenDib ->Width() && mid.y < m_pScreenDib -> Height())
具有相同的结果。
蜂箱里的任何人都能提供原因和可能的解决方案吗?非常感谢大家。
有几个问题。先解决这些问题,看看会发生什么:
-
您正在递归调用
FloodFill
,而r
、g
和b
并不都等于0。但是,您不会在while循环中更新这些值中的任何一个。那会给你一个无尽的循环。 -
另一个问题是:
mid.x++; FloodFill(mid); mid.x--; FloodFill(mid);
设x为100。在
mid.x++
之后,x将是101。然后执行x--
,使x再次为100。所以你用相同的x值递归调用FloodFill()
。我不认为这是你想要的。 -
在
FloodFill
中,在再次调用FloodFill
之前递增x
。但您不会检查是否已到达图像的右边界,因此FloodFill
将被递归调用,x
的值会越来越大,直到您获得堆栈溢出、访问冲突,或者由于整数溢出(无论先发生什么),x
被设置为0 agein。
相关文章:
- C++:正在检查LinkedList中的回文-递归方法-错误
- 需要为 C++ 中的以下问题设计递归算法
- 这种用于查找连续子数组中最大和的递归算法有什么优势吗?
- 运行合并排序递归算法时EXC_BAD_ACCESS错误
- 如何改进搜索二项式系数的递归算法
- 如何转换多次调用自己的递归算法?
- 如何将字符串保存在最长的常见子序列递归算法中
- 编写递归算法以从链表中删除元素.编写递归算法以将元素添加到链表中
- 指针似乎迷失在递归算法中
- 如何从递归算法返回节点
- 从递归算法到迭代算法
- 可传递值影响递归算法的渐近时间复杂性
- 我的递归算法中的问题,用于查找所有最短、唯一的路径
- 带有两个递归调用的递归算法的时间复杂性
- 这种递归算法有什么问题?
- C++递归算法中抛出异常
- 将条件递归算法转换为迭代算法
- 递归算法中的分段错误
- visualc++洪水填充图像递归算法错误
- 递归算法的代码逻辑错误