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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.03.2012, 11:51   #1
Mixim
Форумчанин
 
Регистрация: 29.10.2009
Сообщений: 259
Вопрос WinAPI: реализация алгоритма заливки

Понадобилось реализовать одно небольшое приложение на чистом WinAPI, в котором необходимо организовать функцию заливки. Вспомнил старый алгоритм рекурсивной заливки для выполнения поставленной задачи, в результате чего получил код:
Код:
	void Fill(HDC hDC, int x, int y)
	{
		COLORREF prevColor=GetPixel(hDC, x,y);//запоминаем текущий цвет точки с координатами (x,y)


		SetPixel(hDC, x, y, selectedColor);//изменяем цвет на выбранный(selectedColor - глобальная переменная типа COLORREF)

//проверяем соседние пекселы и если их цвет равен prevColor, то рекурсивно вызываем метод Fill
		if(GetPixel(hDC, x-1, y)==prevColor)
		{
			Fill(hDC, x-1,y);
		}
			if(GetPixel(hDC, x+1, y)==prevColor)
			{
				Fill(hDC, x+1,y);
			}
			if(GetPixel(hDC, x, y-1)==prevColor)
			{
				Fill(hDC, x,y-1);
			}

		if(GetPixel(hDC, x, y+1)==prevColor)
		{
			Fill(hDC, x,y+1);
		}
Когда необходимо залить небольшую область, то данный алгоритм и код отлично работает, но когда область имеет значительные размеры, глубина рекурсии становится чрезмерно большой и получаем, если можно так сказать, Exception. В принципе эта проблема и является основной в реализованном алгоритме.
Порылся в сети и вот ТУТ нашел, если так можно сказать, модификацию вышеизложенного алгоритма, основа которого заключается в использовании очереди(queue):
Код:
    void QueueFill( HDC hdc, int xStart, int yStart, RECT /* & Rect */ )
    {
        POINT pt = { xStart, yStart };    
        std::queue <POINT> Pts;
        Pts.push(pt);
        while( ! Pts.empty() )
        {
            pt = Pts.front(); Pts.pop();
            switch( GetPixel( hdc, pt.x, pt.y ) )
            {
                case CLR_INVALID: case RGB(0,0,0): case RGB(255,0,0):
                    break;
                default:
                    SetPixel( hdc, pt.x, pt.y, RGB(0xFF,0,0) );
                    --pt.y;         Pts.push(pt);
                    ++pt.y; ++pt.y; Pts.push(pt);
                    --pt.y; ++pt.x; Pts.push(pt);
                    --pt.x; --pt.x; Pts.push(pt);
            }
        }
    }
Однако на выделенную строчку VS2010 отвечает ошибкой: "Ошибка 1 error C2039: queue: не является членом "std" ". Порылся еще в сети, но так и не смог найти ничего более стоящего, а также методики борьбы с возникшей проблемой.
Прошу помочь в исправлении данной ошибки или подсказать другой не рекурсивный алгоритм заливки для WinAPI.
Из всех классических книг, посвященных программированию, ненавижу всего одну - русский перевод книги Роберта Седжвика-"Фундаментальные алгоритмы C++". Предпочитаю читать её в оригинале.
Mixim вне форума Ответить с цитированием
Старый 20.03.2012, 12:14   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

ну а
Код:
#include <queue>
есть?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 21.03.2012, 08:42   #3
Mixim
Форумчанин
 
Регистрация: 29.10.2009
Сообщений: 259
Подмигивание

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
ну а
Код:
#include <queue>
есть?
Благодарю, про это совсем забыл
Из всех классических книг, посвященных программированию, ненавижу всего одну - русский перевод книги Роберта Седжвика-"Фундаментальные алгоритмы C++". Предпочитаю читать её в оригинале.
Mixim вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
реализация циклического алгоритма С++ tracer Помощь студентам 5 12.05.2011 20:15
Реализация цикличного алгоритма С++ zpMirtzp Помощь студентам 3 12.05.2011 13:34
реализация алгоритма find_if Progsenya Общие вопросы C/C++ 2 10.09.2010 23:58
реализация алгоритма дешифровки Valx Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 30.03.2010 08:18
Реализация алгоритма Евклида с точностью??? dewer Помощь студентам 8 06.07.2009 08:44