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

📄 4.6.2.c

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