📄 10.c
字号:
/* WIN-TC BGI 图形编程模板 */
#include "stdio.h"
#include "Conio.h"
#include "graphics.h"
#include "math.h"
#define pi 3.14159265
#define closegr closegraph
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define false 0
#define true 1
#define ok 1
#define error 0
#define infeasible -1
#define overflow -2
typedef int Status;
typedef int bool;
typedef struct {
int y,xLeft,xRight;
}SElemType;
typedef struct{
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
void initgr(void) /* BGI初始化 */
{int gd=DETECT,gm=0; /* 和gd=VGA,gm=VGAHI是同样效果 */
registerbgidriver(EGAVGA_driver);/* 注册BGI驱动后可以不需要->BGI文件的支持运行 */
initgraph(&gd,&gm,"");
}
Status SetStackEmpty(SqStack *s)
{s->base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!s->base) return overflow;
s->top=s->base;
s->stacksize=STACK_INIT_SIZE;
return ok;
}
Status PushStack(SqStack *s,SElemType e)
{if(s->top-s->base>=s->stacksize)
{s->base=(SElemType *)(s->base,(s->stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!s->base) return error;
s->top=s->base+s->stacksize;
s->stacksize+=STACKINCREMENT;}
*s->top++=e;
return ok;
}
Status PopStack(SqStack *s,SElemType *e)
{ if(s->top==s->base) return error;
*e=*(--s->top);
return ok;
}
Status IsStackEmpty(SqStack *s)
{if(s->base==s->top) return true;
else return false;
}
void ScanLineFill4(int x,int Y,int oldColor,int newColor)
{ int xLeft,xRight,y,i;
bool isLeftEndSet,spanNeedFill;
SElemType *span;
SqStack *s;
/*填充并确定种子点(x,y)所在的区段*/
i=x; y=Y;
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;
isLeftEndSet=false;
while(getpixel(i,y)==oldColor) /*向左填充*/
{
putpixel(i,y,newColor);
i--;
}
if(i!=span->xLeft) /*确定区段左边界*/
{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;*/
/* ->->->->->-> */
} /*end of while(!isStackEmpty())*/
}/*end of ScanLineBoundaryFill4()*/
void ScanLineFill3(int x,int Y,int oldColor,int newColor)
{ int xLeft,xRight,y,i;
bool isLeftEndSet,spanNeedFill;
SElemType *span;
SqStack *s;
/*填充并确定种子点(x,y)所在的区段*/
i=x; y=Y;
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;
isLeftEndSet=false;
while(getpixel(i,y)==oldColor) /*向左填充*/
{
putpixel(i,y,newColor);
i--;
}
if(i!=span->xLeft) /*确定区段左边界*/
{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)*/
/* ->->->->->-> */
} /*end of while(!isStackEmpty())*/
}/*end of ScanLineBoundaryFill4()*/
void picture(int e,int X,int Y)
{
int i,n;
double x[5],y[5],a[5],b[5],r=0;
initgr();
for(i=0;i<5;i++)
{x[i]=100*cos(i*0.4*pi+0.05*pi*e)-100*sin(i*0.4*pi+0.05*pi*e)+X;
y[i]=100*sin(i*0.4*pi+0.05*pi*e)+100*cos(i*0.4*pi+0.05*pi*e)+Y;
putpixel(x[i],y[i],4); }
r=sin(0.1*pi)*100/sin(126.0/180.0*pi);
for(i=0;i<5;i++)
{a[i]=r*cos(i*0.4*pi+0.2*pi+0.05*pi*e)-r*sin(i*0.4*pi+0.2*pi+0.05*pi*e)+X;
b[i]=r*sin(i*0.4*pi+0.2*pi+0.05*pi*e)+r*cos(i*0.4*pi+0.2*pi+0.05*pi*e)+Y;
putpixel(a[i],b[i],4); }
for(i=0;i<4;i++)
{setcolor(10);line(x[i],y[i],a[i],b[i]); line(x[i]+40,y[i],a[i]+40,b[i]);
line(a[i],b[i],x[i+1],y[i+1]); line(a[i]+40,b[i],x[i+1]+40,y[i+1]);
}
setcolor(10);
line(x[4],y[4],a[4],b[4]); line(x[4]+40,y[4],a[4]+40,b[4]);
line(a[4],b[4],x[0],y[0]); line(a[4]+40,b[4],x[0]+40,y[0]);
}
main()
{
int x,y,i;
initgr(); /* BGI初始化 */
/*****此部分添加你自己的代码,例如
line(25,25,220,220);
cleardevice();
}
等等*****/
picture(1,310,240);
printf("Please enter (x,y)=");
scanf("%d,%d",&x,&y);
for(i=0;x>1;i++) {
ScanLineFill4(x,y,0,10+i);
ScanLineFill3(x,y-1,0,10+i);
scanf("%d,%d",&x,&y);}
printf("Finish!!!!!!!!!");
getch(); /* 暂停一下,看看前面绘图代码的运行结果 */
closegr(); /* 恢复TEXT屏幕模式 */
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -