Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.05.2014, 23:18   #1
_BYTE
Пользователь
 
Регистрация: 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++;
		}
	}
}
псевдокод сюда не влез, во вложении можно глянуть
Вложения
Тип файла: txt alg_3.txt (3.0 Кб, 162 просмотров)
_BYTE вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Алгоритм заполнения области прямоугольниками sciyy Фриланс 5 23.11.2013 01:33
Простейший алгоритм заполнения карты! [BeNdeR] Gamedev - cоздание игр: Unity, OpenGL, DirectX 17 05.05.2011 11:32
Построчный алгоритм заполнения многоугольника с затравкой (Билдер С++) SKA_zo4nik Помощь студентам 8 28.03.2011 20:15
Алгоритм заполнения ячеек Иван_1651 Microsoft Office Excel 3 11.03.2009 21:27
Алгоритм заполнения квадратной матрицы по спирали beregok Помощь студентам 3 15.01.2009 16:56