1、计算机图形学实验报告任课教师:钱文华2016 年春季学期实验: 四连通区域种子填充算法实验时间:2016 年 12 月 8 日实验地点:信息学院 2204实验目的:掌握种子填充算法的原理,并会用种子填充算法和opengl 并结合使用 c+语言编写程序绘制多边形。实验原理:种子填充算法又称为边界填充算法。其基本思想是:从多边形区域的一个内点开始,由内向外用给定的颜色画点直到边界为止。如果边界是以一种颜色指定的,则种子填充算法可逐个像素地处理直到遇到边界颜色为止。内点的检测条件:if(interiorColor!=borderColor glMatrixMode(GL_PROJECTION); g
2、luOrtho2D(0.0,300.0,0.0,300.0); void setPixel(int x,int y,long fillColor) glColor3f(fillColor16,fillColor8,fillColor); glBegin(GL_POINTS); glVertex2i(x,y); glEnd(); void boundaryFill4(int x,int y,long fillColor,long borderColor) unsigned char params3;long interiorColor; glReadPixels(x,y,1,1,GL_RGB,G
3、L_UNSIGNED_BYTE,params); interiorColor=RGB(params0,params1,params2); if(interiorColor!=borderColor boundaryFill4(x+1,y,fillColor,borderColor); boundaryFill4(x-1,y,fillColor,borderColor); boundaryFill4(x,y+1,fillColor,borderColor); boundaryFill4(x,y-1,fillColor,borderColor); void lineSegment(void) lo
4、ng borderColor=RGB(255,0,0);long fillColor=RGB(0,0,255); glClear(GL_COLOR_BUFFER_BIT); glColor3f(255,0,0); glBegin(GL_LINE_LOOP); glVertex2i(0,40); glVertex2i(20,0); glVertex2i(60,0);glVertex2i(80,40); glVertex2i(60,80); glVertex2i(20,80); glEnd(); boundaryFill4(60,60,fillColor,borderColor);glFlush(
5、); void main(int argc,char* argv) glutInit( glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutInitWindowPosition(150,100); glutInitWindowSize(300,300); glutCreateWindow(“种子填充“); init(); glutDisplayFunc(lineSegment); glutMainLoop(); 上实验课时机房的实验结果:后来的实验结果:glVertex2i(0,40); glVertex2i(20,0); glVertex2i(60,
6、0);glVertex2i(80,40); glVertex2i(60,80); glVertex2i(20,80); glEnd(); boundaryFill4(60,60,fillColor,borderColor);以上这段程序改成如下glVertex2i(90, 40);glVertex2i(120, 100);glVertex2i(90, 160);glVertex2i(60, 160);glVertex2i(60, 40); glEnd(); boundaryFill4(70,60,fillColor,borderColor);改变参数后:再把 glVertex2i(90, 40
7、);glVertex2i(120, 100);glVertex2i(90, 160);glVertex2i(60, 160);glVertex2i(60, 40); glEnd(); boundaryFill4(70,60,fillColor,borderColor);改成 glVertex2i(100, 100);glVertex2i(200, 100);glVertex2i(150, 150);/glVertex2i(60, 160);/glVertex2i(60, 40); glEnd(); boundaryFill4(150,120,fillColor,borderColor);后的结果如下图:实验总结:通过多组数据的测试,知道了上面算法的正确,普适性。种子填充的递归算法的优点是原理非常简单,容易理解,缺点是由于多次递归,费时,费内存,效率不高,需要大量栈空间来存储相邻的点,太大的区域会由于递归太深而无法运行。为了减少递归次数,可采用扫描线种子算法。扫描线填充算法就是它的改进的方法。它是通过沿扫描线填充水平像素段,来处理四连通或八连通相邻点,这样就仅仅只需要将每个水平像素段的起始位置压入栈,而不需要将当前位置周围尚未处理的相邻像素都压入栈,从而可以节省大量的栈空间。