Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > заливка контура


Автор: Дима 5.12.2002, 04:27
Хочу написать функцию заливки области - рекурсивно проверяется цвет точки
и если не совпадает то меняется и переход к соседям.
Мой код работает только для трех соседей и заполняет половину а если добавляю четвертого то все падает.Помогите понять что тут не то.Заранее спасибо.

void CExView::OnLButtonDown(UINT nFlags, CPoint point)
{
   Fill(point.x,point.y);
}

void CExView::Fill(int x,int y)
{
   CClientDC dc(this);
    if( color != dc.GetPixel(x,y))
    {
        dc.SetPixel(x,y,color);
        Fill(x,y-1);
        Fill(x+1,y);
        Fill(x,y+1);
        Fill(x-1,y);
    }
}

Автор: suborg 5.12.2002, 05:41
Во-первых у тебя процесс уходит в бесконечность по всем направлениям если попадается не замкнутая область. Во-вторых color - видимо, глобальная переменная, и не понятно, где и чем она инициализируется и что да как, ты либо пиши всё, либо внеси её в аргументы (оно вернее будет)

Автор: suborg 5.12.2002, 05:42
А, кстати, ты еще DC при рисовании каждой точки заново получаешь. Это не есть хорошо потому что прежде, чем захватывать его заново, надо бы его освободить, так что либо делай передачу DC внутри рекурсии (оно будет вернее и гораздо быстрее, чем захват каждый раз заново), либо отпускай DC прежде, чем произвести рекурсивный вызов.

Автор: Дима 6.12.2002, 06:26
Насчет бесконечности - просто добавил проверку.
Передача DC как аргумента - не помогает.
А где и как ты предлагаешь его закрывать?

Автор: suborg 6.12.2002, 06:58
Проверку там просто так не сделаешь потому что если ты проверяешь на отрицательные и слишком большие значения, то это - не гарантия. Можно изменять точку отсчета в dc.

Насчет передачи dc - нужно например в функции заливки его открыть, вызвать оттуда другую функцию - рекурсивную, по выходу из неё dc отпустить. А ты смотрел, какая именно у тебя ошибка выскакивает? Где программа циклится или вылетает?

Автор: Дима 6.12.2002, 07:25
Мой код работает только для трех функций и заполняет половину а если добавляю четвертою то все падает.

Автор: Baa 6.12.2002, 17:24
Цитата(suborg @ 04.12.2002, 21:42)
А, кстати, ты еще DC при рисовании каждой точки заново получаешь. Это не есть хорошо потому что прежде, чем захватывать его заново, надо бы его освободить, так что либо делай передачу DC внутри рекурсии (оно будет вернее и гораздо быстрее, чем захват каждый раз заново), либо отпускай DC прежде, чем произвести рекурсивный вызов.

Эээ... дык ведь деструктор вызывается ж... а в деструкторе у него релиз есть...

Автор: suborg 8.12.2002, 02:40
Деструктор не вызывается потому что вызов рекурсии происходит до выхода из поля видимости локального объекта, деструктор будет вызываться уже после возврата из всего дерева рекурсии. По крайней мере если оптимизация компилятора не намудрит чего ни будь, но обычно в этой области она не мудрит.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)