4连通边界填充算法

本文介绍了一种基于计算机图形学的4连通边界填充算法,并提供了完整的C/C++实现代码。该算法能够有效地填充指定区域内的颜色,适用于多边形等形状的填充任务。

提前的配置和8连通的(上一篇相同)

4连通的代码如下:

#include <GL/glut.h>
#include <math.h>
typedef float Color[3];
rgbColorEqual(Color c1,Color c2)
{
if(abs(c1[1]-c2[1])<0.001 && abs(c1[2]-c2[2])<0.001 && abs(c1[0]-c2[0])<0.001)
return true;
else
return false;
}
void setPixel(GLint x, GLint y)
{
glBegin(GL_POINTS);
glVertex2i(x, y);
glEnd();
}
void getPixel(GLint x, GLint y, Color c)
{
glReadPixels(x,y,1,1,GL_RGB,GL_FLOAT,c);
}

void BoundaryFill8(int x, int y,Color fillColor,Color borderColor)
{
Color currentColor;
getPixel(x,y,currentColor);
if((!rgbColorEqual(currentColor,fillColor))&&(!rgbColorEqual(currentColor,borderColor)))
{
//setColor(fillColor);
setPixel(x,y);
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 init(void)
{
glClearColor(1.0,1.0,1.0,0.0);
glMatrixMode (GL_PROJECTION);
gluOrtho2D (0.0, 200.0, 0.0, 200.0);

}
void Draw(void)
{
Color a={1.0,0.0,0.0},b={0.0,1.0,1.0};
glColor3fv(b);
glClear(GL_COLOR_BUFFER_BIT);
//设置边界线宽,否则填充时会溢出
glLineWidth(4.0);
//绘制多边形区域
glBegin(GL_LINE_LOOP);
glVertex2i(90, 40);
glVertex2i(120, 100);
glVertex2i(90, 160);
glVertex2i(60, 160);
glVertex2i(60, 40);
glEnd();
glColor3fv(a);
BoundaryFill8(70,60,a,b);
glFlush();
}
void main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowPosition(100, 100);
glutInitWindowSize(200, 200);
glutCreateWindow("4连通边界填充算法!");
init();
glutDisplayFunc(Draw);
glutMainLoop();
}

程序执行完则显示填充完整个多边形

第三章作业 1. 〔6分〕名词解释:扫描转换、增量算法、反走样。 扫描转换:根本图形的光栅化就是在像素点阵中确定最正确逼近与理想图形的像素点集 ,并用指定颜色显示这些像素点集的过程。当光栅化与按扫描线顺序绘制图形的过程集 合在一起时,也称为扫描转移。 增量算法:在一个迭代算法中,如果每一步X,Y值是用前一步的值加上一个增量来获得 的,那么,这个算法就称为增量算法。 反走样:用于减轻走样的技术称为反走样或者称为抗锯齿。 2. 〔10分〕计算起点坐标为〔0,0〕,终点坐标〔12,9〕直线的中点Bresenham算法的每一 步坐标值以及中点偏差判别式d的值,填入表3-1中,并用黑色绘制图3- 29中的直线段的扫描转换像素。 图3-29 像素点阵 "x "y "d "x "y "d " "0 "0 "-0.25 "7 "5 "-0.5 " "1 "1 "0 "8 "6 "-0.25 " "2 "1 "-0.75 "9 "6 "0 " "3 "2 "-0.5 "10 "7 "-0.75 " "4 "3 "-0.25 "11 "8 "-0.5 " "5 "3 "0 "12 "9 "-0.25 " "6 "4 "-0.75 " " " " 表3-1 x,y和d的值 第章作业 1. 〔10分〕名词解释:邻接点、八邻接点、连通域、八连通域、种子填充算法邻接点:对于多边形区域内部任意一个种子像素,其上、下、左、右这个像素,称 为邻接点。 八邻接点:对于多边形区域内部任意一个种子像素,其上、下、左、右以及左上、左下 、右上、右下这八个像素,称为八邻接点。 连通域:对于多边形区域内部任意一个种子子素出发,通过访问其上、下、左、右这 个邻接点可以遍历区域内部的所有像素,该多边形区域称为连通域。 八连通域:对于多边形区域内部任意一个种子子素出发,通过访问其上、下、左、右以 及左上、左下、右上、右下这八个邻接点可以遍历区域内部的所有像素,该多边形区域 称为八连通域。 种子填充算法:从区域内任意一个种子像素开场,由内向外将填充色扩散到整个多边形 区域的填充过程。 2. 〔10分〕试写出图4-43所示多边形的边表和扫描线y=4的有效边表。 图4-43 多边形 解:ET表 Y=4时的AET表 3. 〔10分〕图中种子O,试根据简单连通种子填充算法按左、上、右、下入栈的顺序给 出象素点填充的次序。 " " " " " " " " "3 "O "4 "5 " " " "2 "1 " "6 " " " " " " " " " 第五章作业 1. 〔10分〕名词解释:坐标变换、WCS、UCS、窗口、视区、窗视变换、裁剪、 坐标变更:是坐标系发生变换,但物体位置不发生改变,然后在新坐标系下表示所有物 体上的顶点。 WCS:〔word coordinate system〕世界坐标系,描述现实世界中场景的固定坐标系。 UCS:〔user coordinate system〕用户坐标系,描述物体几何模型的坐标系。有时也称为局域坐标系〔local coordinate system,LCS〕。用户坐标系也是实数域坐标系、 窗口:在观察坐标系中定义确实定显示内容的矩形区域称为窗口。 视区:在屏幕坐标系中定义的输出图形的矩形区域称为视区。 窗视变换:图形输出需要进展窗口到视区的变换,只有在窗口内的图形才能在视区中输 出,并且输出的形状要根据视区的大小进展调整,这称为窗视变换。 裁剪:在二维观察中,需要在观察坐标系下根据窗口大小对世界坐标系中的二维图形进 展裁剪,只将位于窗口内的图形变换到视区输出。 2. 〔10分〕如图5- 51所示,求P0(4,1)、P1〔7,3〕、P2〔7,7〕、P3〔1,4〕构成的边形绕 Q(5,4)逆时针旋转45°的变换矩阵和变换后图形的顶点坐标。 图5-51 边形旋转 解:变换的过程包括: 1. 平移:将P点平移至原点,变换矩形为: 2. 旋转:图形绕原点〔P点〕旋转45度,变换矩形为: 3. 反平移:将P点移回原处,变换矩阵为: 变换矩阵为: 变换过程为: 3. 〔14分〕用编码裁剪算法裁剪线段P0(0,2),P1(3,3),裁剪窗口为wxl=1,wxr=6,wy b=1,wyt=5,如图5-54所示。要求写出: 〔1〕窗口边界划分的9个区间的编码原那么。 〔2〕线段端点的编码。 〔3〕裁剪的主要步骤。 〔4〕裁剪后窗口内直线段的端点坐标。 图5-54 直线段裁剪 解:1〕首先对直线段的端点进展编码,即对直线段的任一端点〔x,y〕,根据其坐标所 在的区域,赋予一个位的二进制码D3D2D1D0 假设x<wxl,那么D0=1,否那么D0=0; 假设x>wxr,那么D1=1,否那么D1=0; 假设y<wyb,那么D2=1,否那么D2=
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值