Средства для растровой графики
10.5.4. Заполнение областей узорами Алгоритм заливки закрашивает области сплошным цветом. Однако вместо этого мы можем пожелать заполнить область некоторым узором, как показано на рис. 10.21. Пусть нужный узор хранится в массиве
RGB pattern[Width][Height]:
Рис. 10.24. Пример: мотив мозаики и результирующая мозаика Пиксельная карта в массиве pattern[] [] может быть целым изображением, которым мы хотим «раскрасить» заданную область, или это может быть маленький элемент мозаики (tiling pattern), который следует выкладывать с повторением. На рис. 10.24 приведен мотив мозаики размером восемь на восемь и результат замощения (tiling) этого мозаичного мотива на область большего размера. Не составляет труда взять данные из массива pattern и «выложить» этот узор. Для того чтобы нарисовать пиксел в точке (х, у), нам нужно задать цвет рисования элементу массива pattern[х][у], но для обеспечения повторяемости узора мы задаем цвет рисования элементу pattern[х % Width][у % Height]. Использованная здесь функция модуля «%» ограничивает индексы в массиве pattern до нужных пределов и копирует узор на область любого размера.
Практические упражнения
10.5.1. Гранично-определенная заливка О Адаптируйте алгоритм из листинга 10.6 так, чтобы он производил закрашивание гранично-определенных 4-связных областей. Пусть цвет границы хранится в переменной boundaryCcl or, а начальная точка лежит внутри области, а не на ее границе.
О Работает ли этот метод в случае, когда значение boundaryCol or равно newCol or?
О Покажите, что если boundaryCcl or отличен от newColcr, однако некоторые внутренние пикселы имеют цвет newColor, то существует ряд геометрических узоров, при которых данный алгоритм может зависнуть и прекратить работу до полного закрашивания области.
10.5.2. Имитация заливки вручную
Поупражняйтесь вручную с алгоритмом из листинга 10.6 - для области, внутренняя часть которой задается пикселами (1, 1), (2, 1), (2, 2), (3, 2), (2, 3), (1,3). В качестве начальной точки возьмите (2, 2). Повторите это упражнение для случая, когда алгоритм адаптирован для 8-связных областей, где четыре дополнительных проверки проводятся в следующем порядке: (х - 1, у - 1), (х + 1, у - 1), (х - 1, у + 1), (х + 1,у + 1).