案例10 扫描线种子填充算法

合集下载

扫描线填充算法讲解

扫描线填充算法讲解

扫描线算法(S c a n-L i n e F i l l i n g)扫描线算法适合对矢量图形进行区域填充,只需要直到多边形区域的几何位置,不需要指定种子点,适合计算机自动进行图形处理的场合使用,比如电脑游戏和三维CAD软件的渲染等等。

对矢量多边形区域填充,算法核心还是求交。

《计算几何与图形学有关的几种常用算法》一文给出了判断点与多边形关系的算法――扫描交点的奇偶数判断算法,利用此算法可以判断一个点是否在多边形内,也就是是否需要填充,但是实际工程中使用的填充算法都是只使用求交的思想,并不直接使用这种求交算法。

究其原因,除了算法效率问题之外,还存在一个光栅图形设备和矢量之间的转换问题。

比如某个点位于非常靠近边界的临界位置,用矢量算法判断这个点应该是在多边形内,但是光栅化后,这个点在光栅图形设备上看就有可能是在多边形外边(矢量点没有大小概念,光栅图形设备的点有大小概念),因此,适用于矢量图形的填充算法必须适应光栅图形设备。

2.1扫描线算法的基本思想扫描线填充算法的基本思想是:用水平扫描线从上到下(或从下到上)扫描由多条首尾相连的线段构成的多边形,每根扫描线与多边形的某些边产生一系列交点。

将这些交点按照x坐标排序,将排序后的点两两成对,作为线段的两个端点,以所填的颜色画水平直线。

多边形被扫描完毕后,颜色填充也就完成了。

扫描线填充算法也可以归纳为以下4个步骤:(1)求交,计算扫描线与多边形的交点(2)交点排序,对第2步得到的交点按照x值从小到大进行排序;(3)颜色填充,对排序后的交点两两组成一个水平线段,以画线段的方式进行颜色填充;(4)是否完成多边形扫描?如果是就结束算法,如果不是就改变扫描线,然后转第1步继续处理;整个算法的关键是第1步,需要用尽量少的计算量求出交点,还要考虑交点是线段端点的特殊情况,最后,交点的步进计算最好是整数,便于光栅设备输出显示。

对于每一条扫描线,如果每次都按照正常的线段求交算法进行计算,则计算量大,而且效率底下,如图(6)所示:图(6)多边形与扫描线示意图观察多边形与扫描线的交点情况,可以得到以下两个特点:(1)每次只有相关的几条边可能与扫描线有交点,不必对所有的边进行求交计算;(2)相邻的扫描线与同一直线段的交点存在步进关系,这个关系与直线段所在直线的斜率有关;第一个特点是显而易见的,为了减少计算量,扫描线算法需要维护一张由“活动边”组成的表,称为“活动边表(AET)”。

实验2:多边形区域扫描线填充或种子填充

实验2:多边形区域扫描线填充或种子填充

实验2:多边形区域扫描线填充或种子填充一、实验目的1.通过实验,进一步理解和掌握几种常用多边形填充算法的基本原理2.掌握多边形区域填充算法的基本过程3.掌握在C/C++环境下用多边形填充算法编程实现指定多边形的填充。

二、实验内容用种子填充算法和扫描线填充算法等任意两种算法实现指定多边形的区域填充。

三、实验原理种子填充算法又称为边界填充算法。

其基本思想是:从多边形区域的一个内点开始,由内向外用给定的颜色画点直到边界为止。

如果边界是以一种颜色指定的,则种子填充算法可逐个像素地处理直到遇到边界颜色为止。

种子填充算法常用四连通域和八连通域技术进行填充操作。

四向连通填充算法:a)种子像素压入栈中;b)如果栈为空,则转e);否则转c);c)弹出一个像素,并将该像素置成填充色;并判断该像素相邻的四连通像素是否为边界色或已经置成多边形的填充色,若不是,则将该像素压入栈;d)转b);e)结束。

