Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> заливка контура 
:(
    Опции темы
Дима
Дата 5.12.2002, 04:27 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











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

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 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 29.4.2002
Где: Москва

Репутация: нет
Всего: нет



Во-первых у тебя процесс уходит в бесконечность по всем направлениям если попадается не замкнутая область. Во-вторых color - видимо, глобальная переменная, и не понятно, где и чем она инициализируется и что да как, ты либо пиши всё, либо внеси её в аргументы (оно вернее будет)
PM MAIL WWW ICQ   Вверх
suborg
Дата 5.12.2002, 05:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 29.4.2002
Где: Москва

Репутация: нет
Всего: нет



А, кстати, ты еще DC при рисовании каждой точки заново получаешь. Это не есть хорошо потому что прежде, чем захватывать его заново, надо бы его освободить, так что либо делай передачу DC внутри рекурсии (оно будет вернее и гораздо быстрее, чем захват каждый раз заново), либо отпускай DC прежде, чем произвести рекурсивный вызов.
PM MAIL WWW ICQ   Вверх
Дима
Дата 6.12.2002, 06:26 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Насчет бесконечности - просто добавил проверку.
Передача DC как аргумента - не помогает.
А где и как ты предлагаешь его закрывать?
  Вверх
suborg
Дата 6.12.2002, 06:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 29.4.2002
Где: Москва

Репутация: нет
Всего: нет



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

Насчет передачи dc - нужно например в функции заливки его открыть, вызвать оттуда другую функцию - рекурсивную, по выходу из неё dc отпустить. А ты смотрел, какая именно у тебя ошибка выскакивает? Где программа циклится или вылетает?
PM MAIL WWW ICQ   Вверх
Дима
Дата 6.12.2002, 07:25 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Мой код работает только для трех функций и заполняет половину а если добавляю четвертою то все падает.
  Вверх
Baa
Дата 6.12.2002, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2639
Регистрация: 12.4.2002
Где: Москва

Репутация: 8
Всего: 12



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

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


--------------------
"Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande
PM ICQ   Вверх
suborg
Дата 8.12.2002, 02:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 29.4.2002
Где: Москва

Репутация: нет
Всего: нет



Деструктор не вызывается потому что вызов рекурсии происходит до выхода из поля видимости локального объекта, деструктор будет вызываться уже после возврата из всего дерева рекурсии. По крайней мере если оптимизация компилятора не намудрит чего ни будь, но обычно в этой области она не мудрит.
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0454 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.