- 1、本文档共5页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
图形学扫描线填充算法的定义,以及具体的实现过程,具体的操作步骤以及计算步骤。
第四讲 多边形填充算法
重点:
掌握图形学扫描线填充算法,种子填充算法,扫描线种子填充算法;
难点:
扫描线填充算法理解与实现;特别是各种数据结构的应用
教学方法:
课堂讨论式教学方法,基于问题式以及启发式教学方法相结合。双语教学。
主要内容:
扫描线填充算法
⑴ 多边形分为凸多边形、凹多边形、含内环的多边形。
① 凸: ② 凹 ③ 含内环
任意两顶点间的 任意两顶点间的
连线均在多边形 连线有不在多边
内 形内的部分
基本思想:
按扫描线顺序,计算扫描线与多边形的相交区间,再用要求的颜色显示这些区间的象素,即完成填充工作。
对于一条扫描线填充过程可以分为四个步骤:
(1)求交(2)排序
(3)配对(4)填色
② 步骤
· 求交:计算扫描线与多边形各边的交点;
· 排序:把所有交点按x值递增顺序排序;
· 配对:12,34,…,交点两两配对;
· 填色:把交点对的象素置成多边形颜色,把交点对以外的象素置成背景色。
③ 活性边表算法:处理每一条扫描线时,仅计算和它相交的多边形的边
· 活性边:当前扫描线与多边形相交的边;
· 活性边表:存放扫描线与活性边交点(按X递增顺序)的一张链表;
8
7
6 P4P5 P5P6
5 5 2 8 5 -1.5 7
4 P3P4
3 11 0 8
2 2 0 7 P6P1
1 5 -3 2 5 3 3
0 P1P2 P2P3
节点:第1项存当前扫描线与边的交点坐标x值;
第2项存从当前扫描线到下一条扫描线间x的增量(x;
第3项存边所交的扫描线的ymax
④ 算法
· 增量法:令当前扫描线与多边形某一条边的交点的x坐标为x,则下一条扫描线与该边的交点不要重计算,只要加一个增量。
该边的直线方程为:ax+by+c=0;
若y=yi,x=x i;则当y = y i+1时,
其中 为常数,
· 算法过程
polyfill (polygon, color)
int color;
多边形定义 polygondef ;
{ for (各条扫描线i )
{ 初始化新边表头指针NET [i];
把y min = i 的边放进边表NET [i]; }
y = 最低扫描线号;
初始化活性边表AET为空;
for (各条扫描线i )
{ 把新边表NET [i] 中的边结点用插入排序法插入AET表,使之按x坐标递增顺序排列;
遍历AET表,把配对交点区间(左闭右开)上的象素(x, y),用drawpixel (x, y, color) 改写象素颜色值;
遍历AET表,把y max= i 的结点从AET表中删除,并把y max i 结点的x值递增(x;
若允许多边形的边自相交,则用冒泡排序法对AET表重新排序;
}
} /* polyfill */
⑤ 问题及其求解
问题1:扫描线与多边形顶点相交,交点的取舍。
· 扫描线与多边形相交的边分处扫描线的两侧,则计一个交点,如P1,P3。
· 扫描线与多边形相交的边分处扫描线同侧,
且 yiyi-1,yiyi+1,则计2个交点(填色),如P2,P5。
若 yiyi-1,yiyi+1,则计0个交点(不填色),如P6,P4。
· 扫描线与多边形边界重合 (当要区分边界和边界内区域时需特殊处理)。
问题2 :多边形边界搜索 (不同于区域内的颜色),最小内环搜索。
#define FALSEO
edge-mark-fill(polydef, color)
多边形定义 polydef; int color;
{ 对多边形polydef 每条边进行直线扫描转换;
inside = FALSE;
for (每条与多边形polydef相交的扫描线y )
for (扫描线上每个象素x )
{ if (象素 x 被打上边标志)
inside = ! (inside);
if (inside!= FALSE)
drawpixel (x, y, color);
else
文档评论(0)