// fill adjacent segments in the same direction for ( x = xl; x<= xr; x++ )
{
с = getpixel ( x, у + dir); if (( с != borderColor) && ( с != color)) x = lineFill ( x, у + dir, dir, xl, xr);
}
for ( x = xl; x < prevXl; x++ ) {
с = getpixel ( x, у - dir); if (( с != borderColor) && ( с != color)) x = lineFill ( x, у - dir, -dir, xl, xr);
}
for ( x = prevXr; x < xr; x++ ) {
с = getpixel ( x, у - dir); if (( с != borderColor) && ( с != color)) x = lineFill ( x, у - dir, -dir, xl, xr);
}
return xr;
}
void fill (int x, int у ) {
lineFill (x, y, 1, x, x );
}
main () {
int driver = DETECT; int mode; int res;
initgraph ( &driver, &mode,); if ((res = graphresult ()) != grOk )
{
printf("\nGraphics error: %s\n", grapherrormsg (res)); exit (1 );
}
circle ( 320, 200, 140 ); circle ( 260, 200, 40 ); circle ( 380, 200, 40 ); getch ();
setcolor (Color);
fill ( 320, 300 ); getch (); closegraph ();
}
Существует и другой подход к заполнению области сложной формы, заключающийся в определении ее границы и последовательном заполнении горизонтальных участков между граничными пикселами.
Компьютерная графика. Полигональные модели Такой алгоритм имеет следующую структуру:
построение упорядоченного списка граничных пикселов (отслеживается в няя граница);
проверка внутренности (для обнаружения в ней дыр);
заполнение области горизонтальными отрезками, соединяющими точки границы
Занумеруем возможные ходы для перебора соседей на 8-связной решетке и проведем упорядоченный перебор пикселов, соседних с уже найденным граничным, в зависимости от направления предыдущего хода.
Ниже приводится программа заполнения области на основе этого алгоритма.
о л.
// File fill3.cpp #define BLOCKED 1 #define UNBLOCKED 2 #define FALSE 0 #define TRUE OxFFFF
int borderColor = WHITE; int fillColor = GREEN;
struct BPStruct // table of border pixels {
int x, y; int flag; } bp [3000];
int bpStart; int bpEnd = 0; BPStruct currentPixel;
int D; // current search direction
int prevD; // prev. search direction