实验报告
课程名称:
计算机图形学
实验项目:
多边形填充算法
专业班级:
计算机 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