7.13. Алгоритм зі списком ребер і прапорцем

 

Алгоритм, який використовує список ребер і прапорець, є двокроковим. Перший крок полягає в обрисовуванні контура, в результаті чого на кожному скануючому рядку утворюються пари обмежуючих пікселів. Другий крок полягає у заповненні пікселів, що розташовані між обмежуючими. Більш точно алгоритм можна сформулювати в наступному вигляді:

Обрисовування контуру.

Використовуючи погодження про середину інтервалу між скануючими рядками для кожного ребра, що перетинає скануючий рядок, відмітити самий лівий піксель, центр якого лежить праворуч від перетину;

тобто

х ≤x+1/2≤xперетину

Заповнення.

Для кожного скануючого рядка, що перетинає багатокутник

         Всередині = FLASH

         For x = 0 (ліва межа) to x=xmax (права межа)

if піксель в точці х має граничне значення

then інвертувати значення змінної Всередині

if  Всередині = TRUE then

присвоїти пікселю в х значення кольору багатокутника

else

присвоїти пікселю в х значення кольору фону

end if

neхt x.

 

Приклад 7.9. Алгоритм, що використовує список ребер і прапорець

Розглянемо застосування даного алгоритму до тестового багатокутника наведеного на рис. 7.23. Спочатку вимальовується контур, результат цього кроку наведений на рис. 7.27,а. Активовані пікселі в точках (1, 1), (1, 2), (1, 3), (1, 4),    (1, 5), (1, 6), (2, 6), (3 , 5), (4, 4), (5, 3), (6, 3), (7, 4), (8, 4), (8, 3), (8, 2), (8, 1 ).

Тоді багатокутник заповнюється. Для ілюстрації цього процесу виділений і показаний рядок 3 на рис. 7.27,б. Для обрисовування контуру на цьому рядку активовані пікселі при х = 1, 5, 6 і 8. Застосування алгоритму заповнення дає наступні результати:

 

Описание: Описание: Описание: Описание: Описание: Описание: Описание: Описание: Описание: Описание: Описание: 2

Рис. 7.27. Алгоритм заповнення по ребрах і прапорцеві

 

 Спочатку

Всередині = FALSE

Для х = 0  Піксель не граничний і Всередині = FALSE, отже, вживати ніяких дій

не потрібно.

Для х = 1 Піксель - межовий, тому змінна Всередині інвертується і отримує

       значення   TRUE. Змінна Всередині = TRUE, тому пікселю

       присвоюється колір або інтенсивність багатокутника.

Для х = 2, 3, 4 Піксель не граничний і Всередині = TRUE, тому пікселю

     присвоюється колір багатокутника.

Для х = 5 Піксель - межовий, тому змінна Всередині інвертується.

      Всередині = FALSE, тому пікселю присвоюється фоновий колір.

Для х = 6 Піксель межовий, тому змінна Всередині інвертується і отримує

      значення TRUE. Змінна Всередині = TRUE, тому пікселю присвоюється

      колір багатокутника.

Для х = 7 Піксель не граничний і Всередині = TRUE, тому пікселю

       присвоюється колір багатокутника.

Для х = 8 Піксель межовий, тому змінна Всередині інвертується і отримує

                 значення FALSE. Мінлива всередині = FALSE, тому пікселю

                 присвоюється колір фону.

Результат наведений на рис. 7.27,с, а кінцевий результат для всього багатокутника співпадає з результатом роботи алгоритму зі списком ребер.

У даному алгоритмі кожен піксель обробляється лише один раз, так що затрати на ввід/вивід значно менше, ніж в алгоритмі зі списком ребер або алгоритмі з перегородкою. Жоден з цих алгоритмів, якщо вони працюють з буфером кадру, не вимагає побудови, підтримки та сортування будь-яких списків. При програмній реалізації алгоритм з впорядкованим списком ребер і алгоритм зі списком ребер і прапорцем працюють приблизно з однаковою швидкістю. Однак алгоритм зі списком ребер і прапорцем придатний для апаратної або мікропрограмної реалізації, в результаті чого він виконується на один-два порядки швидше, ніж алгоритм з впорядкованим списком ребер. Для простих зображень навіть можлива анімація в реальному режимі часу.