boundaryFill4 (x , у - 1, fillColor, borderColor)

}

}

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

Кроме того, поскольку для выполнения этой процедуры приходится заносить в стек большое количество соседних точек, обычно используются более эффективные методы. Эти методы заключаются в том, чтобы закрашивать горизонтальные полосы пикселей по строкам развертки, а не обрабатывать четырех- или восьмисвязные соседние точки. В таком случае в стек нужно занести только начальную точку для каждой горизонтальной полосы пикселей, а не все необработанные соседние точки вокруг текущего положения. При использовании данного метода, начиная со стартовой внутренней точки, сначала закрашивается непрерывная полоса пикселей в этой стартовой строке развертки. Затем находятся и заносятся в стек положения стартовых точек для полос в соседних строках развертки, где полосы пикселей определяются как непрерывные горизонтальные строки точек, ограниченные пикселями, которые имеют цвет границы. На каждом последующем шаге берется следующее стартовое положение из верхней части стека, и весь процесс повторяется снова.

Пример того, как с помощью описанного подхода можно закрашивать полосы пикселей, приведен для четырехсвязной области заполнения на рис. 4.29. В этом примере сначала последовательно обрабатываются строки развертки, начиная со стартовой строки и до верхней границы. Обработав все верхние строки развертки, мы закрашиваем полосы пикселей в оставшихся строках вниз к нижней границе области. Для каждой горизонтальной полосы находятся и записываются в стек положения крайних левых пикселей, как показано на рис. 4.29. На части а этого рисунка заполнена исходная полоса, а в стек занесены стартовые положения 1 и 2 для полос следующих строк развертки (сверху и снизу). На рис. 4.29, б положение 2 извлекается из стека и обрабатывается с целью построения изображенной закрашенной полосы, а в стек заносится стартовое положение (точка 3) полосы следующей строки развертки. Закрашенные полосы и занесенные в стек положения после обработки положения 3 показаны на рис. 4.29, в. Наконец, на рис. 4.29, г изображены закрашенные пиксели после обработки всех полос в правой верхней части заданной фигуры. Затем обрабатывается положение 5, и закрашиваются полосы в левой верхней части фигуры; после этого извлекается точка 4, и продолжается обработка нижних строк развертки.


⇐ вернуться назад | | далее ⇒