logo资料库

计算机图形学VSC++openGL四邻接填充.doc

第1页 / 共8页
第2页 / 共8页
第3页 / 共8页
第4页 / 共8页
第5页 / 共8页
第6页 / 共8页
第7页 / 共8页
第8页 / 共8页
资料共8页,全文预览结束
实验报告 课程名称: 计算机图形学 实验项目: 多边形填充算法 专业班级: 计算机 1502 班 姓 名: 代春宁 学 号: 150405211 实验室号: 信息楼 205 实验组号: 11 实验时间: 2018.4.10 批阅时间: 指导教师: 刘嘉敏 成 绩:
沈阳工业大学实验报告 (适用计算机程序设计类) 专业班级: 计算机 1502 班 学号: 150405211 姓名: 代春宁 实验名称:多边形填充算法 1.实验目的: (1)掌握绘制多边形的方法; (2)掌握四连通域和八连通域的概念; (3)掌握四邻接点区域填充算法。 2.实验内容: 绘制一个空心汉字,并实现填充 要求: (1)必须使用所讲的算法(任选其一); (2)根据每个人的姓名选择一个汉字,笔画在必须>=5; (3)空心字体不限。 3. 实验方案(程序设计说明) 使用 OpenGL 库中的直线生成函数,通过描点连线的方式,构造出空心汉字, 再根据空心汉字的位置和结构,选取对应的种子进行四连通域的填充,完成填充 实验。 4. 出现的问题及解决方法 (1)我在第一次进行种子填充算法的时候,运行时总是提示 stack overflow(栈 溢出) 解决方法:询问了采用同样使用种子填充算法的同学,由于种子填充算法会大量 的压栈,而编译器默认的栈空间又不是太大,很容易出现栈溢出的情况而不能运 行,于是我调小了描点的范围,重新运行程序。 (2)在填充算法当中,颜色不知道怎么传给形参 解决方法:使用 typedef float Color[3]将颜色定义为一种类型,类似于数组 的结构,便于传参和填充时进行颜色比较。 5.程序代码及运行结果 见附件 A 1
附件 A 沈阳工业大学实验报告 (适用计算机程序设计类) 专业班级: 计算机 1502 班 学号: 150405211 姓名: 代春宁 实验步骤或程序: 主要代码: #include #include typedef float Color[3]; //颜色数据类型 void getpixel(GLint x , GLint y , Color color) //获取像素点的颜色 { } glReadPixels(x , y , 1 , 1 , GL_RGB , GL_FLOAT , color); int compareColor(Color color1 , Color color2) //颜色比较 { } if(color1[0] != color2[0] || color1[1] != color2[1] || color1[2] != color2[2]) { } else { } return 0; //两种颜色不同,返回0 return 1; //两种颜色相同,返回1 void boundaryFill4(int x , int y , Color fillColor , Color boarderColor) //四邻接点填充 { Color interiorColor; getpixel(x,y,interiorColor); if(compareColor(interiorColor , fillColor) == 0 && compareColor(interiorColor , boarderColor) == 0) { glBegin(GL_POINTS); glVertex2f(x,y); glEnd(); boundaryFill4(x+1 , y , fillColor , boarderColor); boundaryFill4(x-1 , y , fillColor , boarderColor); boundaryFill4(x , y+1 , fillColor , boarderColor); boundaryFill4(x , y-1 , fillColor , boarderColor); 2
} } void draw_lines() { glBegin(GL_LINE_LOOP); glLineWidth(3); glVertex2i(200,200); glVertex2i(220,200); glVertex2i(230,195); glVertex2i(230,250); glVertex2i(200,250); glVertex2i(200,200); glEnd(); glBegin(GL_LINE_LOOP); glLineWidth(3); glVertex2i(210,210); glVertex2i(220,210); glVertex2i(220,220); glVertex2i(210,220); glVertex2i(210,210); glEnd(); glBegin(GL_LINE_LOOP); glLineWidth(3); glVertex2i(210,230); glVertex2i(220,230); glVertex2i(220,240); glVertex2i(210,240); glVertex2i(210,230); glEnd(); glBegin(GL_LINE_LOOP); glLineWidth(3); glVertex2i(220,325); glVertex2i(210,325); glVertex2i(210,310); glVertex2i(200,310); glVertex2i(200,300); glVertex2i(210,300); glVertex2i(210,290); glVertex2i(195,290); glVertex2i(195,280); glVertex2i(210,280); 3
glVertex2i(210,270); glVertex2i(190,270); glVertex2i(190,260); glVertex2i(210,260); glVertex2i(190,253); glVertex2i(170,250); glVertex2i(180,240); glVertex2i(200,250); glVertex2i(215,255); glVertex2i(230,250); glVertex2i(240,240); glVertex2i(270,240); glVertex2i(240,250); glVertex2i(220,260); glVertex2i(240,260); glVertex2i(240,270); glVertex2i(220,270); glVertex2i(220,280); glVertex2i(235,280); glVertex2i(235,290); glVertex2i(220,290); glVertex2i(220,300); glVertex2i(230,300); glVertex2i(230,310); glVertex2i(220,310); glVertex2i(220,325); glEnd(); } void display() { Color fillColor = {0.0 , 0.0 , 0.0};// 黑色填充 Color boarderColor = {0.0 , 0.0 , 0.0}; //边界色 glClear(GL_COLOR_BUFFER_BIT); glViewport(0 , 0 , 500 , 500); glColor3fv(boarderColor); draw_lines(); boundaryFill4(215 , 205 , fillColor , boarderColor); //四邻接点填充速度快 boundaryFill4(215 , 265 , fillColor , boarderColor); glFlush(); 4
} int main(int argc , char *argv[]) { } glutInit(&argc , argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowSize(500 , 500); glutInitWindowPosition(100, 100); glutCreateWindow("name"); glClearColor(1.0 , 1.0 , 1.0 , 0.0); glMatrixMode(GL_PROJECTION); gluOrtho2D(0.0 , 500.0 , 0.0 , 500.0); glutDisplayFunc(display); glutMainLoop(); return 0; 运行截图: 空心汉字 5
填充后结果 6
7
分享到:
收藏