Пользователь
Регистрация: 11.12.2013
Сообщений: 56
|
Построчный алгоритм заполнения с затравкой (Си)
помогите найти ошибку, реализовывал алгоритм по псевдокоду из методички, все компилируется и рисует, но только для строк ниже затравочного пикселя
алгоритм
Код:
bool Push(POINT **points, int *count, POINT *point)
{
if((*count) < 0) return false;
POINT *pointer;
if((*count) == 0) pointer = (POINT*) malloc(sizeof(POINT));
else pointer = (POINT*) realloc(*points, ((*count) + 1) * sizeof(POINT));
if(pointer == NULL) return false;
*points = pointer;
(*points)[(*count)++] = *point;
return true;
}
bool Pop(POINT **points, int *count, POINT *point)
{
if((*count) <= 0) return false;
*point = (*points)[--(*count)];
POINT *pointer = (POINT*) realloc(*points, (*count) * sizeof(POINT));
if(pointer == NULL) return false;
*points = pointer;
return true;
}
void FloodFill_3(HDC hdc, POINT point, COLORREF color, COLORREF border) //Построчный алгоритм заполнения с затравкой
{
int count = 0;
POINT *points;
Push(&points, &count, &point);
COLORREF bg = GetPixel(hdc, point.x, point.y);
while(count != 0)
{
POINT tmp;
Pop(&points, &count, &tmp);
SetPixel(hdc, tmp.x, tmp.y, color);
int x = tmp.x;
tmp.x++;
while(GetPixel(hdc, tmp.x, tmp.y) != border)
{
SetPixel(hdc, tmp.x, tmp.y, color);
tmp.x++;
}
int x_right = tmp.x - 1;
tmp.x = x;
tmp.x--;
while(GetPixel(hdc, tmp.x, tmp.y) != border)
{
SetPixel(hdc, tmp.x, tmp.y, color);
tmp.x--;
}
int x_left = tmp.x + 1;
tmp.x = x;
//проверка для строки выше
tmp.x = x_left;
tmp.y++;
while(tmp.x <= x_right)
{
bool flag = false;
while((GetPixel(hdc,tmp.x,tmp.y) != border) && (GetPixel(hdc,tmp.x,tmp.y) != color) && (tmp.x < x_right))
{
if(flag == false) flag = true;
tmp.x++;
}
if(flag)
if((tmp.x == x_right) && (GetPixel(hdc,tmp.x,tmp.y) != border) && (GetPixel(hdc,tmp.x,tmp.y) != color))
Push(&points, &count, &tmp);
else
Push(&points, &count, &Point(tmp.x-1,tmp.y));
flag = false;
int x_in = tmp.x;
while(((GetPixel(hdc,tmp.x,tmp.y) != border) || (GetPixel(hdc,tmp.x,tmp.y) != color)) && (tmp.x < x_right))
{
tmp.x++;
}
if(tmp.x == x_in) tmp.x++;
}
//проверка для строки ниже
tmp.x = x_left;
tmp.y--;
while(tmp.x <= x_right)
{
bool flag = false;
while((GetPixel(hdc,tmp.x,tmp.y) != border) && (GetPixel(hdc,tmp.x,tmp.y) != color) && (tmp.x < x_right))
{
if(flag == false) flag = true;
tmp.x++;
}
if(flag)
if((tmp.x == x_right) && (GetPixel(hdc,tmp.x,tmp.y) != border) && (GetPixel(hdc,tmp.x,tmp.y) != color))
Push(&points, &count, &tmp);
else
Push(&points, &count, &Point(tmp.x-1,tmp.y));
flag = false;
int x_in = tmp.x;
while(((GetPixel(hdc,tmp.x,tmp.y) != border) || (GetPixel(hdc,tmp.x,tmp.y) != color)) && (tmp.x < x_right))
{
tmp.x++;
}
if(tmp.x == x_in) tmp.x++;
}
}
}
псевдокод сюда не влез, во вложении можно глянуть
|