图形学_多边形扫描转换_边界标志算法
时间:2014-04-27 20:53:06
收藏:0
阅读:698
边界标志算法
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)