chp2-光栅图形学2
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2.5.2 有序边表算法
边的连贯性 第一类交点:新出现的边与扫描线的交点 第二类交点:位于同一条边上的后继交点
2.5.2 有序边表算法
交点的取整规则 要求:使生成的像素全部位于多边形之内 用于线画图元生成的四舍五入原则导致部分像素位 于多边形之外,从而不可用 假定非水平边与扫描线y=e相交,交点的横坐标为x.
2.5.3 曲线边界区域扫描线填充
扇形区域的描述:
原理:同多边形 问题:如何确定扫描线与直线段和圆弧段的相交顺序 方法:分类
2.5.3 曲线边界区域扫描线填充
假设 p 1 点落在第一象限 ,扇形区域的图元生成 分 四种情况 p 2 在第一象限
2.5.3 曲线边界区域扫描线填充
AEL
2.5.2 有序边表算法
边的分类表(ET) 按照边的下端点y坐标对非水平边进行分类的指针 数组,下端点y坐标值等于i的边属于第i类。
typedef struct {int ymax; float x,deltax; Edge *nextEdge; }Edge; 边的分类表的作用是避免盲目求交。 当处理一条扫描线时,为了求出它与多 边形边的所有交点,必须将它与所有的 边进行求交测试。而实际上只有某几条 边与该扫描线有交点。边的分类表正是 用来排除不必要的求求交测试的。
26
2.6 字符属性
表示字符形状的方法: 位 图:点阵表示 轮廓线:用直线或曲线来描述字符的轮廓。 需要采用扫描转换算法对轮廓线 内部进行填充。 如True Type 、PostScript。 两种方法的比较 位图表示: 显示速度快 占用大量的存储空间 效果不能令人满意 轮 廓 线:节省空间 扫描转换需要更长的处理时间
2.6 字符属性
字符体
顶 帽
H
字符高度 基 底
f
核
j
英文字符体
2.6 字符属性
顶 帽 顶 帽
S T R IN G
左 中 右
半 基 底
S T R
左 中 右 半
字符对齐
LE FT A L IG N M E N T C EN TER A L IG N M E N T R IG H T A L IG N M E N T TA OL P I G N M E N T A L I B G O N T M T E O N M T
2.5.4 不规则边界区域填充方法
1 1
2 3
2 1
3 1
(a )
(b )
1 1 4 4 6 5 6 5 4 1
(c )
区域填充的扫描线算法的执行过程
2.5.4 不规则边界区域填充方法
第二章 光栅图形学
2.1 2.2 2.3 2.4 2.5 2.6 2.7 直线段的扫描转换算法 圆、椭圆和圆弧的生成 多边形填充区 OpenGL学习 多边形扫描算法 字符属性 反走样
2.7 反走样
提高分辨率的反走样方法 –过采样
方法简单,但代价非常大! 显示器的水平、竖直分辩率各提高一倍,则显示器 的点距减少一倍,帧缓存容量则增加到原来的4倍,而 扫描转换同样大小的图元却要花4倍时间。
2.5.4 不规则边界区域填充方法
(a) 四 连 通 内 部 定 义 区 域
(b ) 八 连 通 内 部 定 义 区 域
内部定义区域示意图
( a) 四 连 通 边 界 定 义 区 域
(b ) 八 连 通 边 界 定 义 区 域
边界定义区域示意图
2.5.4 不规则边界区域填充方法
区域内部的所有像素都具有颜色old_color,从区域 内部某一像素(x,y)开始对区域进行填充(该像素称为 种子点),将区域内部的所有像素都设置为填充颜色 fill_color。 基本方法是:测试像素(x,y)是否在区域内尚未被 填充的部分,即测试像素(x,y)的颜色,若该像素的颜 色等于old_color且不等于fill_color,则设置该像素的 颜色为fill_color,并对与该像素相邻的像素作同样处理 (递归调用);否则说明该像素在区域外或已被填充过, 不再进行处理。
2.5.2 有序边表算法
算法所涉及的数据结构: 活性边:与当前扫描线相交的边。按交点x的增量顺序存 放在一个链表中;该链表称作活性边表(AEL)。
的结点信息(p75): typedef struct {int ymax; Ymax: 所交边的最高扫描线号 float x,deltax; X:当前扫描线与边的交点的 Edge *nextEdge; x坐标 }Edge; △X:边的斜率的倒数 Nextage: 下一条边的指针
2.5.4 不规则边界区域填充方法
适用于四连通内部定义区域的边界填充算法为:
void flood_fill_4(int x, y, old_color, fill_color) { int current; current = read_pixel(x, y); if ( current==old_color && current!=fill_color ) { write_pixel(x, y, fill_color); flood_fill_4(x, y+1, old_color, fill_color); /* flood_fill_4(x, y-1, old_color, fill_color); /* flood_fill_4(x-1, y, old_color, fill_color); /* flood_fill_4(x+1, y, old_color, fill_color); /* } }
p 2 落在第二象限,此时又分为两种情况 当 y1 y 2 时
当 y1 y 2
时
2.5.3 曲线边界区域扫描线填充
p 2落在第三象限
p 2落在第四象限
2.5.3 曲线边界区域扫描线填充
遗留问题:当 p 1落在其它区域时? 还有什么方法?
2.5.4 不规则边界区域填充方法
上 下 左 右
*/ */ */ */
2.5.4 不规则边界区域填充方法
适用于四连通边界定义区域的边界填充算法为:
void boundary_fill_4(int x, y, boundary_color, fill_color) { int current; current = read_pixel(x, y); if ( current!=boundary_color && current!=fill_color ) { write_pixel(x, y, fill_color); boundary_fill_4(x, y+1, boundary_color, fill_color); /* boundary_fill_4(x, y-1, boundary_color, fill_color); /* boundary_fill_4(x-1, y, boundary_color, fill_color); /* boundary_fill_4(x+1, y, boundary_color, fill_color); /* } }
2.5.4 不规则边界区域填充方法
种子点(x,y)入栈。 栈顶元素(x,y)出栈作为种子点。 从种子点(x,y)开始沿着扫描线向左右两个方向逐个 像素进行填充,直到到达边界像素为止。 将上述填充区段的左右端点的横坐标分别记为xleft和 xright。 在与当前扫描线相邻的上下两条扫描线的[xleft,xright] 范围内进行检查,看看是否全部为边界像素或已填充像素, 若存在着非边界且未填充的像素,那么将该区段的最右端 像素作为种子点入栈。
2.5.2 有序边表算法
规则1 X为小数,即交点落于扫描线上两个相邻像素之间 (a)交点位于左边之上,向右取整 (b)交点位于右边之上,向左取整
2.5.2 有序边表算法
规则2 边界上象素的取舍问题,避免填充扩大化。 解决方法: 边界象素:规定落在右边界的象素不予填充。具体实现 时,只要对扫描线与多边形的相交区间左闭右开。
2.7 反走样
不光滑(阶梯状)的图形边界
走样现象
2.7 反走样
图形细节失真
走样现象
2.7 反走样
狭小图形的遗失与 动态图形的闪烁
走样现象
2.7 反走样
什么是反走样 在图形显示过程中,用于减少或消除走样现象 的方法。 提高分辨率方法 非加权区域采样 加权区域采样
2.5.1 扫描线算法
扫描线算法 目标:利用相邻像素之间的连贯性,提高算法效率 处理对象:非自交多边形 (边与边之间除了顶点 外无其它交点)
2.5.2 有序边表算法
基本原理 一条扫描线与多边形的边有偶数个交点
步骤(对于每一条扫描线): 求交点 交点排序 交点配对,填充区段
基 底
第二章 光栅图形学
2.1 2.2 2.3 2.4 2.5 2.6 2.7 直线段的扫描转换算法 圆、椭圆和圆弧的生成 多边形填充区 OpenGL学习 多边形扫描算法 字符属性 反走样
30
2.7 反走样
走样: 用离散量(像素)表示连续的量(图形)而引起 的失真,叫混淆或叫走样(aliasing)。 光栅图形的走样现象: 阶梯状边界; 图形细节失真; 狭小图形遗失:动画序列中时隐时现,产生闪烁。
上 下 左 右
*/ */ *ห้องสมุดไป่ตู้ */
2.5.4 不规则边界区域填充方法
bo u n da r y _c o l or 未被填充
种子点 ( a) 填充前
fi l l _c o l or (b ) 填充后
当区域内部某些像素的颜色为fill_color时,上述边界 填充算法可能无法正确工作。 解决方法:首先建立一个与帧缓冲区对应的临时缓冲区, 帧缓冲区中颜色为boundary_color的像素在临时缓冲区 中用0来表示,颜色不为boundary_color的像素在临时缓 冲区中用1来表示,再用上述算法在临时缓冲区中用2进 行填充,最后在帧缓冲区中将对应于临时缓冲区中为2的 像素填充为fill_color。
第二章 光栅图形学
2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 直线段的扫描转换算法 圆、椭圆和圆弧的生成 多边形填充区 OpenGL学习 多边形扫描算法 字符属性 反走样 裁剪 消隐
2.5.1 扫描线算法
边的连贯性:某条边与当前扫描线相交,也可能 与下一条扫描线相交; 扫描线的连贯性:当前扫描线与各边的交点顺序 与下一条扫描线与各边的交点顺序 可能相同或类似; 区间连贯性:同一区间上的像素取同一颜色属性
2.5.2 有序边表算法
建立ET; 将扫描线纵坐标y的初值置为ET中非空元素的最小序号,如在上图中, y=1; 置AEL为空; 执行下列步骤直至ET和AEL都为空. 如ET中的第y类非空,则将其中的所有边取出并插入AEL中; 如果有新边插入AEL,则对AEL中各边排序; 对AEL中的边两两配对,(1和2为一对,3和4为一对,…),将每 对边中x坐标按规则取整,获得有效的填充区段,再填充. 将当前扫描线纵坐标y值递值1; 将AEL中满足y=ymax边删去(!每条边被看作下闭上开的); 对AEL中剩下的每一条边的x递增deltax,即x = x+deltax.
内部定义区域,是指区域内部的所有像素都具有相同的颜色 (old_color),而区域边界上的像素具有不是old_color的任 意其它颜色。 填充内部定义区域,将该区域中的所有像素都设置为填充颜 色 ( fill_color ) 的 算 法 , 称 为 洪 水 填 充 算 法 ( flood-fill algorithm)。 边界定义区域,是指区域边界上的所有像素都具有相同的颜 色 ( boundary_color ) , 而 区 域 内 部 的 像 素 具 有 不 是 boundary_color的任意其它颜色。 填充边界定义区域,将该区域中的所有像素都设置为填充颜 色的算法,称为边界填充算法(boundary-fill algorithm)。