扫描线填充算法的基本过程如下:当给定种子点(x,y)时,首先填充种子点所在扫描线上的位于给定区域的一个区段,然后确定与这一区段相连通的上、下两条扫描线上位于给定区域内的区段,并依次保存下来。

反复这个过程,直到填充结束。

区域填充的扫描线算法可由下列四个步骤实现:(1)初始化:堆栈置空。

将种子点(x,y)入栈。

(2)出栈:若栈空则结束。

否则取栈顶元素(x,y),以y作为当前扫描线。

(3)填充并确定种子点所在区段:从种子点(x,y)出发,沿当前扫描线向左、右两个方向填充,直到边界。

分别标记区段的左、右端点坐标为xl和xr。

(4)并确定新的种子点:在区间[xl,xr]中检查与当前扫描线y上、下相邻的两条扫描线上的象素。

若存在非边界、未填充的象素,则把每一区间的最右象素作为种子点压入堆栈,返回第(2)步。

四、实验步骤1.复习有关算法,明确实验目的和要求;2.依据算法思想,绘制程序流程图(指定填充多边形);3.设计程序界面,要求操作方便;4.用C/C++语言编写源程序并调试、执行(最好能用动画显示填充过程);5.分析实验结果6.对程序设计过程中出现的问题进行分析与总结;7.打印源程序或把源程序以文件的形式提交;8.按格式要求完成实验报告。

扫描线填充算法讲解

扫描线填充算法讲解

扫描线算法(Scan-Line F illing)扫描线算法适合对矢量图形进行区域填充,只需要直到多边形区域的几何位置,不需要指定种子点,适合计算机自动进行图形处理的场合使用,比如电脑游戏和三维CAD软件的渲染等等。

对矢量多边形区域填充,算法核心还是求交。

《计算几何与图形学有关的几种常用算法》一文给出了判断点与多边形关系的算法――扫描交点的奇偶数判断算法,利用此算法可以判断一个点是否在多边形内,也就是是否需要填充,但是实际工程中使用的填充算法都是只使用求交的思想,并不直接使用这种求交算法。

究其原因,除了算法效率问题之外,还存在一个光栅图形设备和矢量之间的转换问题。

比如某个点位于非常靠近边界的临界位置,用矢量算法判断这个点应该是在多边形内,但是光栅化后,这个点在光栅图形设备上看就有可能是在多边形外边(矢量点没有大小概念,光栅图形设备的点有大小概念),因此,适用于矢量图形的填充算法必须适应光栅图形设备。

2.1扫描线算法的基本思想扫描线填充算法的基本思想是:用水平扫描线从上到下(或从下到上)扫描由多条首尾相连的线段构成的多边形,每根扫描线与多边形的某些边产生一系列交点。

将这些交点按照x坐标排序,将排序后的点两两成对,作为线段的两个端点,以所填的颜色画水平直线。

多边形被扫描完毕后,颜色填充也就完成了。

扫描线填充算法也可以归纳为以下4个步骤:(1)求交,计算扫描线与多边形的交点(2)交点排序,对第2步得到的交点按照x值从小到大进行排序;(3)颜色填充,对排序后的交点两两组成一个水平线段,以画线段的方式进行颜色填充;(4)是否完成多边形扫描?如果是就结束算法,如果不是就改变扫描线,然后转第1步继续处理;整个算法的关键是第1步,需要用尽量少的计算量求出交点,还要考虑交点是线段端点的特殊情况,最后,交点的步进计算最好是整数,便于光栅设备输出显示。

对于每一条扫描线,如果每次都按照正常的线段求交算法进行计算,则计算量大,而且效率底下,如图(6)所示:图(6)多边形与扫描线示意图观察多边形与扫描线的交点情况,可以得到以下两个特点:(1)每次只有相关的几条边可能与扫描线有交点,不必对所有的边进行求交计算;(2)相邻的扫描线与同一直线段的交点存在步进关系,这个关系与直线段所在直线的斜率有关;第一个特点是显而易见的,为了减少计算量,扫描线算法需要维护一张由“活动边”组成的表,称为“活动边表(AET)”。

