本文主要介绍几种区域填充算法,重点解释多边形的扫描线填充算法,最后实现了多边形填充算法,包括在附录文件中。在参考【5】中,作者详细介绍了一系列区域填充算法,可以查看相应网页。代码的下载地址为:https://github.com/twinklingstar20/twinklingstar_cn_region_polygon_fill_scanline/
1. 1.区域的定义和填充
1.1像素定义的区域(Pixel-Defined Region)
1.1.1 边界定义区域(boundary-defined)
定义某些像素是边界,边界包围着一块区域。填充所有在边界内的相连通的像素,主要分下面几个步骤:
从区域内部一个像素点开始
判断这个像素是否是一个边界像素点或者已经被填充了
如果都不是,就把它填充,然后开始设置邻居像素点。
用图片演示这个过程,如下面的幻灯片所示,代码片段如下所示:
void boundaryFill4 (int x, int y, int fill, int boundary)
{
int current;
current = getPixel (x,y);
if (current != boundary && current !=fill)
{
setColor(fill);
setPixel(x,y);
boundaryFill4 (x+1, y, fill, boundary);
boundaryFill4 (x−1, y, fill, boundary);
boundaryFill4(x, y+1, fill, boundary);
bonddaryFill4(x, y−1, fill, boundary);
}
}
1.1.2 内定义区域(interior-defined)
内定义区域的定义是:给定一个像素S,颜色是C,区域R指与S连通的且颜色都是C的像素集合(Region R is the set of all pixels having color C that are “connected” to a given pixel S)。
如果两个像素连通,则它们之间有一条“相邻(adjacent)”像素组成的连续路径,所以连通的概念就依赖“相邻”的定义。在图形学中,相邻通常有两种定义:
(1) 四相邻(4-Adjacent):两个像素是四相邻的,则它们在彼此水平或者垂直相邻的位置上,如图1所示:
图1. 四相邻
(2) 八相邻(8-Adjacent):两个像素是八相邻的,则它们在彼此水平、垂直或者是斜方向上相邻的位置,如图2所示:
图2. 八相邻
<