1、1,实验三 区域填充,时间: 13班,周三上午12节 46班,周一上午12节 地点: 8-322 内容: 输入一个多边形的各顶点坐标,在屏幕上画出该多边形,并且选用任意一种区域填充算法对多边形区域进行填充。,2,边界标志算法边界标志算法是按照扫描线的顺序,把每条扫描线上位于多边形内的象素置成多边形色. 算法过程: 对多边形的每一条边进行扫描转换,即对多边形边界所经过的象素作一个边界标志。 对每条与多边形相交的扫描线,按从左到右的顺序,逐个访问该扫描线上的象素。 取一个布尔变量inside来指示当前点的状态,若点在多边形内,则inside为真。若点在多边形外,则inside为假。 Inside
2、的初始值为假,每当当前访问象素为被打上标志的点,就把inside取反。对未打标志的点,inside不变。,3,void edgeMarkFill(Polydef p,Color c)boolean insideFlag=false;int i,j;对多边形每条边扫描转换,在每个边界点x,y上打标识for(j=最小相交扫描线;j=最大相交扫描线;j+)for(i=0;i水平分辨率;i+)if (像素被打上标识) insideFlag = !insideFlag;if (insideFlag) putPixel(i,j,c); ,4,存在问题,顶点 水平边 斜率小于1的边,5,edgeMarkFi
3、ll(int n,int *p,int color) int insideFlag=0,c1=0,c2=0;int max,min;int i,j,x,y;for(i=1,max=min=p1;ipi)min=pi;for(y=min+1;ymax;y+)for(x=0;x640;x+)c1=c2; c2=getpixel(x,y);if(c1=color ,6,#include main ( ) int gd = DETECT , gm,color=RED;int points=120,80,250,150,120,240,20,120,120,80;initgraph ( ,7,算法改进:
4、 只求外接矩形内的点 for(i=1,maxY=minY=p1;ipi)minY=pi; for(i=0,maxX=minX=p0;ipi)minX=pi; for(i=minY+1;imaxY;i+)for(j=minX;j=maxX;j+)c1=c2;c2=getpixel(j,i);if(c1=color,8,此算法不适合以下情况,凹多边形 细小填充区域,9,DDA_line(int x0,int y0,int x1,int y1)int y,t;float x,dx;if(y0=y1) return;if(y0y1)t=x0;x0=x1;x1=t;t=y0;y0=y1;y1=t;dx=(x1-x0)/(y1-y0);x=x0;for(y=y0;y=y1;y+)putpixel(int)(x+0.5),y,WHITE);x=x+dx; ,也可自己编写边界扫描过程代码,for(i=0;i4;i+) DDA_line(points2*i,points2*i+1,points2*i+2,points2*i+3);,