python扫描线填充算法详解

python扫描线填充算法详解

python扫描线填充算法详解本⽂实例为⼤家分享了python扫描线填充算法,供⼤家参考,具体内容如下介绍1.⽤⽔平扫描线从上到下扫描由点线段构成的多段构成的多边形。

2.每根扫描线与多边形各边产⽣⼀系列交点。

将这些交点按照x坐标进⾏分类,将分类后的交点成对取出,作为两个端点,以所填的⾊彩画⽔平直线。

3.多边形被扫描完毕后,填⾊也就完成。

数据结构活性边表:新边表:代码(使⽤数组)import numpy as npfrom PIL import Imagefrom PIL import ImageDrawfrom PIL import ImageFontarray = np.ndarray((660, 660, 3), np.uint8)array[:, :, 0] = 255array[:, :, 1] = 255array[:, :, 2] = 255for i in range(0,660,1):array[i,330]=(0,0,0)for j in range(0,660,1):array[330,j]=(0,0,0)def creat_Net(point, row, y_min,y_max ):Net = [([ ] * y_max ) for i in range(y_max )]point_count = point.shape[0]for j in range(0, point_count):x = np.zeros(10)first = int(min(point[(j+1)%point_count][1] , point[j][1]))x[1] = 1/((point[(j+1)%point_count][1]-point[j][1])/(point[(j+1)%point_count][0]-point[j][0])) # x 的增量 x[2] = max(point[(j+1)%point_count][1] , point[j][1])if(point[(j+1)%point_count][1] < point[j][1]):x[0] = point[(j+1)%point_count][0]else:x[0] = point[j][0]Net[first].append(x)return Netdef draw_line(i,x ,y ):for j in range(int(x),int(y)+1):array[330-i,j+330]=(20,20,20)def polygon_fill(point):y_min = np.min(point[:,1])y_max = np.max(point[:,1])Net = creat_Net(point, y_max - y_min + 1, y_min, y_max)x_sort = [] * 3for i in range(y_min, y_max):x = Net[i]if(len(x) != 0):for k in x :x_sort.append(k)x_image = [] * 3for cell in x_sort:x_image.append(cell[0])x_image.sort()if(len(x_image) >= 3 and x_image[0]==x_image[1] and x_image[2]>x_image[1]):x_image[1] = x_image[2]draw_line(i, x_image[0], x_image[1])linshi = [] * 3for cell in x_sort:if cell[2] > i:cell[0] += cell[1]linshi.append(cell)x_sort = linshi[:]x_image = [] * 3for cell in x_sort:x_image.append(cell[0])x_image.sort()draw_line(i, x_image[0],x_image[1])def main():point = [[55,40], [100,80], [100,160],[55,180], [10,160], [10,80]]point = np.array(point)polygon_fill( point )image = Image.fromarray(array)image.save('saomao.jpg')image.show()if __name__ == "__main__":main()实例:以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

扫描线种子填充算法

扫描线种子填充算法

扫描线种子填充算法扫描线种子填充算法的基本过程如下:当给定种子点(x, y)时,首先分别向左和向右两个方向填充种子点所在扫描线上的位于给定区域的一个区段,同时记下这个区段的范围[xLeft, xRight],然后确定与这一区段相连通的上、下两条扫描线上位于给定区域内的区段,并依次保存下来。

反复这个过程,直到填充结束。

扫描线种子填充算法可由下列四个步骤实现:(1) 初始化一个空的栈用于存放种子点,将种子点(x, y)入栈;(2) 判断栈是否为空,如果栈为空则结束算法,否则取出栈顶元素作为当前扫描线的种子点(x, y),y是当前的扫描线;(3) 从种子点(x, y)出发,沿当前扫描线向左、右两个方向填充,直到边界。

