-
18-09-2019 - |
문제
im 에서 작업하고 간단한 그래픽 라이브러리에서는 C turbo C++문 개발하고 매우 기본 버전은 페인트 스타일을 프로그램으로,모든 것이 잘 작동 하지만 얻을수 있는 알고리즘을 작동합니다.Im 를 사용하여 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;
}
}
하지만 그것은 여전히 작업할 때,im triying 을 채우 큰 영역을 그냥 정지 및 주셔서 대단히 감사드 작업을 함께 해상도 640X480 내 프로그램으로 이 문제를;어떤 아이디어를 왜요?
해결책
대신 추진에 있는 모든 픽셀 스택을 채우기 위해 시도는 가능한 한 많은 픽셀 수평으로 추진하기 전에 새로운 위치를 선택 합니다.보 위키 문서 에 대한 논의한다.
다른 팁
보이지 않는데 boundschecking 하는 어느 곳에서든지...
당신은 확실한 X 와 Y 값이지의 그림?
편집:
여분의 아이디어를 왜 그것은 작동하지 않을 수 있습:
- 의 읽고 쓰는 픽셀 기능 버그
- 색상 값을 다시 얻을 확대를 32 비트(기 때문에 인스턴스에 대한 당신의 사진은 16 비트)그리고 색깔 있고 읽고 쓰기에 다시 다시 정확하게 일치하지 않습니다.(예:당신이 쓰 색상:0xff00ff 하지만 당신은 다시 얻을:0xf800f8 기 때문에 색상을 가지고 확장에서 16 비트)그리고 그 결과 홍수에서 채우려고 영원히 계속됩니다.
제휴하지 않습니다 StackOverflow