我在C中使用turbo C ++在一个简单的图形库中工作,因为我开发了一个非常原始版本的绘画风格程序,每个都运行良好,但我无法使洪水填充算法工作。我使用4路泛洪填充算法,首先我尝试使用递归版本,但它只适用于小区域,填充大区域使其崩溃;阅读我发现实现它的显式堆栈版本解决了问题,但我没有真正看到它。
我开发了这样的堆栈:
struct node
{
int x, y;
struct node *next;
};
int push(struct node **top, int x, int y)
{
struct node *newNode;
newNode = (struct node *)malloc(sizeof(struct node));
if(newNode == NULL) //If there is no more memory
return 0;
newNode->x = x;
newNode->y = y;
newNode->next = *top;
*top = newNode;
return 1; //If we push the element correctly
}
int pop(struct node **top, int &x, int &y)
{
if(*top == NULL) //If the stack is empty
return 0;
struct node *temporal;
temporal = *top;
x = (*top)->x;
y = (*top)->y;
*top = (*top)->next;
free(temporal);
return 1; //If we pop an element
}
这是我对洪水填充功能的代码:
void floodFill(int x, int y, int color_to_replace, int color_to_fill)
{
if(color_to_replace == color_to_fill)
return;
struct node *stack = NULL;
if(push(&stack, x, y) == 0) //If we can´t push the pixel
return;
while(pop(&stack, x, y) == 1) //While are pixels in the stack
{
pixel(x, y, color_to_fill);
if(x+1 < 640 && read_pixel(x+1, y) == color_to_replace)
if(push(&stack, x+1, y) == 0)
return;
if(x-1 >= 0 && read_pixel(x-1, y) == color_to_replace)
if(push(&stack, x-1, y) == 0)
return;
if(y+1 < 480 && read_pixel(x, y+1) == color_to_replace)
if(push(&stack, x, y+1) == 0)
return;
if(y-1 >= 0 && read_pixel(x, y-1) == color_to_replace)
if(push(&stack, x, y-1) == 0)
return;
}
}
但它仍然无效,当我试图填补大片区域时它就停止了,因为我在我的程序中使用640 X 480分辨率确实是个问题;任何想法为什么它不工作?
答案 0 :(得分:5)
在推动堆栈上的新位置之前,尝试水平填充尽可能多的像素,而不是推动堆栈上的每个像素。请参阅Wikipedia article进行讨论。
答案 1 :(得分:3)
我在任何地方都没有看到任何限制......
你确定X和Y值不会超出图片吗?
编辑:
为什么它无法运作的额外想法: