网站大量收购独家精品文档,联系QQ:2885784924

图形学扫描线填充算法的定义,以及具体的实现过程,具体的操作步骤以及计算步骤。.doc

图形学扫描线填充算法的定义,以及具体的实现过程,具体的操作步骤以及计算步骤。.doc

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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)

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

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

1亿VIP精品文档

相关文档