分别标记区段的左、右端点坐标为xLeft和xRight;(4) 分别检查与当前扫描线相邻的y - 1和y + 1两条扫描线在区间[xLeft, xRight]中的像素,从xLeft开始向xRight方向搜索,若存在非边界且未填充的像素点,则找出这些相邻的像素点中最右边的一个,并将其作为种子点压入栈中,然后返回第(2)步;这个算法中最关键的是第(4)步,就是从当前扫描线的上一条扫描线和下一条扫描线中寻找新的种子点。

如果新扫描线上实际点的区间比当前扫描线的[xLeft, xRight]区间大,而且是连续的情况下,算法的第(3)步就处理了这种情况。

如图所示:新扫描线区间增大且连续的情况假设当前处理的扫描线是黄色点所在的第7行,则经过第3步处理后可以得到一个区间[6,10]。

然后第4步操作,从相邻的第6行和第8行两条扫描线的第6列开始向右搜索,确定红色的两个点分别是第6行和第8行的种子点,于是按照顺序将(6, 10)和(8, 10)两个种子点入栈。

接下来的循环会处理(8, 10)这个种子点,根据算法第3步说明,会从(8, 10)开始向左和向右填充,由于中间没有边界点,因此填充会直到遇到边界为止,所以尽管第8行实际区域比第7行的区间[6,10]大,但是仍然得到了正确的填充。

计算机图形学实验扫描线种子填充算法

计算机图形学实验扫描线种子填充算法

实验二4-10一、实验题目扫描线种子填充算法是通过扫描线来填充多边形内的水平像素段,处理每条扫描线时仅需将其最右端像素入栈,可以有效提高填充效率。

请使用MFC编程填充图4-60所示的空心体汉字(四连通),填充效果如图4-61所示。

二、实验思想扫描线种子填充算法:先将种子像素入栈,种子像素为栈底像素,如果栈不为空,执行如下4步操作。

(1)栈顶像素出栈。

(2)沿扫描线对出栈像素的左右像素进行填充,直至遇到边界像素为止。

即每出栈一个像素,就对区域内包含该像素的整个连续区间进行填充。

(3)同时记录该区间,将区间最左端像素记为x left,最右端像素记为x right。

(4)在区间〔x left,x right〕中检查与当前扫描线相邻的上下两条扫描线的有关像素是否全为边界像素或已填充像素,若存在非边界且未填充的像素,则把未填充区间的最右端像素取作种子像素入栈。

