|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
14.09.2010, 01:27 | #1 |
пропагандирую жизЪ
Форумчанин
Регистрация: 19.03.2007
Сообщений: 950
|
Закрас попиксельно.
Приветствую, очень важная для меня тема.
Есть абсолютна любая фигура, есть точка внутри ее. Нужно ореентируясь от точки закрасить все что внутри фигуры. Выполняя это задание столкнулся с небольшими проблемами. Во первых использование массива (640, 480) - размеры экрана "великовато", во вторых производительность данного алгоритма не велика. Вот небольшой набросок: Код:
Посторонним В.
Последний раз редактировалось NSvirus; 14.09.2010 в 01:29. |
14.09.2010, 06:41 | #2 | |
Программист VBA
СуперМодератор
Регистрация: 13.07.2008
Сообщений: 6,856
|
Цитата:
Точки расположены в случайном порядке, или в порядке следования? Если порядок точек в массиве случайный, то результат в общем случае неопределён: |
|
14.09.2010, 06:59 | #3 |
Старожил
Регистрация: 31.05.2010
Сообщений: 13,543
|
У тебя идёт просмотр всего поля рисунка. В этом и кроется причина неэффективности алгоритма. На практике применяют способ обхода контура. От точки координат, с которой надо производить закрашивание, делается N шагов до нахождения 1-края рисунка; 2-пикселя закрашенного другим цветом. После этого, делается обход контура. Только проверок на окружение будет не 4 а 8. Поскольку закрашиваемая область всегда меньше общей площади рисунка, алгоритм работает быстрее.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder |
14.09.2010, 08:31 | #4 |
Старожил
Регистрация: 13.10.2007
Сообщений: 2,740
|
Не понял к чему такие мучения. Если цвет контура и цвет закраски отличаются, то рисуем фигуру цветом закраски, floodfill(), перерисовываем фигуру изначальным цветом.
|
14.09.2010, 09:06 | #5 | |
Старожил
Регистрация: 31.05.2010
Сообщений: 13,543
|
Цитата:
Сравнивать надо контур с цветом фона и заполнять цветом закраски.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder |
|
14.09.2010, 09:07 | #6 | |
Старожил
Регистрация: 13.10.2007
Сообщений: 2,740
|
Цитата:
|
|
14.09.2010, 09:09 | #7 |
Старожил
Регистрация: 13.10.2007
Сообщений: 2,740
|
На всякий случай, перед floodfill нужно setfillstyle();
|
14.09.2010, 09:58 | #8 | |||
пропагандирую жизЪ
Форумчанин
Регистрация: 19.03.2007
Сообщений: 950
|
Цитата:
Цитата:
Цитата:
Посторонним В.
|
|||
14.09.2010, 10:48 | #9 |
Форумчанин
Регистрация: 15.06.2010
Сообщений: 740
|
Если с английским и сями дружите - то вот, вполне подробно: http://www.academictutorials.com/gra...flood-fill.asp Если скорость не нужна, то самая обычная рекурсия. Процедура в пять строк.
Чтобы понять рекурсию, сперва нужно понять рекурсию.
|
14.09.2010, 11:54 | #10 |
Высокая репутация
СуперМодератор
Регистрация: 27.07.2008
Сообщений: 15,551
|
Набросал пример в Делфи.
Процедура заливки: Код:
Можно было бы рисовать не линиями, а точками, проверяя 4 направления от каждой точки, но тогда при больших областях будет переполняться стек. P.S. В примере: левой кнопкой мыши - рисовать, правой - заливать. E-Mail: arigato.freelance@gmail.com
Последний раз редактировалось Arigato; 14.09.2010 в 11:57. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Вывод картинки попиксельно | SmilingBull | Мультимедиа в Delphi | 6 | 11.01.2011 02:01 |
Рисовать попиксельно | Ooops | Софт | 2 | 15.12.2009 10:00 |
Сравнение попиксельно зоны рабочего стола с указанным *.bmp | Travolta | Общие вопросы .NET | 1 | 02.12.2008 13:01 |
Как из .BMP считать попиксельно | OrdJONY | Мультимедиа в Delphi | 7 | 17.08.2008 15:46 |
Нужно решить и объяснить задачу "В режиме точечной графики попиксельно вывести фразу" | Eyeless | Фриланс | 3 | 10.01.2008 10:56 |