Если мы определим понятие «связные» в смысле «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
// закрашиваем левый