扫描线多边形填充算法
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2019/5/27
6
yi m xi b
(1)
yi 1 yi 1 m xi 1 b
(2)
xi 1 ( yi 1 b) / m ( yi 1 b) / m
(m xi b 1 b) / m xi 1 / m
则第yi+1条扫描线与AB的交点为yi+1=yi+1, xi+1=xi+1/m 即由前一条
1.区域内部点判断准则
区域填充首先判断一个像素点是否处于多边形区域内,其判 断准则如下:
从该点向无穷远处引出一条射线(也称扫描线),若射线与 区域边界交点目标数目为奇数,则此点在区域内。若射线与区 域边界交点目标数目为偶数,则此点为区域外点。 例如:
A
B
A点向右引射线 与区域边界共3 个交点,为内点
线两个端点作为交点,即扫描线与该水平边界线相交了两次。如
y 2019/5D/2E7
3
2.边相关性及边记录
很显然,不能利用区域内部点判别准则对显示平面 上每个点逐个判别,这样计算量太大。
事实上,相对于一个给定多边形区域来说,显示平 面上每个像素点内外特性是互相关联的。相邻像素间具 有相关属性。在实施多边形填充时,利用扫描线相关性, 就无需对扫描线上所有像素点逐个地进行内外特性判断, 只需对一条扫描线从左到右求出该扫描线与区域边界交 点,这些交点必将扫描线分成内外交替线段,这些交点x 值大小依次排列。
任何新边都加到AET表中,而与之不相交的边又被从AET表中删除
掉了。下图列出了多边形图在扫描线为4、5、6时的AET表。AET表
10
⑵活动边表AET(Activities Edge Table)
活动边表AET是一个只与当前扫描线相交的边记录链表。随着
扫 描 线 从 一 条 到 另 一 条 的 转 换 , AET 表 也 应 随 之 变 动 , 利 用
yi+1=yi+1,
xi+1=xi+1/m
可以算出AET表中x域中的新值xi。凡是与这一条扫描线相交的
P2P1 7 8 -1 ^
P4P5 62 0^
P3P4 3 6 -2
P3P2 5 6 0.5 ^
y?m4a.x41x?i ?1?/m? ? ?
2019/5/27
9
注意:在ET表中:①与x轴平行的边不计入。②多边形的顶点 分为两大类:一类是局部极值点,如下图中的P1、P3;另一类 是非极值点,如下图中的P2、P4、P5。当扫描线与第一类顶点 相遇时,应看作两个点;当扫描线与第二类顶点相遇时,应 视为一个点。
7
(2)边记录
利用边的这种相关性,不必算出边线与各条扫描线的全 部交点,只需以边线为单位,对每条边建立一个边记录, 其内容包括:该边y的最大值ymax ,该边底端的x坐标xi, 从一条扫描线到下一条扫描线间的x增量1/m,以及指示 下一个边记录地址的指针
B(3,7)
C(8,8)
2019/5/27
A(8,2)
②若两相邻边与扫描线相交于同一点,且两边位于扫描线异侧
,则视为一个交点。
如ya
2019/5/27
2
(2)当扫描线重合多边形某条边界水平线时,如该水平 边线前后两条边线是一上一下的,则该水平边线两个端点 作为一个交点,即扫描线与该水平边界线相交了一次。
如下图yCB
Y
A
yCB
B C
yDE
D
E
X 如该水平边线前后两条边线是同为上或同为下的,则将该水平边
AB 7 8 -1
ymax xi 1/m
AC 8 80
ymax xi 1/m
8
3.边表ET和活动边表AET
(1)边表ET (Edge Table)
边表是一个包含多边形全部边记录的表,它按y坐标(与扫描线
一一对应)递增(或递减)的顺序存放区域边界的所有边。每
个y坐标值存放一个或者说几个边记录。当某条扫描线yi碰到多 边形边界的新边时(以边线底端为准),则在ET表中相应的y坐
扫斜率描。线交点第Xi,yYi+i1求条下扫一描条线扫描线交点Xi+1,Yi+1,式中,m是这条边的
与AB的交点为(
C(8,8)
xi+1, yi+1 ) B(3,7)
边线AC
边线AB
(xi+1, yi+1)
yi+1
(xi,yi)
yi
第yi条扫描线
与某边线AB的
1/m
交点是(xi,yi)
A(8,2)
2019/5/27
出了该边线所在区间),而且扫描线yi+1与该边线的交点,很容易从
前一条扫描线yi与该边的交点递推求得。
设某条直线边的方程为
y=mx+b
该边两个端点坐标为(x1,y1)、(x2,y2) 且x1≠x2 则该边斜率为m=(y2-y1)/(x2-x1)
令扫描线yi与该边交点为(xi,yi) 扫描线yi+1与该边交点(xi+1,yi+1)
2019/5/27
B点向右引射线 与区域边界共2 个交点,为外点
1
此时应注意两点: (1)当扫描线与多边形相交如下情况时:
Y
A
I
yyba
B1
3
D
C
EF
X
①若两相邻边与扫描线相交于同一点,且两边位于扫描线同侧
,则视为两个交点。
如yb:1点向右交点为3个(奇数)是内点 3点向右交点为4个(偶数)是外点
2019/5/27
4
Y A
BC D
X
如上图,按x从小到大排列为A B C D 交点AB间线段上像素点必在区域内。 所以关键是求交点。
2019/5/27
5
(1)交点计算
多边形填充首先需要求出扫描线与边界的交点,利用边的相关
性可以简单有效地解决这个问题。当一条扫描线yi 与多边形的某一
边线有交点时,其相邻扫描线yi+1一般也与该边线相交(除非yi+1超
标值处写入一个边记录。当同时有多条边进入时,则在ET表中
按链表结构写入相应数目的多个记录,这些记录是按边线较低
端点的x值增加的顺序排列。当没有新边加入时,表中对应的y
坐标值处存储内容为空白。
P5P1
7^
72 4^
7 6
P5
5
P1 P2
Baidu Nhomakorabea
4
3 2 P4
1
P3
O 12345678
图4.40 多边形
6 5 4^ 3 2^ 1
7 6
P5
5
P1 P2
4
3 2
P4
1
P3
O 12345678
图4.40 多边形
2019/5/27
7^ 6 5 4^ 3 2^ 1
P5P1 72 4^
P2P1 7 8 -1 ^
P4P5 62 0^
P3P4 3 6 -2
P3P2 5 6 0.5 ^
多边? 形4.4边1 表? ?多?边? 形? ?边yma表x x边i 1表/m