Если мы определим понятие «связные» в смысле «8-связные», то область В будет содержать 67 не-черных пикселов, 8-связных с 5, поскольку теперь 5 юго-западных пикселов будут являться частью области.

10.5.3. Рекурсивный алгоритм заливки Ниже мы опишем два простых алгоритма заполнения, работающих с пиксельно-определенными областями. Первый из них оперирует с внутренне-определенными, 4-связными областями. Он изменяет цвет каждого внутреннего пиксела с intColor на новый цвет newColor. Этот алгоритм носит название алгоритма заливки (flood-fill algorithm), поскольку он «заливает» область цветом newCol or, «ведя свой путь» newColor от «начального» пиксела с координатами (х,у) в поисках пикселов цвета intColor, заменяя цвет каждого из найденных пикселов на newCol or. Данный алгоритм иногда используют в интерактивных системах рисования, поскольку пользователь может указать начальную точку внутри области и затем запустить операцию заливки.

Идея этого алгоритма заключается в следующем: если пиксел с координатами (х, у) находится во внутренней части области (то есть его цвет - intColor), то меняем его на newColor и рекурсивно применяем этот процесс к каждому из четырех соседних пикселов. В противном случае не делаем ничего. Из листинга 10.6 видно, насколько прост этот алгоритм. Отметим, что для запроса цвета пиксела в точке (х, у) используется подпрограмма get Pixel (х,у).

Листинг 10.6. Рекурсивная заливка для внутренне-определенных областей

void floodFi11(short х .short у. short intColor)

// Start at (x. y): change all pixels of intColor to newColor.
// assume drawing color is newColor
// 4-connected version

// Начинаем с точки (x. у); для всех пикселов цвета

// intColor изменяем цвет на newColor

// цвет рисования - newColor

// 4-связный вариант

{
if(getPixeKx.y) - intColor) {

setPixeKx. у); // change its color // изменяем его цвет

floodFi11(х - 1. у. intColor):

Определение и заполнение областей из пикселов

10.5. Определение и заполнение областей из пикселов

// fill left

// закрашиваем левый


⇐ Предыдущая| |Следующая ⇒