- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
基本光栅图形生成技术
为了方便活性边表的建立与更新,可为每一条扫描线建立一个新边表(NET),存放在该扫描线第一次出现的边。也就是说,若某边的较低端点为ymin,则该边就放在扫描线ymin的新边表中,下图是新边表的示意图。 ? void polyfill (polygon, color) { for (各条扫描线,标识为i) { 初始化新边表头指针NET [i]; 把ymin = 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表重新排序; } } 多边形填充的算法流程 扫描线与多边形顶点相交时,必须正确的进行交点个数的计算,否则,在进行填充时会出现错误。用来计算扫描线与多边形顶点的相交点数目的三条规律。 扫描线与多边形相交的边分处扫描线的两侧,则计一个交点,如点P5,P6。 扫描线与多边形相交的边分处扫描线同侧,且yiyi-1,yiyi+1,则计2个交点(填色),如P2。若yiyi-1,yiyi+1,则计0个交点(不填色),如P1。 扫描线与多边形边界重合 (当要区分边界和边界内区域时需特殊处理),则计1个交点。 边界标志算法 基本思想是:在帧缓冲器中对多边形的每条边进行直线扫描转换,亦即对多边形边界所经过的像素打上标志。然后再采用和扫描线算法类似的方法将位于多边形内的各个区段着上所需颜色。对每条与多边形相交的扫描线依从左到右的顺序,逐个访问该扫描线上的像素。使用一个布尔量inside来指示当前点是否在多边形内的状态。Inside的初值为假,每当当前访问的像素为被打上边标志的点,就把inside取反。对未打标志的像素,inside不变。若访问当前像素时,inside为真,说明该像素在多边形内,则把该像素置为填充颜色。 用软件实现时,扫描线算法与边界标志算法的执行速度几乎相同,但由于边界标志算法不必建立维护边表以及对它进行排序,所以边界标志算法更适合硬件实现,这时它的执行速度比有序边表算法快一至两个数量级。 3.3.2 种子填充算法 区域:用点阵形式表示的填充图形,是像素的集合。区域可采用内点表示和边界表示两种表示形式。 内点表示法,指区域内的所有像素着同一颜色; 边界表示法,则是指区域的边界点着同一颜色。 区域填充算法要求区域是连通的,因为只有在连通区域中,才可能将种子点的颜色扩展到区域内的其它点。区域可分为4向连通区域和8向连通区域。4向连通区域指的是从区域上一点出发,可通过四个方向,即上、下、左、右移动的组合,在不越出区域的前提下,到达区域内的任意像素;8向连通区域指的是从区域内每一像素出发,可通过八个方向,即上、下、左、右、左上、右上、左下、右下这八个方向的移动的组合来到达。 四个方向运动 八个方向运动 四连通区域 八连通区域 void FloodFill4(int x,int y,int oldcolor,int newcolor) { if(GetPixel(x,y)==oldcolor) { SetPixel(x,y,newcolor); FloodFill4(x,y+1,oldcolor,newcolor); FloodFill4(x,y-1,oldcolor,newcolor); FloodFill4(x-1,y,oldcolor,newcolor); FloodFill4(x+1,y,oldcolor,newcolor); } } 设(x,y)为内点表示的4连通区域内的一点,oldcolor为区域的原色,要将整个区域填充为新的颜色newcolor。内点表示的4连通区域的递归填充算
原创力文档


文档评论(0)