Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
metod_zbirna.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
2.09 Mб
Скачать

9.1 Простий алгоритм заповнення з запалом і стеком

  • Помістити затравочний піксел у стек

  • Поки стек не порожній

  • Витягти піксел зі стека

  • Привласнити пікселу необхідне значення

  • Для кожного із сусідніх до біжучого 4-зв’язних пікселів перевірити: чи є він граничним пікселом чи не привласнене пікселу необхідне значення. Проігнорувати піксел у кожнім з цих двох випадків. В іншому випадку помістити піксел у стек.

Алгоритм можна модифікувати для 8-зв’язних областей, якщо переглядати 8-связні піксели, а не тільки 4-зв’язні. Наведемо більш формальний виклад алгоритму, у якому передбачається існування затравочного піксела і гранично-визначеної області.

9.2 Простий алгоритм заповнення

Запал (х, у) видає затравочний піксел

Push - процедура, що поміщає піксел у стек

Pop - процедура, що витягає піксел зі стека

Піксел (х, у) = Запал (х, у)

Ініціалізуємо стек

Push Піксел (х, у)

While (стек не порожній)

Вибираємо піксел зі стека

Pop Піксел (х, у)

If Піксел(х, у)<>Нове_значення then

Піксел(х, у)=Нове_значення

End if

Перевіримо, чи треба поміщати сусідні піксели в стек

If (Піксел(х+1, у)<>Нове_значення and

Піксел(х+1, у)<>Гран_значення) Then

Push Піксел(х+1, у)

If (Піксел(х, у+1)<>Нове_значення and

Піксел(х, у+1)<>Гран_значення) Then

Push Піксел(х, у+1)

If (Піксел(х-1, у)<>Нове_значення and

Піксел(х-1, у)<>Гран_значення) Then

Push Піксел(х-1, у)

If (Піксел(х, у-1)<>Нове_значення and

Піксел(х, у-1)<>Гран_значення) Then

Push Піксел(х, у-1)

End if

End while

В алгоритмі перевіряються і поміщаються в стек 4-зв’язні піксели, починаючи з правого від поточного піксела. Напрямок обходу пікселів - проти годинникової стрілки.

Приклад 9.1. Простий алгоритм заповнення з запалом

Як приклад застосування алгоритму розглянемо гранично-визначену полігональну область, задану вершинами (1, 0), (7, 0), (8, 1), (8, 4), (6, 6), (1, 6), (0,5) і (0, 1). Область зображена на рис.9.1. Затравочний піксел - (4, 3). Область заповнюється піксел за пікселем у порядку, зазначеному на рис.9.1 лінією зі стрілками. Числа, зображені на пікселі, позначають позицію піксела в стеку, яку він займає при роботі алгоритму. Для деяких пікселів таких чисел декілька. Це означає, що піксел поміщали в стек більше 1 разу. Коли алгоритм доходить до піксела (5, 5), стек нараховує 25 рівнів глибини і містить піксели (7, 4), (7, 3), (7, 2), (7, 1), (6, 2), (6, 3), (5, 5), (6, 4), (5, 5), (4, 4),(3, 3), (3, 4), (3, 5), (2, 4), (2, 3), (2, 2), (2, 2), (3, 2), (5, 1), (3, 2), (5, 2), (3, 3), (4, 4), (5, 3).

Тому що всі піксели, які оточують (5, 5), містять або граничні, або нові значення кольору, то жоден з них у стек не поміщається. Отже зі стека виймається піксел (7, 4) і алгоритм продовжує заповнювати колонку (7, 4), (7, 3), (7, 2), (7, 1). При досягненні піксела (7, 1) перевірка знову показує, що навколишні піксели або уже заповнено, або є граничними пікселами. Тому що в цей момент багатокутник цілком заповнений, то вибирання пікселів зі стека до повного його спустошення не викликає появи додаткових пікселів, які варто запам’ятати. Коли стек стає порожнім, алгоритм завершує роботу.

Рис.9.1. Затравочне заповнення за допомогою простого стекового алгоритму\

Багатокутник із прикладу 9.1 є однозв’язною областю, але алгоритм буде правильно заповнювати й області, що містять діри. Це показано в наступному прикладі.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]