嘿伙计们我正在使用我自己的自定义帧缓冲区并将基元绘制到其中。哪个工作正常。
然而,我的问题是在屏幕上将基元填充为纯色。比如这种情况下的圆圈。
问题是我试图填补它,我获得了堆栈溢出错误(这意味着递归函数永远不会结束)。
这是用于填充区域的递归函数...
private void filler(int position, byte r, byte g, byte b)
{
buffer[position] = r;
buffer[position + 1] = g;
buffer[position + 2] = b;
int northPosition = position - rowLength;
int southPosition = position + rowLength;
int westPosition = position - 3;
int eastPosition = position + 3;
//fills squares west of the current
/**/
System.out.println(position);
//fills squares to the east of the current
if(buffer[eastPosition] != r && buffer[eastPosition + 1] != g && buffer[eastPosition + 2] != b)
{
System.out.println("runs");
filler(eastPosition, r, g, b);
}
System.out.println(position);
//fills squares north of the current
if(buffer[northPosition] != r && buffer[northPosition + 1] != g && buffer[northPosition + 2] != b)
{
filler(northPosition,r,g,b);
}
//fills squares south of current
if(buffer[southPosition] != r && buffer[southPosition + 1] != g && buffer[southPosition + 2] != b)
{
filler(southPosition,r,g,b);
}
//fills squares west of current
if(buffer[westPosition] != r && buffer[westPosition + 1] != g && buffer[westPosition + 2] != b)
{
filler(westPosition, r, g, b);
}
}
请注意代码的北部和南部部分工作得非常好,并且只有当代码的东部和西部部分一起工作时才会出现错误(但是如果我从函数中移除一个或另一个,它们会自行正常工作)。如果有人看到问题你可以向我解释为什么东西方会影响彼此吗?
非常感谢!
答案 0 :(得分:1)
你的方法永远不会回来。您填充的每个点通常在其旁边至少有一个像素,因此该方法暂时不会返回,而是沿着调用堆栈向下填充此像素。这导致非常深的调用堆栈,并且堆栈溢出限制了要填充的区域的大小。因此,如果你想使用java并填充大区域,你应该考虑另一种算法。
答案 1 :(得分:0)
我认为您正在尝试实施Floodfill算法(请参阅german Wikipedia以获得一个很好的伪代码实现)。由于您显然使用的是一维数组,因此必须确保不要跨越行(在东/西的情况下)或数组的边界(对于所有情况)。
如果下一步与当前像素位于同一行并且它位于数组的边框内,则只需要向东/向西方向前进。所以我会改变你的代码(我没有测试它):
private void filler(int position, byte r, byte g, byte b)
{
buffer[position] = r;
buffer[position + 1] = g;
buffer[position + 2] = b;
int northPosition = position - rowLength;
int southPosition = position + rowLength;
int westPosition = position - 3;
int eastPosition = position + 3;
//fills squares west of the current
/**/
System.out.println(position);
//fills squares to the east of the current
if(eastPosition < buffer.length && eastPosition/rowLength == position/rowLength && buffer[eastPosition] != r && buffer[eastPosition + 1] != g && buffer[eastPosition + 2] != b)
{
System.out.println("runs");
filler(eastPosition, r, g, b);
}
System.out.println(position);
//fills squares north of the current
if(northPosition >= 0 && buffer[northPosition] != r && buffer[northPosition + 1] != g && buffer[northPosition + 2] != b)
{
filler(northPosition,r,g,b);
}
//fills squares south of current
if(southPosition < buffer.length && buffer[southPosition] != r && buffer[southPosition + 1] != g && buffer[southPosition + 2] != b)
{
filler(southPosition,r,g,b);
}
//fills squares west of current
if(westPosition >= 0 && westPosition/rowLength == position/rowLength && buffer[westPosition] != r && buffer[westPosition + 1] != g && buffer[westPosition + 2] != b)
{
filler(westPosition, r, g, b);
}
}
答案 2 :(得分:0)
也添加边界条件:是南/北/东/西位置?
否则向西会向北跳,依此类推,轻松递归。 一旦没有递归,索引超出界限就会发生。