三、实验代码void CTestView::OnLButtonDown(UINT nFlags, CPoint point)//左键按下函数{// TODO: Add your message handler code here and/or call defaultSeed=point;//选择种子位置CharFill();//进行填充CView::OnLButtonDown(nFlags, point);}void CTestView::CharFill()//文字填充函数{CRect Rect;GetClientRect(&Rect);CClientDC dc(this);COLORREF BoundColor;//边界色int Width=Rect.right-Rect.left;int Hight=Rect.bottom-Rect.top ;int Flag;int x0,y0,x,y;CPoint Point;std::vector<CPoint> FillBuffle;//定义CPoint类型的数组序列对象FillBuffle.reserve(10);//定义数组序列的大小FillBuffle.push_back(CPoint(Seed)); //把种子结点压入数组序列BoundColor=RGB(0,0,0);//定义边界色为黑色while(!FillBuffle.empty())//如果数组序列非空{Point=FillBuffle.front();//弹出数组序列头元素x=Point.x;y=Point.y;FillBuffle.erase(FillBuffle.begin());//清除数组序列内的元素dc.SetPixel(Point,Fillcolor);//绘制像素//判断像素的位置是否在图形内部x0=x+1;//右方判断while(dc.GetPixel(x0,y)!=BoundColor&&dc.GetPixel(x0,y)!=Fillcolor) {x0=x0+1;if(x0>=Width)//到达屏幕最右端{MessageBox("种子超出范围","警告");RedrawWindow();return;}}y0=y+1;//下方判断while(dc.GetPixel(x,y0)!=BoundColor&&dc.GetPixel(x,y0)!=Fillcolor) {y0=y0+1;if(y0>=Hight)//到达屏幕最下端{MessageBox("种子超出范围","警告");RedrawWindow();return;}}RightPoint.x=x0;//右边界内的左邻点x0=x-1;while(dc.GetPixel(x0,y)!=Fillcolor&&dc.GetPixel(x0,y)!=BoundColor){dc.SetPixel(x0,y,Fillcolor);x0=x0-1;if(x0<=0)//到达屏幕最左端{MessageBox("种子超出范围","警告");RedrawWindow();return;}}y0=y-1;while(dc.GetPixel(x,y0)!=BoundColor&&dc.GetPixel(x,y0)!=Fillcolor){y0=y0-1;if(y0<=0)//到达屏幕最上端{MessageBox("种子超出范围","警告");RedrawWindow();return;}}LeftPoint.x=x0+1;//左边界内的右邻点x0=LeftPoint.x;y=y+1;//下一条扫描线while(x0<RightPoint.x){Flag=0;while((dc.GetPixel(x0,y)!=Fillcolor)&&(dc.GetPixel(x0,y)!=BoundColor)) {if(Flag==0)Flag=1;x0++ ;}if(Flag==1){if((x0==RightPoint.x)&&(dc.GetPixel(x0,y)!=Fillcolor)&&(dc.GetPixel(x0,y)!=BoundColor))FillBuffle.push_back(CPoint(x0,y));//进入数组序列else{FillBuffle.push_back(CPoint(x0-1,y));}Flag=0;}PointNext.x=x0;while(((dc.GetPixel(x0,y)==Fillcolor)&&(x0<RightPoint.x))||((dc.GetPixel(x0,y)==BoundColor) &&(x0<RightPoint.x))){x0 ++;}}x0=LeftPoint.x;y=y-2;while(x0<RightPoint.x){Flag=0;while((dc.GetPixel(x0,y)!=Fillcolor)&&(dc.GetPixel(x0,y)!=BoundColor)&&(x0<RightPoint.x)) {if(Flag==0)Flag=1;x0++ ;}if(Flag==1){if((x0==RightPoint.x)&&(dc.GetPixel(x0,y)!=Fillcolor)&&(dc.GetPixel(x0,y)!=BoundColor))FillBuffle.push_back(CPoint(x0,y));else{FillBuffle.push_back(CPoint(x0-1,y));}Flag=0;}PointNext.x=x0;while((dc.GetPixel(x0,y)==Fillcolor&&x0<RightPoint.x)||(dc.GetPixel(x0,y)==BoundColor&&x 0<RightPoint.x)){x0++;}}}FillBuffle.clear();return;}void CTestView::OnMENUFill(){// TODO: Add your command handler code hereRedrawWindow();MessageBox("请在空心字体内部单击鼠标左键!","提示");}四、实验结果截图。

扫描线区域填充算法

扫描线区域填充算法

扫描线区域填充算法
扫描线区域填充算法,又称为"扫描线填涂算法",它用于对平面中特定区域填充指定的颜色、灰度或纹理,是计算机图形学中常用的算法之一。

该算法的原理是:给定待填充的区域内的点的有限个边界,从某一顶点开始,以某一规则遍历所有的边界点,形成边界数组,接着顺次扫描边界数组,将包含在边界中的每个合理像素点标记成已填充状态,由此而达到填充区域的目的。

