页数:28页文件大小:676.4 KB来源: 计算机图形学ppt课件
本课件讲解区域填充的三类算法:逐点判断填充原理简单但效率低;种子填充从区域内已知象素出发利用连通性扩散,分深度递归与扫描线两种实现;扫描线多边形填充借助新边表NET与活性边表AET减少求交计算。
计算机图形学讲义 第2章 基本图形的生成与计算—区域填充算法
主要内容
1. 逐点判断填充算法:区域填充的基本(初级)方法
设有如下函数:Inside(D, x, y) = True when x∈D;False when x∉D
取矩形 R(x1≤x≤x2,y1≤y≤y2),使 R 包围 D,则逐点判断填充算法如下:
for (y = y1; y <= y2; y++) for (x = x1; x <= x2; x++) if (inside(D, x, y)) drawpixel(x, y, color);上述算法原理简单、实用,但效率低;原因是没有考虑各象素之间的联系,孤立地考察象素与区域的关系,几十万甚至几百万个象素都要一一判别,每次判别又要多次求交点,需要做大量的乘除运算。
如何判断点在多边形的内或外?即包含性检查。具体计算方法如何?图形求交中再仔细讲解。
2. 种子填充算法
种子填充算法假设在多边形内有一象素已知,由此出发利用连通性找到区域内的所有象素,并进行填充。
种子填色又称边界填色(Boundary Filling)。它的功能是,给出多边形光栅化后的边界位置及边界色代码 boundary_color,以及多边形内的一点 (x, y) 位置,要求将颜色 fill_color 填满多边形。
3、内点 (x, y) 的检测条件
这两个条件任何一个都可以用来检测象素点 (x, y) 是不是尚未填充。推荐使用条件 (1) 进行象素点检测。
注意:
(a) 八连通区域四连通边界 (b) 四连通区域八连通(或四连通)边界
void seed_filling (x, y, fcolor, bcolor) int x, y, fcolor, bcolor; { int c; c = getpixel (x, y); if (c != fcolor && c != bcolor) { putpixel (x, y, fcolor); seed_filling (x+1, y, fcolor, bcolor); seed_filling (x-1, y, fcolor, bcolor); seed_filling (x, y+1, fcolor, bcolor); seed_filling (x, y-1, fcolor, bcolor); } }2.2 扫描线种子填充算法
算法的基本过程:当给定种子点 (x, y) 时,首先填充种子点所在扫描线上位于给定区域的一个区段,然后确定与这一区段相连通的上、下两条扫描线上位于给定区域内的区段,确定新种子点,并依次保存下来。反复这个过程,直到填充结束。
对于每一个待填充区段,只需压栈一次;而在递归算法中,每个象素都需要压栈。因此扫描线填充算法提高了区域填充的效率。
动画演示
3. 扫描线多边形填充算法:按扫描线顺序,计算扫描线与多边形的相交区间,再用要求的颜色显示这些区间的象素。区间的端点可以通过计算扫描线与多边形边界线的交点获得。对于一条扫描线,填充过程分为四个步骤:
P1 P2 P3 P4 P5:[P1,p2) [P4,P5) [P2,p3) [P5,p1)
把与当前扫描线相交的边称为活性边,并把它们按与扫描线交点 x 坐标递增的顺序存放在一个链表中,称此链表为活性边表(AET)。活性边表的每个节点的内容:
X ΔX Ymax
假定当前扫描线与多边形某一条边的交点的 x 坐标为 x,则下一条扫描线与该边的交点不必重算,只要加一个增量 △x(连贯性)。设该边的直线方程为:ax + by + c = 0;若 y=yi,x = xi;则当 y = yi+1 时,xi+1 = xi - b/a,其中 ΔX = -b/a 为常数。
使用增量法计算时,需要知道一条边何时不再与下一条扫描线相交,以便及时把它从活性边表中删除。
扫描线6的活性边表 AET
扫描线7的活性边表 AET
为了方便活性边表的建立与更新,我们为每一条扫描线建立一个新边表(NET),存放在该扫描线第一次出现的边。也就是说,若某边的较低端点为 ymin,则该边就放在扫描线 ymin 的新边表中。
扫描线多边形填充算法的主要步骤
void polyfill (多边形 polygon, 颜色 color) { for (各条扫描线 i) { 初始化新边表头指针 NET[i]; 把 ymin = i 的边放进边表 NET[i]; } y = 最低扫描线号; 初始化活性边表 AET 为空; for (各条扫描线 i) { 把新边表 NET[i] 中的边结点用插入排序法插入 AET 表,使之按 x 坐标递增顺序排列; 遍历 AET 表,把 ymax = i 的结点从 AET 表中删除,并把 ymax > i 结点的 x 值递增 Dx; 若允许多边形的边自相交,则用冒泡排序法对 AET 表重新排序; 遍历 AET 表,把配对交点区间(左闭右开)上的象素 (x, y),用 drawpixel (x, y, color) 改写象素颜色值; } }动画演示
作业
下载地址:{{downurl}}
{{{a}}}
{{#b}}{{{b}}}
{{/b}} {{/title}} {{#nolog}}登陆注册
{{/nolog}} {{#djsx}}点我刷新
{{/djsx}} {{#gocz}} {{/gocz}} {{#ffqr}} {{/ffqr}}