第一章 基本图形的生成-2.ppt

  1. 1、本文档共69页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第一章 基本图形的生成-2

1.4 多边形扫描转换与区域填充 多边形的扫描转换主要是通过确定穿越区域的扫描线的覆盖区间来刻画多边形区域 区域填充是从给定的位置开始涂描直到指定的边界条件为止 从多边形顶点表示到点阵表示的转换。 顶点表示:用多边形的顶点序列来刻划多边形。 点阵表示:用位于多边形内的象素的集合来刻划多边形。 多边形域可以是凸的、凹的或带孔的。 这里的四个交点在计算时未必是按从左到右顺序获得。例如,当多边形采用顶点序列P1P2P3P4P5P6表示时,把扫描线6分别与P1P2、P2P3 、P3P4 、P4P5 、P5P6 、P6P1 六条边相交,得到交点序列为D、C、B、A,必须经过排序,按x递增的顺序排列交点顺序,才能得到从左到右排列的交点序列。 一般多边形的填充过程,对于一条扫描线,可以分为四个步骤: (1)求交:计算扫描线与多边形各边的交点; (2)排序:把所有交点按x递增顺序进行排序; (3)交点配对:第一个与第二个,第三个与第四个,…,第2i-1与第2i个交点配对,其中,i取1~n。每对交点就代表扫描线与多边形的一个相交区间。 (4)区间填色:把这些相交区间内的像素置成多边形填充色,把区间外的像素置成背景色。 有效边:指与当前扫描线相交的多边形的边,也称为活性边。 有效边表:把有效边按与扫描线交点x坐标递增的顺序存放在一个链表中,此链表称为有效边表。 有效边表的每个结点: x|ymin ymax 1/k NEXT 边表的构造 首先构造一个纵向链表,链表的长度为多边形所占有的最大扫描线数,链表的每个结点称为一个桶,对应多边形覆盖的每一条扫描线。 将每条边的信息链入与该边最小y坐标(ymin )相对应的桶处。即:若某边的较低端点为ymin,则该边就放在相应的扫描线桶中。 每条边的数据形成一个结点,内容包括:该扫描线与该边的初始交点x(即较低端点的x值),1/k,以及该边的最大y值ymax。 x|ymin ymax 1/k NEXT 同一桶中若干条边按X|ymin由小到大排序,若X|ymin 相等,则按照1/k由小到大排序。 算法步骤: 初始化:构造边表,AET表置空; 将第一个不空的ET表中的边与AET表合并; 由AET表中取出交点对进行填充。填充之后删除y=ymax的边; yi+1=yi+1,根据xi+1=xi+1/k计算并修改AET表,同时合并ET表中y=yi+1桶中的边,按次序插入到AET表中,形成新的AET表; AET表不为空则转(3),否则结束。 种子填充算法 假设多边形区域内至少有一个像素已知,由此出发找到区域内所有像素。 该算法要求区域采用边界定义,即区域边界上所有像素均具有某个特定值,而区域内部所有像素均不取这一特定值。 区域连通方式对填充结果的影响 简单的种子填充算法 (4连通边界) 种子像素入栈 当栈非空时,重复以下步骤: 栈顶像素出栈 将出栈象素置成填充色 按右、上、左、下顺序检查与出栈象素相邻的四象素,若其中某象素不在边界上且未被置成填充色,则将其入栈 填充算法演示 4-connected boundary-fill void BoundaryFill4(int x,int y,int fill,int boundary) { int current; current = getpixel(x, y); if ((current != boundary) (current != fill)) { putpixel(x, y, fill); BoundaryFill4(x+1, y, fill, boundary); BoundaryFill4(x-1, y, fill, boundary); BoundaryFill4(x, y+1, fill, boundary); BoundaryFill4(x, y-1, fill, boundary); } } 扫描线种子填充算法 利用扫描线的连贯性 减少递归次数 扫描线种子填充算法 种子像素入栈 当栈非空时,重复以下步骤: 栈顶像素出栈 沿扫描线对出栈像素的左右像素进行填充,直到遇到边界像素为止 将上述区间内最左、最右像素记为xl和xr 在区间[xl,xr]中检查与当前扫描线相邻的上下两条扫描线是否全为边界像素、或已填充的像素,若为非边界、未填充的像素,则把每一区间的最右像素取为种子像素入栈 1.5 线性与线宽处理 直线线宽的处理方法 顺着扫描线所生成的单像素线条轨迹,移动一把具有一定宽度的“刷子” (一条线段或一个正方形) 采用区域填充的办法间接地产生有宽度的线。

文档评论(0)

cgtk187 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档