算法步骤如下:
(1)设置起始点A,判断是否存在右方向上有没有边界点,若有,则把下一个边界点B作为起始点;
(2)从起始点A 开始,以扫描线的形式一次扫描边界点,把有效的像素点标记为“已填充”;
(3)把已扫描的点加入边界数组,直到下一个边界点C,且C点不等于起始点A;
(4)重复步骤(2)和(3),直至再回到起始点A,完成一次区域填充;
(5)如果还有未填充的区域,则重复步骤(1)至(4),直至所有区域填充完成。

实际应用中,为了避免停滞,可以采用八方向搜索策略;此外,由于扫描线填充算法中填充空间的范围是由边界点定义的,因此,当边界未经处理的是孤立的点或直线时,将无法实现实际的填充效果。

扫描线种子填充算法的解析

扫描线种子填充算法的解析

在扫描线段的填充 , 并记 下该 线段 左 右 边界 。再 在 这 个边 界 确 定 的 X范 围 内 , 在 已填 充的 扫 描 线段 相 邻 的 上 、 下 扫 描 线 中搜 寻 新 的 种子 , 若有 新 种 子 则 对 其 所 在 扫描 线段 填 充 。 这 种 搜 寻 种 子 的 方 式 能 确 保各 个相 邻 支路 都 被 搜 索到 。 通过“ 递推” 和“ 回推” 能 实现 复
区 间 。这 种 填 充 算 法 需 要 解 决 交 点 取 舍 和边 界 象 素 取 舍 问题 , 对 于 非 直 线 围 成 的 边 界 用 这 种 填 充 算 法 处 理 起 来 十分 困难 , 而 对 直 线 围 成 的 边 界 虽 然 可 采 用 活 性 边 表 来 提 高处 理 效 率 。 但 对 各种表的维护和排序使存储空间开销太大 ; 边 缘 填 充 的 基 本 思
方 向搜 索 下 一 象 素 , 这将把太多的象素压人堆栈 , 故效率不高 , 存 储 空 间 开 销 还是 太 大 。 改 进 的种 子 填 充 法 称 扫 描线 种 子 填 充
发, 循环 读取右邻点 颜色码 , 每 读 取 一 个 右 邻 点 颜 色 码 都 与 边
界 色 码 比较 , 若 不 同就 将 该 点 刷 新 为 填充 色 。当 读 到 边界 色码 ,
v 0 . 5 N o . 1
娌斜铷 右
教 育 教 学1
扫描 线种 子填 充算法 的解析
申小颂
( 成 都 信 息 工 程 学 院 控 制 工 程 学 院 四川 成 都 摘 6 1 0 2 2 5 ) 要: 扫 描 线 种子 填 充 算 法 效 率 较 高 、 占用存 储 空 间较 少。 编程时 , 可 由初 始种 子 出发 , 分 别 向 左右 两个 方 向 循 环 读 点 实 现种 子所
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

