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

来源:互联网 发布:英语听力口语软件 编辑:程序博客网 时间:2024/05/16 08:43

边界标志算法

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 }

 

 

 

0 0
原创粉丝点击