首页 > 代码库 > 图形学_多边形扫描转换_边界标志算法

图形学_多边形扫描转换_边界标志算法

边界标志算法

1. 对多边形的每一条边进行扫描转换,即对多边形边界所经过的象素作一个边界标志。

2.填充

    对每条与多边形相交的扫描线,按从左到右的顺序,逐个访问该扫描线上的象素。

    取一个布尔变量inside来指示当前点的状态,若点在多边形内,则inside为真。若点在多边形外,则inside为假。

    Inside 的初始值为假,每当当前访问象素为被打上标志的点,就把inside取反。对未打标志的点,inside不变。

 

 

  1 #include "easyx.h"
  2 #include "math.h"
  3 #include "windows.h"
  4 #include "stdio.h"
  5 #include "stdlib.h"
  6 #include "conio.h"
  7 #include "graphics.h"
  8 
  9 int maxx,maxy,minx,miny;   //图形的边界
 10 
 11 void dda(int x1,int y1,int x2,int y2)
 12 {
 13     int steps;
 14     double xin,yin,dx,dy,x,y;
 15     dx = x2 - x1;
 16     dy = y2 - y1;
 17 
 18 
 19     if(fabs(dx) > fabs(dy))
 20         steps = fabs(dx);
 21     else
 22         steps = fabs(dy);
 23     xin = (double)(dx/steps);
 24     yin = (double)(dy/steps);
 25     x = x1;
 26     y = y1;
 27     
 28     int xfom,yfom;  //保存之前一个的坐标
 29     putpixel(x,y,RGB(0,0,255)); 
 30     COLORREF k = RGB(0,0,255);
 31     for(int i = 0;i <= steps;i ++)
 32     {
 33  
 34         xfom = x;
 35         yfom = y;    
 36         x = x + xin;  
 37         y = y + yin;
 38         
 39         if(yfom != (int)y)
 40            putpixel(x,y,k);
 41 
 42         if((y == maxy) || (y == miny))
 43             putpixel(x,y,RGB(255,255,255));  //处理极值奇点,涂成背景色
 44     }
 45 
 46 
 47 }
 48 
 49 //填充多边形
 50 void filling()
 51 {
 52     putpixel(maxx,maxy,RGB(255,255,255));  //处理极值奇点,涂成背景色
 53     putpixel(minx,miny,RGB(255,255,255));  //处理极值奇点,涂成背景色
 54     
 55     double x1, y1;
 56     int in_flag;  //指示当前点的状态是否在边界内部 
 57     for(y1 = miny-1 ; y1 <maxy;y1++)
 58     { 
 59         in_flag = 0;//多边形内部标志变量
 60         for( x1 = minx-1;x1<maxx;x1++)
 61         { 
 62             COLORREF l,m;
 63             l = getpixel(x1,y1);
 64             m = RGB(0,0,255);//多边形边界颜色
 65             if (l == m)     {
 66                 if (in_flag == 0)     in_flag = 1;
 67                 else     in_flag = 0;
 68             }
 69             if (in_flag)
 70                 putpixel(x1,y1,RGB(0,0,255));
 71             //在多边形内部填充色蓝色
 72             else  
 73                 putpixel(x1,y1,RGB(255,255,255));
 74             //在多边形外部填充色白色    
 75         }
 76     } 
 77     
 78 }
 79 
 80 
 81 
 82 
 83 
 84 
 85 
 86 int main()
 87 { 
 88     //硬件测试,将gd装入图形驱动器,gm置入最大图形模式。 
 89     int gd=DETECT,gm;
 90     int x[100],y[100];    
 91     int n;   //代表边的个数
 92     printf("请输入多边形边的个数: ");
 93     scanf("%d",&n);
 94     printf("\n请依次输入多边形每一个点的坐标:\n");
 95     scanf("%d%d",&x[0],&y[0]);
 96     maxx = x[0]; 
 97     minx = x[0];
 98     maxy = y[0];
 99     miny = y[0];
100     for(int i = 1;i < n;i ++)
101     {
102         scanf("%d%d",&x[i],&y[i]);
103         if(maxx < x[i])    //图形的边界
104             maxx = x[i];
105         if(minx > x[i])
106             minx = x[i];
107         if(maxy < y[i])
108             maxy = y[i];
109         if(miny > y[i])
110             miny = y[i];
111     }
112     
113     //图形初始化
114     initgraph(&gd,&gm,"c:\\tc");
115     //设置兰背景。
116     setbkcolor(WHITE);
117     cleardevice();
118     
119     for(int j = 1;j < n;j ++)
120         dda(x[j - 1],y[j - 1],x[j],y[j]);
121     dda(x[0],y[0],x[n-1],y[n-1]);
122     
123     filling(); //填充多边形
124 
125     getch(); 
126     closegraph(); 
127     return 0;
128 }