原理
将种子点标记为true,填充好颜色后作为初始区段推入堆栈,循环栈内区段至空,根据区段标签沿x轴进行区段扩展逐一标记并填充,并在区段附近的4个方向上搜索新的区段,将符合条件的区段进行标记和填充后压入栈中。
每个区段包含的属性有:
Span{
x.Left, //区段在x轴上的左边界
x.Right, //区段在x轴上的右边界
y, //区段的y坐标
z, //区段的z坐标
SpanType, //区段的类型
ParentDirection //父区段在该区段的哪个方向
}
其中,区段的类型可以分成:
SpanType{
LeftSearchOnly, //仅需要沿x轴向左寻找符合条件的点加入区段
RightSearchOnly, //向右
AllNeedSearch, //向两侧
NoNeedSearch //不需要寻找
}
父区段的类型可以分成:
ParentDirection{
y上,
y下,
z上,
z下,
无
}
注意:当搜索至父区段方向上时,需要刨掉父区段,也就是将该区段分为两个区段进行逐一的搜索。
FloodFill()
{
新建区段,只包含种子点;
种子点上色,flag标记为true;
区段压入堆栈;
while(栈不为空)
{
从堆栈中取出某区段;
根据区段的类型选择进行以下操作:
FindXLeft();
FindXRight();
GetChec