第四章 多边形填充
第4章 多边形的扫描转换与区域填充
4.2.2 扫描线填充算法
三、存在问题
交点的个数必须是偶数才能保证填充的正确性。 存在问题: 当扫描线与多边形的顶点相交时,会出现异常情况。 问题1:如何取舍交点,保证交点正确配对?
扫描线2 与P1相交,P1,P1,E 扫描线7 与P6相交,P6,F,G
4.2.2 扫描线填充算法
4.1 矩形填充
为了减少函数调用的次数,每条扫描线上的[xmin,xmax]区间可 以用画线函数填充,其程序如下:
4.1 矩形填充
存在问题: 如果两个矩形共享一条边:
(1)如果象素的中心落在某个矩形区域内,则它属于该区域。 (2)如果将中心落在其共享边界的像素看成是同时属于两个矩形 图元区域,那么,落在共享边界上的像素就会被重画两次。 (3)如果将中心落在其共享边界的像素看成是不属于任何区域, 那么,中心落在共享边界上的像素就会被丢失。
处理措施:
如果像素的中心落在矩形边界的左方或下方时,该像素属于矩形, 否则不属于该多边形区域,也就是说,如果象素的中心落在矩形 边界的右方或上方时,该象素不属于矩形区域。
4.2 多边形扫描转换
4.2.1 逐点判断算法
基本思想:
逐个判断绘图窗口内的像素,确定它们是否在多边形区
域内部,从而求出位于多边形区域内的像素的集合。实现 扫描转换多边形最简单方法就是逐点判断。
实际上该数据表示了一条扫描线与某条边的交点,将这些交点链接 起来,就可以直接得到要求的所有交点。在填充过程中,为每一条 扫描线建立相应的活性边表,它表示了该扫描线要求交点的那些边, 在实用中每一条边的活性边表的信息与上一条边的活性边表的信息 有继承性,再结合ET表使得建立十分方便。
4.2.2 扫描线填充算法
计算机图形学-- 多边形填充算法
r
x ei r x di r
xe 4 xd 4
7 y=e y=d
x e1 xd1
3
xe 7 xd 7
m ir
xe8 xd 8
xe 2 xd 2
xe3
6 5
2
xd 3
以上性质称为 边的连续性
0 8
4
奇点的处理
Computer Graphics
奇点定义
当扫描线与多边形P的边界的交点是P的顶点时, p1 要把奇点作为几个交点来处理呢?? 则称该交点为奇点
2 2 -3
3
(5,1)
8 3
(2,2)
(8,2)
y
例习题1:
Computer Graphics
P4 8 7 6 5 4 3 2 P1 1 0 1 2 3 4 P2 5 6 7 8 9 10 11 P3 P6 P5
x
Computer 习题 设现在要用扫描线算法来扫描转换一个多边形,该多 Graphics P1 边形的顶点分别为, (1,1), P2 (8,1), P3 (8, 6 ), P4 (5, 3), P5 (1, 7 ) 如图 所示。 先写出边y桶,然后试给出边的活化链表AEL,完成扫描转换
缺点:
数据结构复杂 只适合软件实现
y
例习题1: 用扫描线算法来扫描转换一个多边形
P4
Computer Graphics
8 7 6 5 4 3 2
P6 P5
P3 P1
1 0 1 2 3 4
P2 5 6 7 8 9 10 11
x
y
边的Y筒ET
8 P6 7 6 P5 5 4 3 P3 2 P1 1 P2 0 1 2 3 4 5 6 7 8 9 10 11 P4
图形学实验报告四 多边形填充算法
扫描线种子填充:
public void FillField(int x, int y, Color newColor, uint oldColor, Graphics g) {
if ("".Equals(txtx.Text) || "".Equals(txty.Text)) { return; } else { x = Convert.ToInt32(txtx.Text); y = Convert.ToInt32(txty.Text); } int xl, xr; bool spanNeedFill; myStack.Clear();
个交点。如右图,对 y=8 的扫描线排序 x 坐标得到的表是(2,4,9,13),然后对交点 2 与 4 之间、9 与 13 之间 的所有象素点进行填充。 边界上的象素:“左闭右开”,“下闭上开”(将左边界和下边界的点算为内部,而将右边界和上边界 算为外部) 顶点:“上开下闭”。
几种特殊情况: 1.扫描线交于一顶点,共享的两条边分另处于扫描线的两边,这时交点只取一个,如扫描线 y=3,该点被填 充一次。2.共享交点的两条边处于扫描线的上方,这时交点取二个,如扫描线 y=1,该点被填充一次。 3.共享交点的两条边处于扫描线的下方,这时交点取 0 个,如扫描线 y=9,无交点,不填充。 4.水平边在算法中不起任何作用,可不考虑。 活性边表(提高效率): 为了减少求交的计算量,要利用一条边与相继的两条扫描线的交点的连贯性。在处理一条扫描线时只对活 性边(与它相交的多边形的边)进行求交运算。把交点按 x 增加方向存在一个链表(活性边表)中。活性边: 与当前扫描线相交的边。 活性边表(AEL) :按交点 x 的增量顺序存放在一个链表中,该链表称作活性边表(AEL) 。
计算机图形学基础教程(Visual C++版)第04章 多边形填充(清华大学出版社 孔令德)
⑵点阵表示法
用多边形覆盖的像素点集来描述 特点是便于直接确定实面积图形覆盖的像素点,是多 边形填充所需要的表示形式, 但是缺少了多边形顶点的几何信息。
⑶多边形的扫描转换
将多边形的描述从顶点表示法变换到 点阵表示法的过程,称为多边形的扫描 转换。 即从多边形的顶点信息出发,求出多 边形内部的各个像素点信息。
4.2 有效边表填充算法
4.2.1 填充原理 4.2.2 有效边和有效边表 4.2.3 边表
4.2.1 填充原理
为了计算每条扫描线与多边形各边的交点, 最简单的方法是把多边形的所有边放在一个 表中。 处理每条扫描线时,按顺序从表中取出所有 边,分别与扫描线求交点。 缺点:效率不高 重复判别多
P2P3 S=1 3 7
P0(7,8),P1(3,12) P2(1,7),P3(3,1) P4(6,5), P5(8,1) P6(12,9)
P4P5 8 5 -1/2 8 9
P5 P6 1/2
10 9 8 7 6 5 4 3 2 1
P0 P2 P4
P6
P3
1 2 3 4 5 6 7 8 9
P5
10 11 12 13 x
如图4-11所示,随着扫描 线的移动,扫描线与有效边 交点的x坐标从起点开始可 以按增量1/k计算出来。
(xi,yi) 1/k
(xi+1,yi+1)
图4-11 有效边交点相关性
2.有效边表(Active
Edge Table,AET)
把有效边按照与扫描线交点x坐标递增的 顺序存放在一个链表中,称为有效边表 有效边表的结点:
P4P5 7 5 -1/2 9 9
P5 P6 1/2
多边形的填充实验经典
试验实验一:图形的区域填充一、实验目的区域填充是指先将区域内的一点(常称为种子点)赋予给定颜色,然后将这种颜色扩展到整个区域内的过程。
区域填充技术广泛应用于交互式图形、动画和美术画的计算机辅助制作中。
本实验采用递归填充算法或打描线算法实现对光栅图形的区域填充。
通过本实验,可以掌握光栅图形编程的基本原理和方法。
实验内容掌握光栅图形的表示方法,实现种子算法或扫描线算法。
通过程序设计实现上述算法。
建议采用VC++实现OpenGL程序设计。
三、实验原理、方法和手段递归算法在要填充的区域内取一点(X, Y)的当前颜色记为oldcoloo用要填充的颜色ne wcolor去取代,递归函数如下:procedure flood-fill(XXoldcoloLnewcolor:integer); beginif getpixel(fiainebufier,x,y)=oldcolorthen beginsetpixel(fiamebuffer,x,y,newcolor); flood-fill(X.Y+1 .oldcoloLiiewcolor);flood-fill(X.Y^ 1 ,oldcoloi;newcolor); flood-fill(X-l,Y;oldcoloi;newcolor); flood-fill(X+l,Yoldcoloi;newcolor);endend扫描线算法扫描线算法的效率明显高于递归算法,其算法的基本思想如下:(1)(初始化)将算法设置的堆栈置为空,将给定的种子点(x,y)压入堆栈。
(2)(出栈)如果堆栈为空,算法结束;否则取栈顶元素(x,y)作为种子点。
(3)(区段填充)从种子点(x,y)开始沿纵坐标为y的当前扫描线向左右两个方向逐个象素进行填色,其值置为newcoloi;直到抵达边界为止。
(4)(定范围)以XleA和Xn血分别表示在步骤3中填充的区段两端点的横坐标。
(5)(进栈)分别在与当前扫描线相邻的上下两条打描线上,确定位于区间[Xldb Xn 曲]内的给定区域的区段。
计算机图形学---多边形填充算法课件
使用更有效的数据结构
使用更有效的数据结构可以减少算法在内存中的访问次数,从而提高算法的性能。例如,可以使用边 界盒(bounding box)来加速多边形的遍历。
还可以使用索引数据结构来加速多边形的遍历,例如使用四叉树(quadtree)或八叉树(octree)。
并行化填充算法以提高性能
并行化填充算法可以将计算任务分配 给多个处理器核心,从而提高算法的 性能。例如,可以使用多线程技术来 并行化填充算法。
CHAPTER 04
填充算法的应用
在游戏开发中的应用
角色和场景渲染
多边形填充算法用于在游戏中创 建逼真的角色和场景,通过填充 多边形来模拟物体的形状和纹理
。
碰撞检测
游戏中的物体需要进行碰撞检测 ,以确保游戏的真实性和玩家的 交互体验。多边形填充算法可以 用于检测多边形之间的重叠,从
而实现碰撞检测。
地表现自然和人造物体的细节,从而丰富图形表现形式。
拓展应用领域
03
随着多边形填充算法的发展,计算机图形学将在虚拟现实、增
强现实、游戏设计、影视制作等领域得到更广泛的应用。
区域增长填充算法
区域增长填充算法是一种基于区域的填 充算法,通过将多边形内部的像素连接 起来形成一个区域,然后对该区域进行
填充。
该算法首先确定多边形的所有像素,然 后从多边形内部的一个像素开始,将其 相邻的像素加入到区域中,直到整个多
边形内部都被填充。
区域增长填充算法的优点是能够处理复 杂的填充需求,如填充不规则形状或多
种子填充算法
种子填充算法是一种基于种子点的填充算法,通过从指定的种子点开始,向周围 扩散填充颜色来实现填充。
该算法适用于任意形状的多边形,具有灵活、易于实现的特点,但可能会在处理 大型多边形时效率较低。
多边形的填充——扫描线算法(原理)
多边形的填充——扫描线算法(原理)2007年10月05日星期五 11:52多边形在计算机中有两种表示:点阵表示和顶点表示。
顶点表示是用多边形的顶点的序列来描述多边形,该表示几何意义强、占内存少,但它不能直观地说明哪些像素在多边形内。
点阵表示是用位于多边形内的象素的集合来刻划多边形,该方法虽然没有多边形的几何信息,但具有面着色所需要的图像表示形式。
多边形填充就是把多边形的顶点表示转换为点阵表示,即从多边形的给定边界出发,求出位于其内部的各个像素,并将帧缓冲器内的各个对应元素设置为相应的灰度或颜色。
多边形填充最常用的方法就是扫描线算法。
下面分两篇文章介绍这种算法的原理和具体实现。
这里所介绍的算法只是针对非自交多边形,这些多边形可以是凸的、凹的或者带有空洞的。
所谓扫描线算法就是找到多边形的最小y值和最大y值,然后用这个范围内的每一条水平线与多边形相交,求得交点,再绘制线段。
所以我们只需要对一条水平线进行分析就可以。
很显然,一条扫描线和多边形有偶数个交点,将这些交点按照x值从小到大排列,然后取第1、2个绘制,第3、4个绘制......直到所有交点都被取完。
所以,对于一条扫描线,我们需要做的工作可以分为三个步骤:1)求出扫描线与多边形边的交点 2)将交点按照x升序排列 3)将排好序的交点两两配对,然后绘制相应线段。
这三个步骤中,后两个步骤很简单,没有特别的内容需要介绍。
但是第一个步骤比较麻烦。
这里有几个问题需要解决。
一是当扫描线与顶点相交时,交点的取舍。
当与那个顶点关联的边在扫描线同侧时,交点自然算两次,当与那个顶点关联的边在扫描线两侧时,交点只能算一次。
我们使用“下闭上开”的办法。
二是多边形边界上的像素取舍,我们采用“左闭右开”的办法。
三是如何减少计算量。
在绘制直线时,有一种DDA算法,它是利用(x,y)直接求出下一个点位于(x+1,y+m)或者(x+1/m, y+1)。
在这里可以利用这一点。
当已经得到y = e和多边形所有边的交点时,对于下一条扫描线y=e+1,如果没有新边与y=e+1相交,就可以推出y = e+1 和多边形所有边的交点。
《多边形填充》课件
常见填充算法
扫描线填充算法
通过扫描多边形区域的水平线,确定交点并填充像素。
边界填充算法
从多边形边界的某个点开始,沿着边界推进并填充内部像素。
种子填充算法
通过指定一个种子点,从该点开始向外扩散填充区域。
实例演示
三角形填充
使用扫描线算法和渐变色填充 一个三角形区域。
棋盘格填充
使用边界填充算法和黑白相间 的格子填充一个矩形区域。
纹理填充
使用种子填充算法和一张纹理 图像填充一个复杂的多边形区 域。
填充的应用领域
1 计算机游戏
2 动画制作
填充用于渲染游戏道具、 人物模型和背景场景, 增强游戏画面的真实感。
填充可以给动画中的形 状和物体添加色彩和纹 理,使其栩栩如生。
3 虚拟现实
填充用于在虚拟现实环 境中创建逼真的场景和 对象,增强用户的沉浸 感。
总结和展望
通过本课件的学习,您应该对多边形填充有了更深入的理解。希望您能够将这些知识应用到实际项目中, 并继续探索计算机图形学的更多领域。
填充的定义和作用
填充是将颜色、纹理或图案应用到多边形的过程。它可以增强图形的视觉效 果,使其更加生动、丰富和有吸引力。填充还可以区分多边形之间的空间, 帮助观察者更好地理解和解读图形。
填充的基本原理
填充的基本原理是确定多边形内的像素点,并为这些像素点分配相应的颜色 或纹理。常用的填充算法包括扫描线填充算法和边界填充算法。
《多边形填充》PPT课件
本课件将介绍多边形填充的背通过实例演示帮助理解。最后,将探讨填充的应用领域,并进 行总结和展望。
背景和介绍
多边形填充是计算机图形学中的重要概念,用于给封闭的多边形区域添加颜 色或纹理。它在许多领域中都有广泛的应用,包括计算机游戏、动画制作和 虚拟现实等。
计算机图形学 第四讲 区域填充
活化边表
把与当前扫描线 相交的边称为活 化边,并把它们 按与扫描线交点 X坐标递增的顺 序存放在一个链 表中,形成活化 边表。
表结构
算法中采用较灵活的数据结构。它由边的分有序边 表ET(Edge Table)和边的活化边表AEL(Active Edge Table )两部分组成。 表结构ET和AET中的基本元素为多边形的边。边 的结构由以下四个域组成: ymax 边的上端点的y坐标; x 在ET中表示边的下端点的x坐标,在 AET中则表示边与扫描线的交点的坐标; Δx 边的斜率的倒数; next 指向下一条边的指针。
四个方向运动 八个方向运动
四连通区域
八连通区域
算法原理:
填充区域边界 以一种颜色指 定,从区域的 一个内部点开 始,由内至外 绘制直到填充算法
设(x,y)为内点表示的4连通区域内的一点,oldcolor为区域的 原色,要将整个区域填充为新的颜色newcolor。内点表示的 4连通区域的递归填充算法: 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); } }
i1
a
i1
i
a
其中 x
b 为常数, a
交点数的处理
第4章多边形填充算法
E2
E5
E3 E4
边缘填充算法示意图
1.边缘填充算法(正负相消法) 基本原理是:对每一条扫描线,依次求与多边形各边 的交点,将该扫描线上交点右边的所有像素求补。多 边形所有边处理完毕,填充即完成。
优点:简单易行 缺点:多边形外的像素处 理过多,输入输出量大
算法改进
• ቤተ መጻሕፍቲ ባይዱ围盒 • 栅栏
带包围盒的多边形
第4章 多边形填充算法
4.3 边缘填充算法
4.3.1 填充原理
• 求出多边形的每条边与扫描线的交点 • 将交点右侧的所有像素颜色全部取为补
色。 • 按任意顺序处理完多边形的所有边。
4.3.2 填充过程
假定边的访问顺序为E0、E1、E2、E3、E4、E5和E6。
P1(x1,y1)
E1
E0
E6
P0(x0,y0)
缺点:某些像素被重复取补
3.边标志填充算法
基本思想:先用一种特殊的颜色在帧缓存中将多边形 的边界(水平边除外)勾画出来,然后将着色的像素点依x 坐标递增的顺序两两配对,再将每一对像素所构成的扫描线 区间内的所有像素置为填充色。
3.边标志填充算法
①打标记:对多边形边界所在像素置一个特殊标志。按照 “下闭上开”的原则处理局部最低点为两个交点,局部 最高点为0个交点。
② 填充:对于每条与多边形相交的扫描线,依照“左闭 右开”的原则从左至右逐个访问该扫描线上的像素,并 着色。
3.边标志填充算法
栅栏填充算法
栅栏:一条过多边形顶点且与扫描线垂直的直线,它将 多边形分成两半,只要将栅栏与多边形之间的像素求补 即可。
缺点:某些像素被重复取补
栅栏填充算法
基本原理:对于每条扫描线与多边形的交点,将交点与栅栏 之间的扫描线上的像素取补,也就是说,若交点位于栅 栏左边,则将交点之右、栅栏之左的所有像素取补;若 交点位于栅栏右边,则将栅栏之右、交点之左的所有像 素取补。
《计算机图形学教学资料》第6讲-多边形填充
05
多边形填充的未来发展
新型填充算法的研究
基于物理的填充算法
模拟真实世界的物理现象,如流体动 力学、表面张力等,以实现更加自然 的多边形填充效果。
智能优化算法
利用遗传算法、模拟退火等智能优化 技术,自动寻找最优的填充方案,提 高填充效率和准确性。
人工智能在多边形填充中的应用
学习型填充算法
通过机器学习技术,让算法自动学习优秀的人类设计师的填充风格,实现更加 艺术化的多边形填充效果。
优化内存管理
合理分配和释放内存,避免频繁的内 存分配和释放操作,可以提高多边形 填充的性能。
04
多边形填充的实践案例
使用OpenGL实现多边形填充
总结词
使用OpenGL进行多边形填充是一种常见的图形编程实践,它涉及到顶点数据、着色器程序和渲染流程的配置。
详细描述
首先,你需要定义多边形的顶点坐标,并将其存储在一个顶点数组中。然后,你需要编写一个OpenGL着色器程 序,用于处理顶点数据并进行渲染。在渲染过程中,你需要设置正确的顶点属性、着色器程序和渲染流程,以确 保多边形能够正确填充颜色。
填充区域
填充区域指的是多边形的内部区域,即所有被填充 的像素组成的区域。
填充颜色
填充颜色是指用于填充多边形内部的颜色,可以根 据需要选择不同的颜色。
填充算法的分类
扫描线填充算法
扫描线填充算法是一种基于扫 描线的填充算法,通过从左到 右、从上到下扫描多边形的内 部像素,对落在多边形内部的 扫描线进行上色。
在游戏开发中应用多边形填充
总结词
在游戏开发中应用多边形填充技术可以创建 更加逼真的游戏场景和角色模型。
详细描述
游戏开发者通常使用游戏引擎(如Unity或 Unreal Engine)来创建游戏场景和角色模 型。在这些引擎中,多边形填充技术被广泛 应用,以实现更加逼真的场景和角色模型。 通过合理配置顶点数据、着色器程序和渲染 流程,游戏开发者可以创建出令人惊叹的游 戏视觉效果。
填充和裁剪
栈的情况 (5,6) (6,6) (6,6) (6,5) (6,5) (4,5) (5,4) (4,6) (4,4) (6,6) (4,5) (6,5) (4,6) (5,4) (4,4) (4,5) (4,6)
0 2 4 6 8 10 X
结论
分析该算法不难发现,在进行填充过程中堆栈会变得 很大,而且在堆栈中还常常包含有一些重复的和不必要 的信息。为此提出了扫描线种子填充算法。 所谓扫描线种子填充算法,是在任意不间断扫描线区间中 只取一个种子象素。不间断区间即指在一条扫描线上
裁剪
裁剪算法有二维的和三维的,裁剪对象可以是 规则形体,也可以是不规则形体,其裁剪算法可以 图形裁剪就是决定画面中哪些点、线段或线段
的一部分位于裁剪窗口之内,这些点、线段或线段
的一部分被保留显示,而画面其它部分被裁去。
处理裁剪
处理裁剪有两点: 第一是判断点在区域内或外部; 第二是计算图形与限定区域边界的交点。 由于在一个典型画面或图形中需要对大量的点或线 段进行裁剪,裁剪算法的效率十分重要,在许多情 况下,绝大多数的点不是在裁剪区域内就是在裁剪
第四章 填充和裁剪
在这一章中将讨论图形系统中新的图元——多边形,
研究有关多边形的概念以及如何表示多边形,学习如何 判断一个点是否在多边形内的方法,以及多边形填充的 各种方法。
1.多边形
所谓多边形就是用一系列首尾相连的线段构成的图形, 这些组成多边形边界的线段称为多边形的边,多边形的边 的端点称为多边形的顶点,一般来说一个多边形应是封闭
图示
线段的裁剪
由Dan Cohen和Ivan SutherLand提出的,采用 四位数码来标识线段的端点与窗口区域的关系,然后
进行裁剪的算法- Cohen- SutherLand算法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
class CBucket { public: CBucket(); virtual ~CBucket(); public: int ScanLine; CAET *p; CBucket *next; }; 桶类
感知光强 实际光强
马赫带
填充多边形
多边形填充的主要算法是扫描线算法。先确定多边形 覆盖的扫描线条数,对每一条扫描线,计算扫描线与多 边形边界的交点区间,如果能判断该区间在多边形内部, 则将其内的像素绘制为指定的颜色。扫描线算法在处理 每条扫描线时,需要与多边形的所有边求交,处理效率 很低。改进的算法是有效边表算法。
}
4.2.5 算法步骤
输入:顶点数组 CPoint Point[7];//定义多边形,7个 顶点 算法 (1)根据顶点计算多边形最低点y值 (scanMin)和多边形最高点y值(scanMax); (2)建立桶表和边表; 建立桶表: i从scanMin到scanMax的循环, 将i赋给scanLine, 指针p为空,各节点相联
4.2
有效边表填充算法
4.2.1 填充原理
有效边表填充算法通过维护边表和有效边表,避开 了扫描线与多边形所有边求交的复杂运算。填充原理是 按照扫描线从小到大的移动顺序,计算当前扫描线与有 效边的交点,然后把这些交点按x值递增的顺序进行排序、 配对,以确定填充区间,最后用指定颜色填充区间内的 所有像素,即完成填充工作。有效边表填充算法已成为 目前最为有效的多边形填充算法之一。
区域是指相互连通的一组像素的集合。区域通常由 一个封闭的边界来定义,处于一个封闭边界线内的所 有像素构成一个区域。区域内的所有像素着同一填充 色,区域的边界色和填充色一般不一致。种子填充算 法是从区域内的一个种子位置开始,由内向外用填充 颜色绘制种子及其相邻像素直到颜色不同的边界像素 为止。种子填充算法主要分为4邻接点算法和8邻接点 算法。
//扫描线 //桶上的边表指针
(2)将每条边的信息链入与该边最小y坐标(ymin)相 对应的桶处。也就是说,若某边的较低端点为ymin,则 该边就存放在相应的扫描线桶中。
(3)对于每一条扫描线,如果新增多条边,则按 x|ymin坐标递增的顺序存放在一个链表中,若x|ymin 相 等,则按照1/k由小到大排序,这样就形成边表。
多边形边界内的每一个像素着色。
4.1.1 多边形的定义
多边形是由折线段组成的封闭图形。它由有序顶点的 点集Pi(i=0,…,n-1)及有向边的线集Ei(i=0,…, n-1)定义,n为多边形的顶点数或边数,且Ei=PiPi+1,i =0,…,n-1。这里Pn=P0,保证了多边形的闭合。多边 形可以分为凸、凹多边形以及环。
集来描述,这种表示方法虽然失去了许多重要的集合
信息,如顶点、边界等,但便于运用帧缓冲来表示图 形,方便直接读取像素来更改多边形的填充色。
⑶多边形的扫描转换 将多边形的描述从顶点表示法变换到点阵表示法 的过程,称为多边形的扫描转换。即从多边形的顶点 信息出发,求出位于多边形内部的各个像素点信息, 并将其颜色值写入帧缓冲的相应单元中。
平面着色
光滑着色
马赫带(Mach Band)是由灰度接近的矩形块组成。 在观察明暗变化的边界时,边界处亮度对比度加强, 常常在光强阶梯变化的一侧感知到亮度的正向尖峰效 果,而在另一侧感知到亮度的负向尖峰效果,使得边 界表现得非常明显,这种现象称为马赫带效应。马赫 带效应不是一种物理现象,而使一种心理现象,夸大 了平面着色的渲染效果,使得人眼感觉到的亮度变化 比实际的亮度变化要大。绘制真实感图形的过程中应 尽量避免出现马赫带效应。
对一条扫描线的填充一般分为以下4个步骤 •求交:计算扫描线与多边形各边的交点; •排序:把扫描线上所有交点按递增顺序进行排序; •配对:将第一个顶点与第二个顶点,第三个顶点与第 四个顶点等等进行配对,每对交点代表扫描线与多边形 的一个相交区间。 •着色:把区间内的像素置为填充色。
4.1.5 填充区域
第四章
本章学习目标
有效边表填充算法
本章内容
4.1 4.2 4.3
多边形的扫描转换 有效边表填充算法 本章小结
4.1
多边形的扫描转换
本章将以直线段连接而成的示例多边形为 例讲解多边形的填充算法,同时给出图形边
界像素的处理原则。多边形内部可以使用平
面着色模式或光滑着色模式填充。无论使用
哪种着色模式,都意味着要使用指定颜色为
4.2.4 桶表与边表
从有效边表的建立过程可以看出,有效边表给出了 扫描线与有效边交点坐标的计算方法,但是并没有给出 新边出现的位置坐标。为了确定在哪条扫描线上插入了 新边,就需要构造一个边表(edge table,ET),用以 存放扫描线上多边形各条边出现的信息。因为水平边的 1/k为∞,并且水平边本身就是扫描线,在建立边表时 可以不予考虑。
(xi+1,yi+1) (xi,yi) 1/k (x0,y0) 1
有效边交点相关性
2.有效边表(AET)
x ymax 1/k next
有效边结点 class CAET { public: CAET (); virtual ~ CAET (); public: double x; int yMax; double k; // k x y CAET * next; } 有效边类
P1 P6 P0 P2 P4
P3
P5
多边形的顶点表示法 多边形的点阵表示法
4.1.3 多边形着色模式
多边形可以使用平面着色模式(flat shading mode) 或光滑着色模式(smooth shading mode)填充。平面 着色是指多边形所有顶点的颜色都相同,多边形内部具 有同顶点一样的颜色。光滑着色是指多边形各个顶点的 颜色不同,多边形边的颜色是由这条边的两个顶点的颜 色插值得到,多边形内部的颜色是由扫描线上共享同一 顶点的相邻两条边上的颜色插值得到。
4.2.3 有效边与有效边表
1.有效边(AE) 多边形与当前扫描线相交的边称为有效边(active edge)。在处理一条扫描线时仅对有效边进行求交运 算,可以避免与多边形的所有边求交,提高了算法效 率。有效边上的扫描线由起点到终点每次加1,即像素 点的y坐标为y=y+1,x坐标的变化可以按如下方法推 导。 (x1,y1)
建立边表: 对顶点表进行循环,Pi为当前点,Pi+1为下一点, 比较两点的y坐标,y小的为Plow,大的为Phigh; 令经yMin=plow.y; x=Plow.x; yMax=Phigh.y;
1 Phigh .x Plow .x k Phigh . y Plow .y 将该结点链接到 scanLine=yMin 的桶结点的链表
测试,效率很低。有效的改进方法是扫描线种子填充算
法。
习题4
1.试写出图4-43所示多边形的边表和扫描线y=4的有效 边表。
y 7 6 5 4 3 2 1
P5 P3 P4 P0 P6 P1 P2
1 2 3 4 5 6 7 8 x
O
图4-43 多边形
2.给定四个点绘制图4-44所示的不同转角的两个正方 形,使用有效边表算法进行填充,填充效果如图4-45 所示,注意采用“左闭右开” 和“上闭下开”的原 则,使得每个正方形的右边界和下边界没有填充。
P E1 P2 顺时针 E2 E3 P3 P4 E4 P5 P0 E5
1
逆时针 E0
图 4-4 多边形的定义
4.1.2 多边形的表示
⑴顶点表示法 用多边形的顶点序列来描述。特点是直观、占内存 少,易于进行几何变换,但由于没有明确指出哪些像素 在多边形内,所以不能直接进行填充,需要对多边形进 行扫描转换后才能逐条扫描线填充。 ⑵点阵表示法 多边形的点阵表示法是用位于多边形内的像素点
4.2.2 边界像素处理原则
填充左下角为(1,1),右上角为(3,3)的 正方形时,若将边界上的所有像素全部填充,就得 到图示的结果。
y 6 5 4 3 2 1
y 6 5 4 3 2 1
O
1
2
3
4
5
6
x
O
1
2
3
4
5
6
面积3×3
面积2×2
在多边形填充过程中,常采用“左闭右开”和 “下闭上开”的原则对边界像素进行处理。 参CDC::FillRect的处理原则: When filling the specified rectangle, FillRect does not include the rectangle’s right and bottom sides. 其中CDC使用的设备坐标系与本书自定义的坐标系不同。
P2
P3
P5
P0(7,8); P1(3,12); P2(1,7); P3(3,1); P4(6,5); P5(8,1);P6(12,9)
本章小结
本章重点讲授了有效边表填充算法,该算法是后面 一直使用的多边形填充算法,由于可以访问多边形内的 每一个像素,因此可以使用平面着色模式或结合双线性 线性插值算法的光滑着色模式填充物体表面。有效边表 表示的是扫描线在一条边上的连贯性,边表表示的是新 边在扫描线上的插入位置,边表是有效边表的特例,有 效边表和边表都使用CAET类表示。区域填充算法主要包 括四邻接点种子填充算法和八邻接点种子填充算法,由 于未考虑像素间的相关性,只是孤立地对单个像素进行
P5 P6 P7 P0 P1 P8 P3 P2
P2
P4
P1 P6 P0 P4