计算机图形学实验报告8-种子点填充

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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);

相关文档
最新文档