图形学入门(3)——区域填充算法(region filling)
继续图形学之旅,我们已经解决了如何画线和画圆的问题,接下来要解决的是,如何往一个区域内填充颜色?对一个像素填充颜色只需调用SetPixel之类的函数就行了,所以这个问题其实就是:如何找到一个区域内的所有像素? 区域的表示方法 定义一个区域可以有两种方法,即 内点表示法 和 边界表示法 ,内点表示就是指用一种颜色表示区域内的点,只要当前像素是这种颜色就在区域内,边界表示就是用一种颜色表示区域边界,只要当前像素是这种颜色就表示到达了区域边界。 简单的种子填充算法 最简单暴力的填充算法即是从区域内一点出发,向四周扩散填充,到达区域边界时停止,常见的有 四邻法 和 八邻法 两种,顾名思义,一个是向上下左右四个方向扩散填充,另一个是向周围八个方向扩散,四邻法可以确保不溢出区域边界,但有可能出现一次填不满区域的情况,八邻法则相反,一定能填充满当前区域,但有从对角线溢出边界的危险。 边界表示的四邻法代码实现: void BoundaryFill4(HDC hdc, int x, int y, COLORREF boundaryColor, COLORREF newColor) { COLORREF c = GetPixel(hdc, x, y); if (c != newColor && c != boundaryColor) { SetPixel(hdc, x, y, newColor);