计算机图形学实验报告8-种子点填充
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《计算机图形学实验》报告
2016年春季学期
实验四:种子点填充算法 Seed Filling
实验时间:2016年9月底
实验地点:
实验目的:掌握使用opengl 的种子点填充算法,观察改变参数对生成图形的改变(改变点的位置、颜色等)
如果要填充的区域是以图像元数据方式给
出的,通常使用种子填充算法进行区域填
充。种子填充算法的核心是一个递归算法,
都是从指定的种子点开始,向各个方向上搜
索,逐个像素进行处理,直到遇到边界。种子填充算法常用四连通域和八连通域技术进行填充操作。
从区域内任意一点出发,通过上、下、左、右四个方向到达区域内的任意像素。用这种方法填充的区域就称为四连通域;这种填充方法称为四向连通算法。
从区域内任意一点出发,通过上、下、左、右、左上、左下、右上和右下八个方向到达区域内的任意像素。用这种方法填充的区域就称为八连通域;这种填充方法称为八向连通算法。
算法的优点是非常简单,缺点是需要大量栈空间来存储相邻的点。
程序代码:
使用的运行环境是vc++6.0
#include
#include
typedef float Color[3];
//获取像素点的颜色
void getpixel(GLint x, GLint y, Color color) {
glReadPixels(x, y, 1, 1, GL_RGB, GL_FLOAT, color); //OPENGL自带}
//画点函数
void setpixel(GLint x, GLint y) {
glBegin(GL_POINTS);
glVertex2f(x, y);
glEnd();
}
//比较颜色是否相等
int compareColor(Color color1, Color color2) {
if (color1[0] != color2[0] || color1[1] != color2[1] || color1[2] != color2[2]) { return 0; }
else { return 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) {
setpixel(x, y);
boundaryFill4(x + 1, y, fillColor, boarderColor);
boundaryFill4(x - 1, y, fillColor, boarderColor);
boundaryFill4(x, y + 1, fillColor, boarderColor);
boundaryFill4(x, y - 1, fillColor, boarderColor);
}
}
void boundaryFill8(int x, int y, Color fillColor, Color boarderColor) {
Color interiorColor, a, b, c, d;
getpixel(x, y, interiorColor);
getpixel(x + 1, y, a);
getpixel(x, y - 1, b);
getpixel(x, y + 1, c);
getpixel(x - 1, y, d);
int i = 0;
if (compareColor(a, boarderColor) == 1) i++;
if (compareColor(b, boarderColor) == 1) i++;
if (compareColor(c, boarderColor) == 1) i++;
if (compareColor(d, boarderColor) == 1) i++;
if (i <= 1) {
if (compareColor(interiorColor, fillColor) == 0 && compareColor(interiorColor, boarderColor) == 0) {
setpixel(x, y);
boundaryFill8(x+1,y,fillColor,boarderColor);
boundaryFill8(x-1,y,fillColor,boarderColor);
boundaryFill8(x,y+1,fillColor,boarderColor);
boundaryFill8(x,y-1,fillColor,boarderColor);
boundaryFill8(x-1,y+1,fillColor,boarderColor);
boundaryFill8(x-1,y-1,fillColor,boarderColor);
boundaryFill8(x+1,y+1,fillColor,boarderColor);
boundaryFill8(x+1,y-1,fillColor,boarderColor);
}
}
}
void polygon() {
glBegin(GL_LINE_LOOP);
glLineWidth(5);
//此处修改坐标,绘制多边形
glVertex2f(100, 150);
glVertex2f(150, 200);