📄 4.6.2.c
字号:
/* WIN-TC BGI 图形编程模板 */
#include "Conio.h"
#include "graphics.h"
#define closegr closegraph
#define STACK_INIT_SIZE 500;
#define STACKINCREMENT 100;
typedef enum {False,True}Boolean;
typedef struct
{int y;
int xLeft;
int xRight;
}Span;
typedef struct
{Span *top;
Span *base;
int stacksize;
}SqStack;
SqStack *S;
void InitStack()
{
S->base=(Span *)malloc(100*sizeof(Span));
if(!S->base)exit(0);
S->top=S->base;
S->stacksize=100;
}
void ClearStack()
{
S->top=S->base;
}
void PushStack(Span e)
{
*S->top=e;
S->top+=1;
}
Span PopStack(Span e)
{
if(S->top==S->base){exit(0);}
S->top-=1;
e=*S->top;
return e;
}
Boolean isStackEmpty()
{
if(S->top==S->base) return(True);
else return(False);
}
void initgr(void) /* BGI初始化 */
{
int gd = DETECT, gm = 0; /* 和gd = VGA,gm = VGAHI是同样效果 */
registerbgidriver(EGAVGA_driver);/* 注册BGI驱动后可以不需要.BGI文件的支持运行 */
initgraph(&gd, &gm, "");
}
void ScanLineFill(int x,int y,int oldColor,int newColor)
{int xLeft,xRight,i;
Boolean isLeftEndSet,spanNeedFill;
Span span;
InitStack();
/*填充并确定种子点(x,y)所在的区段*/
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;
ClearStack();
span.y=y;
PushStack(span);
/*终止判断*/
while(S->top!=S->base)/*出栈*/
{
span=PopStack(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(span);
isLeftEndSet=False;
spanNeedFill=False;
}
while(getpixel(i,y)!=oldColor&&i<getmaxx())
i++;
} /*end of while(!isStackEmpty)*/
/*处理下面一条扫描线*/
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(span);
isLeftEndSet=False;
spanNeedFill=False;
}
while(getpixel(i,y)!=oldColor&&i<getmaxx())
i++;
}
} /*end of while(!isStackEmpty)*/
}
int main(void)
{
initgr(); /* BGI初始化 */
fillellipse(300,250,60,40);
ScanLineFill(300,250,15,5);
rectangle(100,20,200,50);
ScanLineFill(125,30,0,5);
bar(100,80,150,180);
bar(150,80,200,90);
bar(200,80,250,180);
bar(150,130,200,180);
ScanLineFill(110,150,15,2);
getch(); /* 暂停一下,看看前面绘图代码的运行结果 */
closegr(); /* 恢复TEXT屏幕模式 */
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -