案例9 区域八邻接点种子填充算法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Push(Left);//左方像素入栈 LeftTop.x=PopPoint.x-1; LeftTop.y=PopPoint.y+1;//搜索出栈结点的左上方像素 PixelClr=pDC->GetPixel(Round(LeftTop.x),Round(LeftTop.y));
程序代码
if(BoundaryClr!=PixelClr && SeedClr!=PixelClr)
Push(LeftBottom);//左下方像素入栈 } delete pHead; pHead = NULL; }
总结
八邻接点种子填充算法的种子像素可以位于区域的上方 多边形内或下方多边形内,填充过程不同,但都可以获得一 致的填充效果。
谢谢观看! 2020
计算机图形学实践教程(VisualC++版)(第2版)
案例9 区域八邻接点种子填充算法
孔令德 太原工业学院计算机工程系
2017.1.10
知识点
八邻接点种子填充算法。 判断种子像素位于多边形之内的方法。 种子像素八邻接点的访问方法。 堆栈操作函数。
案例描述
图9-1(a)所示多边形由两个正方形连接而成,在连接点 处留有一个像素的缝隙,如图9-1(b)所示。图9-1所示的多 边形为八连通域。请使用八邻接点种子算法填充多边形。
程序代码
填充函数 while(pHead->pNext!=NULL)//如果栈不为空 {
CP2 PopPoint; Pop(PopPoint); pDC->SetPixelV(Round(PopPoint.x),Round(PopPoint.y),SeedClr); Left.x=PopPoint.x-1;//搜索出栈结点的左方像素 Left.y=PopPoint.y; PixelClr=pDC->GetPixel(Round(Left.x),Round(Left.y)); if(BoundaryClr!=PixelClr && SeedClr!=PixelClr)//不是边界色并且未置成填充色
Push(Top);
//上方像素入栈
RightTop.x=PopPoint.x+1;
RightTop.y=PopPoint.y+1;//搜索出栈结点的右上方像素
PixelClr=pDC->GetPixel(Round(RightTop.x),Round(RightTop.y));
if(BoundaryClr!=PixelClr && SeedClr!=PixelClr)
Push(RightTop); //右上方像素入栈
程序代码
Right.x=PopPoint.x+1;//搜索出栈结点的右方像素 Right.y=PopPoint.y; PixelClr=pDC->GetPixel(Round(Right.x),Round(Right.y)); if(BoundaryClr!=PixelClr && SeedClr!=PixelClr)
Push(LeftTop); //左上方像素入栈
Top.x=PopPoint.x;
Top.y=PopPoint.y+1;Biblioteka Baidu/搜索出栈结点的上方像素
PixelClr=pDC->GetPixel(Round(Top.x),Round(Top.y));
if(BoundaryClr!=PixelClr && SeedClr!=PixelClr)
(a)多边形
(b)连接点放大效果图 图9-1八连通域
效果图
图9-2 效果图
原理算法
(1)调用颜色对话框读取填充色。 (2)绘制多边形区域。 (3)设置默认边界色为黑色,默认种子色为蓝色。 (4)鼠标选择种子的像素的坐标(x0,y0)位置,执行x=x0±1与 y=y0±1操作,判断x或y是否到达客户区边界。如果x或y到达客户区边 界,给出“种子不在图形之内”的警告信息,重新选择种子像素的位 置。 (5)将多边形区域内的种子像素入栈。 (6)如果栈不为空,将栈顶像素出栈,用种子色绘制出栈像素。 (7)按左、左上、上、右上、右、右下、下、左下顺序搜索出栈像素 的八个邻接点像素。如果相邻像素的颜色不是边界色并且不是种子色 ,将其入栈,否则丢弃。 (8)重复步骤(6),直到栈为空。
Push(Right);//右方像素入栈 RightBottom.x=PopPoint.x+1;//搜索出栈结点的右下方像素 RightBottom.y=PopPoint.y-1; PixelClr=pDC->GetPixel(Round(RightBottom.x),Round(RightBottom.y)); if(BoundaryClr!=PixelClr && SeedClr!=PixelClr)
Push(RightBottom);//右下方像素入栈 Bottom.x=PopPoint.x; Bottom.y=PopPoint.y-1;//搜索出栈结点的下方像素 PixelClr=pDC->GetPixel(Round(Bottom.x),Round(Bottom.y)); if(BoundaryClr!=PixelClr && SeedClr!=PixelClr)
Push(Bottom);//下方像素入栈
程序代码
LeftBottom.x=PopPoint.x-1; LeftBottom.y=PopPoint.y-1;//搜索出栈结点的左下方像素 PixelClr=pDC->GetPixel(Round(LeftBottom.x),Round(LeftBottom.y)); if(BoundaryClr!=PixelClr && SeedClr!=PixelClr)
相关文档
最新文档