⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 10.c

📁 计算机图形学
💻 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 + -