程序代码
PointTemp.x=xleft;PointTemp.y=PointTemp.y-2; //处理下一条扫描线 while(PointTemp.x<xright) { bSpanFill=FALSE; while(pDC->GetPixel(Round(PointTemp.x),Round(PointTemp.y))!=BoundaryClr && pDC->GetPixel(Round(PointTemp.x),Round(PointTemp.y))!=SeedClr) { bSpanFill=TRUE; PointTemp.x++; } if(bSpanFill) { if(PointTemp.x==xright && pDC->GetPixel(Round(PointTemp.x), Round(PointTemp.y))!=BoundaryClr && pDC->GetPixel(Round(PointTemp.x),Round(PointTemp.y))!=SeedClr) PopPoint=PointTemp; else PopPoint.x=PointTemp.x-1;PopPoint.y=PointTemp.y; Push(PopPoint); bSpanFill=FALSE; } while((pDC->GetPixel(Round(PointTemp.x),Round(PointTemp.y))==BoundaryClr && PointTemp.x<xright) || (pDC->GetPixel(Round(PointTemp.x),Round(PointTemp.y)) ==SeedClr && PointTemp.x<xright)) PointTemp.x++; } }
1所示,保存为BMP图片。请使用扫描线种子算法填充空心汉字。
图10-1空心汉字
效果图Leabharlann 图10-2 效果图原理算法
(1)在屏幕客户区显示“书香”空心汉字位图。 (2)调用颜色对话框读取填充色,默认种子色为红色。 (3)鼠标选择种子的像素的坐标(x0,y0)位置,执行x=x0±1与 y=y0±1操作,判断x或y是否到达客户区边界。如果x或y到达客户区边 界,给出“种子不在图形之内”的警告信息,重新选择种子像素的位 置。 (4)将空心汉字内的种子像素入栈。 (5)如果栈不为空,将栈顶像素出栈,以y作为当前扫描线。 (6)填充并确定种子像素所在区间,从种子出发,沿当前扫描线向左 、右两个方向填充,直到边界,将区间最左端像素记为xleft,最右端像 素记为xright。 (7)在区间〔xleft,xright〕中检查与当前扫描线y相邻的上下两条扫描 线上的像素,若存在非边界像素或未填充像素,则把未填充区间的最 右端像素取作种子像素入栈,返回第(5)步。
计算机图形学实践教程(VisualC++版)(第2版)
案例10 扫描线种子填充算法
孔令德 太原工业学院计算机工程系 2017.1.10
知识点


扫描线种子填充算法原理。 判断种子像素位于空心汉字之内的方法。 堆栈操作函数。
案例描述
使用PhotoShop制作 “金梅浪漫空心体”汉字,如图10-
程序代码
xleft=PointTemp.x+1;处理上一条扫描线 PointTemp.x=xleft;PointTemp.y=PointTemp.y+1; while(PointTemp.x<xright) { bSpanFill=FALSE; while(pDC->GetPixel(Round(PointTemp.x),Round(PointTemp.y))!= BoundaryClr&&pDC->GetPixel(Round(PointTemp.x),Round(PointTemp.y))!=SeedClr) { bSpanFill=TRUE; PointTemp.x++; } if(bSpanFill) { if(PointTemp.x==xright&&pDC->GetPixel(Round(PointTemp.x) ,Round(PointTemp.y))!=BoundaryClr&& pDC->GetPixel(Round(PointTemp.x), Round(PointTemp.y))!=SeedClr) PopPoint=PointTemp; else PopPoint.x=PointTemp.x-1;PopPoint.y=PointTemp.y; Push(PopPoint); bSpanFill=FALSE; } while((pDC->GetPixel(Round(PointTemp.x),Round(PointTemp.y))==BoundaryClr && PointTemp.x<xright) || (pDC->GetPixel(Round(PointTemp.x),Round(PointTemp.y)) ==SeedClr && PointTemp.x<xright)) PointTemp.x++;
程序代码
CharFill()文字填充函数
while(pHead->pNext!=NULL)//如果栈不为空 { Pop(PopPoint); PointTemp=PopPoint; while(pDC->GetPixel(Round(PointTemp.x),Round(PointTemp.y))!= BoundaryClr&& pDC->GetPixel(Round(PointTemp.x),Round(PointTemp.y))!=SeedClr) { pDC->SetPixelV(Round(PointTemp.x),Round(PointTemp.y),SeedClr); PointTemp.x++; } xright=PointTemp.x-1;PointTemp.x=PopPoint.x-1; while(pDC->GetPixel(Round(PointTemp.x),Round(PointTemp.y))!= BoundaryClr&&pDC->GetPixel(Round(PointTemp.x),Round(PointTemp.y))!=SeedClr) { pDC->SetPixelV(Round(PointTemp.x),Round(PointTemp.y),SeedClr); PointTemp.x--; }
总结
扫描线种子填充算法对于每一区间只保留其最右端像素 作为种子像素入栈,极大地减小了栈空间,有效地提高了填 充速度。
相关文档
最新文档