i = x;
while(getpixel(i,y) == oldColor)/*向右填充*/ {
putpixel(i,y,newColor); i++; }
span.xRight = i - 1; /*确定区段右边界*/ i = x - 1;
while(getpixel(i,y) == oldColor)/*向左填充*/ {
putpixel(i,y,newColor); i--; }
span.xLeft = i + 1; /*确定区段左边界*/ /*初始化*/
SetStackEmpty(s); span.y = y;
PushStack(s,&span);/*将前面生成的区段压入堆栈*/ while( ! IsStackEmpty(s) )/*终止判断*/ {
/*出栈*/
PopStack(s, &span); /*处理上面扫描线*/ y = span.y + 1;
xRight = span.xRight; i = span.xLeft - 1;
isLeftEndSet = FALSE;
while(getpixel(i,y) == oldColor)/*向左填充*/ {
putpixel(i, y, newColor); i--; }
if( i != span.xLeft - 1)/*确定区段左边界*/ {
isLeftEndSet = TRUE; xLeft = i + 1; }
i = span.xLeft; while( i < xRight) {
spanNeedFill = FALSE;
while(getpixel(i,y) == oldColor) /*向右填充*/ {
if( ! spanNeedFill)
{
spanNeedFill = TRUE; if( ! isLeftEndSet) {
isLeftEndSet = TRUE; xLeft = i; } }
putpixel(i,y,newColor); i++; }
if( spanNeedFill ) {
span.y = y;
span.xLeft = xLeft; span.xRight = i - 1;
PushStack(s, &span); /*将区段压入堆栈*/ isLeftEndSet = FALSE; spanNeedFill = FALSE; }
/* while(getpixel(i,y) != oldColor) */ i++;
}/*end of while( i < xRight) */
/*处理下面一条扫描线,与处理上面一条扫描线完全类似*/ y = y - 2;
xRight = span.xRight; i = span.xLeft - 1;
isLeftEndSet = FALSE;
while(getpixel(i,y) == oldColor)/*向左填充*/ {
putpixel(i, y, newColor); i--; }
if( i != span.xLeft - 1)/*确定区段左边界*/ {
isLeftEndSet = TRUE; xLeft = i + 1; }
i = span.xLeft; while( i < xRight) {
spanNeedFill = FALSE;
while(getpixel(i,y) == oldColor) /*向右填充*/ {
if( ! spanNeedFill) {
spanNeedFill = TRUE; if( ! isLeftEndSet) {
isLeftEndSet = TRUE; xLeft = i; } }
putpixel(i,y,newColor); i++; }
if( spanNeedFill ) {
span.y = y;
span.xLeft = xLeft; span.xRight = i - 1;
PushStack(s, &span); /*将区段压入堆栈*/ isLeftEndSet = FALSE; spanNeedFill = FALSE; }
/* while(getpixel(i,y) != oldColor) */ i++;
}/*end of while( i < xRight) */ delay(2000); /*延时*/
}/*end of while( ! isStackEmpty() ) */
}/*end of ScanLineFill4() */
/*---------------------main()------------------------------------------*/ int main() {
initgr(); /* BGI初始化 */ setbkcolor(3); setcolor(1);
moveto(50, 50); /*绘制4连通区域*/ lineto(400, 50); lineto(400,300); lineto(150,300); lineto(150,400); lineto(50, 400); lineto(50, 50);
ScanLineFill4(150,150,0,14); /*相与后oldColor == 0*/ getch(); /* 暂停一下,看看前面绘图代码的运行结果 */ closegr(); /* 恢复TEXT屏幕模式 */ return 0;
}
七、实验结果