Fork me on GitHub

图形学--区域填充算法

算法描述:
区域填充是指从区域内的某一个象素点(种子点)开始,由内向外将填充色扩展到整个区域内的过程。
区域是指已经表示成点阵形式的填充图形,它是相互连通的一组像素的集合。

区域填充算法(边界填充算法和泛填充算法)是根据区域内的一个已知象素点(种子点)出发,找到区域内其他象素点的过程,所以把这一类算法也成为种子填充算法。

下面给出八连通区域填充算法(四连通区域填充算法类似)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
/**
* begin_point 是起始点
* boundaryColor 是边界色
* fillColor 是填充色
* */
void eightAdjacentPointFillingAlgorithm(CPoint begin_point, COLORREF boundaryColor, COLORREF fillColor, CDC* pDC)
{
std::stack<CPoint> stack;//使用STL自带的栈容器
stack.push(begin_point);//将起点先入栈
CPoint* currentPoint = NULL;//当前操作的点

while(!stack.empty())//栈不空时进行循环
{
currentPoint = &stack.top();//访问栈顶元素
stack.pop();//删除栈顶元素
pDC->SetPixelV(*currentPoint, fillColor);//填充颜色

isFilling(&stack, currentPoint->x - 1, currentPoint->y, boundaryColor, fillColor, pDC);//左侧点
isFilling(&stack, currentPoint->x - 1, currentPoint->y - 1, boundaryColor, fillColor, pDC);//左上点
isFilling(&stack, currentPoint->x, currentPoint->y - 1, boundaryColor, fillColor, pDC);//上侧点
isFilling(&stack, currentPoint->x + 1, currentPoint->y + 1, boundaryColor, fillColor, pDC);//右上点
isFilling(&stack, currentPoint->x + 1, currentPoint->y, boundaryColor, fillColor, pDC);//右侧点
isFilling(&stack, currentPoint->x + 1, currentPoint->y - 1, boundaryColor, fillColor, pDC);//右下点
isFilling(&stack, currentPoint->x, currentPoint->y - 1, boundaryColor, fillColor, pDC);//下侧点
isFilling(&stack, currentPoint->x - 1, currentPoint->y - 1, boundaryColor, fillColor, pDC);//左下点

}
}

/**
* stack 是栈指针
* boundaryColor 是边界色
* fillColor 是填充色
*/
void isFilling(std::stack<CPoint> *stack, int x, int y, COLORREF boundaryColor, COLORREF fillColor, CDC* pDC)
{
COLORREF currentColor = pDC->GetPixel(x, y);;//获得当前操作点颜色
if (currentColor != boundaryColor && currentColor != fillColor)
{
stack->push(CPoint(x, y));
}
}

扫描二维码,拯救贫困山区大学生!
-------------本文结束感谢您的阅读-------------