图形学_多边形扫描转换_边界标志算法
来源:互联网 发布:英语听力口语软件 编辑:程序博客网 时间: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
- 图形学_多边形扫描转换_边界标志算法
- 图形学_椭圆扫描转换_中点椭圆算法
- 图形学_圆的扫描转换
- 计算机图形学:多边形的扫描转换算法(有详细代码)
- 边界标志填充算法(计算机图形学)
- 多边形扫描转换算法
- 多边形扫描转换算法
- 计算机图形学(三)_图元的属性_12_ 曲线边界区域的扫描线填充
- 多边形的扫描转换算法
- 边标志扫描算法,种子填充算法,计算机图形学
- 【图形学】边标志算法or边界标志算法(无错误版)
- 图形学(4)多边形的扫描转换(上)
- 图形学(5)多边形的扫描转换(下)
- 计算机图形学(三)_图元的属性_10_ 通用扫描填充算法
- 计算机图形学 学习笔记(二):多边形扫描转换(X扫描线算法,即改进的X扫描线算法)
- MFC下实现图形学之多边形扫描转化填充算法
- 图形学_画线算法(DDA、Bresenham)
- 边界标志算法
- error: 'for' loop initial declarations are only allowed in C99 mode 的原因及解决办法
- 图形学_画线算法(DDA、Bresenham)
- 图形学_圆的扫描转换
- 图形学_椭圆扫描转换_中点椭圆算法
- iOS动画特效
- 图形学_多边形扫描转换_边界标志算法
- 图形学_二维图形的剪裁_Sutherland-Hodgeman_Cohen—Sutherland
- HDOJ1009
- javascript 字符串判断是否为空
- HDOJ 1017
- HDOJ 1021 分析
- OpenGL ES 创建流程
- HDOJ 1048
- HDOJ 1076