- •Комп’ютерна графіка
- •1.3 Перетворення прямих ліній (відрізків)
- •1.4 Обертання
- •1.5 Відображення
- •1.6 Зміна масштабу
- •1.7 Двовимірний зсув і однорідні координати
- •2.2 Тривимірна зміна масштабу
- •2.3 Перетворення трьохвимірних координат в двовимірні
- •2.4 Тривимірний зсув
- •2.6 Відображення в просторі
- •2.7 Просторовий перенос
- •2.8 Тривимірне обертання навколо довільної осі
- •3.2 Косокутні проекції
- •Лабораторна робота №4 Алгоритм креслення відрізків
- •Теоретичні основи
- •Лабораторна робота № 5 Метод цифрового диференціального аналізатора
- •Теоретичні відомості
- •Алгоритм Брезенхема розкладання в растр відрізка для першого октанта
- •6.2. Загальний алгоритм Брезенхема.
- •Узагальнений цілочисельний алгоритм Брезенхема для усіх квадрантів
- •Лабораторна робота № 7 Алгоритм Брезенхема для генерації кола
- •Теоретичні основи
- •8.2 . Простий алгоритм з упорядкованим списком ребер
- •Простий алгоритм з упорядкованим списком ребер
- •8.3. Більш ефективні алгоритми з упорядкованим списком ребер
- •Більш ефективний алгоритм з упорядкованим списком ребер
- •9.1 Простий алгоритм заповнення з запалом і стеком
- •9.2 Простий алгоритм заповнення
- •Приклад 9.1. Простий алгоритм заповнення з запалом
- •Приклад 9.2. Алгоритм заповнення з запалом для багатокутника з діркою
- •9.3 Порядковий алгоритм заповнення з запалом
- •9.4 Алгоритм порядкового заповнення з запалом
- •9.5 Порядковий алгоритм заповнення з запалом
- •Приклад 9.3. Порядковий алгоритм заповнення з запалом
- •Література
- •Комп’ютерна графіка Методичні вказівки
Приклад 9.2. Алгоритм заповнення з запалом для багатокутника з діркою
Як приклад застосування алгоритму розглянемо гранично-визначену область, що містить діру. Вона зображена на рис.9.2. Як і в попередньому прикладі, вершини багатокутника задані пікселами (1, 0), (7, 0), (8, 1), (8, 4), (6, 6), (1, 6), (0,5) і (0, 1). Внутрішня діра визначається пікселами (3, 2), (5, 2), (5, 3), (3, 3). Затравочний піксел - (4, 4). Через діру багатокутник заповнюється не в тому порядку, що у прикладі 9.1. Новий порядок заповнення зазначений на рис.9.2 лінією зі стрілками. Як і в попередньому прикладі, числа в квадратику піксела показують позицію в стеку, займану пікселем. Коли обробка доходить до піксела (3, 1), усі навколишні його 4-зв’язні піксели або вже заповнені, або є граничними. Тому жоден з пікселів не поміститься в стек. Глибина стеку в цей момент дорівнює 15. У стеку знаходяться піксели (7, 1), (7, 2), (7, 3), (6, 5), (7, 4), (6, 5), (3, 1), (1, 2), (1, 3), (1, 4), (2, 5), (3, 5), (4, 5), (5, 4).
Після вибору із стека піксела (7, 1) заповнюється стовпчик (7, 1), (7, 2), (7, 3), (7, 4), при цьому жоден піксел у стек не додається. Для піксела (7, 4) знову всі 4-зв’язні навколишні піксели або вже заповнені, або є граничними. Звертаючись до стеку, алгоритм витягає піксел (6, 5), його заповнення завершує заповнення всього багатокутника. Подальша обробка відбувається без якого-небудь заповнення, і коли стек стає порожнім, алгоритм завершує роботу.
Рис.9.2. Затравочне заповнення області з отвором за допомогою простого стекового алгоритму
9.3 Порядковий алгоритм заповнення з запалом
Даний алгоритм застосовується до гранично-визначених областей. Гранично-визначена 4-зв’язна область може бути як опуклою, так і не опуклою, а також може містити діри. В зовнішній області, пов’язаній з нашою гранично-визначеною областю, не повинно бути пікселів з кольором, яким заповнюється область чи багатокутник. Схематично роботу алгоритму можна розбити на чотири етапи.
9.4 Алгоритм порядкового заповнення з запалом
Затравочний піксел на інтервалі витягається зі стека, що містить затравочні піксели.
Інтервал із затравочним пікселем заповнюється вліво і вправо від запалу уздовж скануючого рядка доти, поки не буде знайдена границя. У змінних Хлів і Хправ запам’ятовуються крайній лівий і крайній правий піксели інтервалу.
У діапазоні Хлів<х<Хправ перевіряються рядки, розташовані безпосередньо над і під біжучим рядком. Визначається, чи є на них ще не заповнені піксели. Якщо такі піксели є (тобто не всі піксели граничні, чи уже заповнені), то в зазначеному діапазоні крайній правий зазначений піксел у кожному інтервалі відзначається як затравочний і поміщується в стек.
При ініціалізації алгоритму в стек поміщується єдиний затравочний піксел і його робота завершується при обнуленні стека. Як показано на рис.9.3 і в прикладі нижче, алгоритм працює коректно.
Рис.9.3. Порядковий алгоритм заповнення з запалом для багатокутника
9.5 Порядковий алгоритм заповнення з запалом
Запал (х, у) видає затравочний піксел
Pop - процедура, що витягає піксел зі стека
Push - процедура, що поміщає піксел у стек
Ініціалізуємо стек
Push Запал(х, у)
While (стек не порожній)
Вибираємо піксел зі стека і привласнюємо йому нове значення
Pop Піксел(х, у)
Піксел(х, у)=Нове_значення
Зберігаємо х-координату затравочного піксела
ТимЧас_х=х
Заповнюємо інтервал праворуч від запалу
х=х+1
while Піксел(х, у)<>Гран_значення
Піксел(х, у)=Нове_значення
х=х+1
end while
зберігаємо крайній праворуч піксел
Хправ=х-1
Відновлюємо х-координату запалу
х=ТимЧас_х
заповнюємо інтервал ліворуч від запалу
х=х-1
While Піксел(х, у)<>Гран_значення
Піксел(х, у)=Нове_значення
х=х-1
end while
зберігаємо крайній ліворуч піксел
Хлів=х+1
Відновлюємо х-координату запалу
х=ТимЧас_х
перевіримо, що рядок вище не є ні границею багатокутника, ні вже цілком заповнений; якщо це не так, то знайти запал, починаючи з лівого краю підінтервала скануючого рядка.
х=Хлів
у=у+1
while х ? Хправ
шукаємо запал на рядку вище
Прапор=0
While (Піксел(х, у)<>Гран_значення and
Піксел(х, у)<>Нове_значення and х<Хправ
If Прапор=0 then Прапор=1
х=х+1
end while
поміщаємо в стек крайній правий піксел
if Прапор=1 then
if (х=Хправ and Піксел(х, у)<>Гран_значення
and Піксел(х, у)<>Нове_значення) then
Push Піксел(х, у)
Else
Push Піксел(х-1, у)
End if
Прапор=0
End if
Продовжимо перевірку, якщо інтервал був перерваний
Хвход=х
While ((Піксел(х, у)=Гран_значення or Піксел(х, у)=Нове_значення)
and х<Хправ)
х=х+1
end while
упевнимося, что координата піксела збільшена
if х=Хвход then х=х+1
end while
перевіримо, що рядок нижче не є ні границею багатокутника, ні вже цілком заповнений, ця частина алгоритму зовсім аналогічна перевірці для рядка вище, за винятком того, що замість у=у+1 треба поставити у =у-1
end while
finish
Тут функція Pop вибирає координати х, у піксела із стека, а функція Push поміщає їх у стек.
