exam10 - MiAneko24/bmstu-cg GitHub Wiki

10. Алгоритмы заполнения с затравкой. Построчный алгоритм заполнения с затравкой.

Алгоритмы заполнения с затравкой

См. тут

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

В этом алгоритме в стек кладем не все пиксели, а один пиксель для группы затравочных пикселей. Поэтому, алгоритм решает проблему использования памяти.

Непрерывный интервал пикселей - группа примыкающих друг к другу пикселей, расположенных на одной сканирующей строке, ещё не закрашенных и не являющих граничными. Но, ограниченная граничными или уже закрашенными пикселями.

1

Группа - красные, граничные - зеленые. Класть в стек будем только один пиксель из этой группы.

Псевдокод

1. Ввод исходных данных (информация о границах, цвет границы, цвет закрашивания, затравочный пиксель)
2. Вычерчивание границ закрашеваемой области.
3. Занесение затравочного пикселя в стек.
4. Пока стек не пусть, выполнить:
   4.1. Извлечь затравочный пиксель из стека.
   4.2. Закрашивание пикселей текущей строки, начиная с затравочного, 
   влево и вправо от него до достижения границы (левой и правой)
   4.3 Запоминание х левого и х правого (абсциссы самого левого и самого правого закрашенных пикселей).
   !!! То есть берем не граничный, а справа / слева от него !!!
   /*
   Достигли левой - запомнили абсциссу самого левого, но еще закрашенного пикселя. 
   Восстановить абсциссу затравочного пикселя, прежде чем двигаться вправо 
   (поэтому надо запомнить абсциссу затравочного)
   */
   4.4. Поиск на двух соседних по отношению к текущей строке в интервале [х левое; х правое]
   новых затравочных пикселей. Любой ещё не закрашенный и не граничный пиксель в заданном
   интервале, может рассматриваться как затравочный. Но, в качестве нового затровочного пикселя
   необходимо взять самый правый из затравочных, если поиск идется слева направо. 
   Справа налево - наооборот.
5. Конец.

Начальные цвета

  • Пиксели внутри не могут иметь цвет границы, иначе будет закрашен только затравочный пиксель.
  • Пиксели могут иметь цвет закраски (в ограниченном количестве, но не всегда), иногда это может привести к неполной закраске, например как тут.

Imgur

один из интервалов полностью закрашен, поэтому через него алгоритм не сможет пройти. примеры, в которых красная точка обозначает начальный затравочный пиксель:

Imgur

Imgur

однако если уже существующая закраска не перекрывает интервал полностью, то вся фигура будет закрашена, как в таком примере:

Imgur

Imgur

Imgur

Анализ эффективности

  • Цвет пикселя меняется всего лишь один раз.
  • Обрабатываются пиксели внутри области и граничные пиксели. В среднем, пиксель будет обработан 3 раза: при проходе по его строке, и при поиске затравочных пикселей слева и справа.
  • Размещаем в стеке только лишь один затравочный пиксель, для непрерывного интервала пикселей.

Алгоритм уступает растровым. В растровых за минимальное число операций можно определить, что нужно закрасить. Например, алгоритм по ребрам, за 2-3 арифметические операциии определяет что нужно закрасить кусок строки (Однако перекрашивания дают проигрыш во времени, поэтому лучше сравнивать с алгоритмами, у которых нет перекрашиваний).

Алгоритм позволяет закрасить любую гранично-определенную область. Так как алгоритм не работает с отрезками (или многоугольниками), а отталкивается от расположения границ, то он позволяет закрашивать и более сложные фигуры, нежели многоугольники.

Следующий вопрос: 11. Основы методов устранения ступенчатости. Алгоритм Брезенхема с устранением ступенчатости. Алгоритм Ву.

Предыдущий вопрос: 09. Алгоритм заполнения с затравкой, простой алгоритм заполнения с затравкой.