计算机图形学复习0
计算机图形学复习1
计算机图形学复习2
前面讲的画直线、圆以及椭圆等是一维图形的光栅化,就是如何在计算机屏幕上即在一个离散的像素集上表示一个连续的图形。
多边形的扫描转换和区域填充这个问题是怎么样在离散的像素集上表示一个连续的二维图形。
区域填充
区域:指已经表示成点阵形式的填充图形,是象素的集合。
区域填充:对给定的一个区域范围内像素赋予指定产颜色代码。
填充步骤:第一步确定需要填充哪些像素:第二步,用什么颜色来填充。
多边形分类:凸多边形、凹多边形、含内环的多边形;
需要的是满足所有图形的区域填充算法。
主要讲两种,一种是种子填充算法,另一种是扫描线算法
区域的表示
区域有两种重要的表示方法:顶点表示和点阵表示。
顶点表示:也称为几何表示,是用区域的顶点序列来表示区域。
特点:直观、几何意义强、占内存少,易于进行几何变换,但没有明确哪些像素在多边形内,只能用扫描线转换将顶点变为点阵表示.
点阵表示:也称为像素表示,是用位于多边形内的像素集合来刻画多边形。
特点:丢失了许多几何信息,便于帧缓冲表示,适合面着色.首先将区域内的一点赋予指定的颜色,然后将其扩展到整个区域.
点阵通常有两种情况:内点表示、边界表示
内点表示,称 泛填充
枚举处区域内部的所有像素
内部的所有像素着同一个颜色
区域外像素着另一种颜色
边界表示,称边界填充
枚举出边界上所有的像素
边界上的所有像素着同一颜色
内部像素着边界像素颜色或新颜色
区域的类型
区域填充算法要求区域是连通的;
区域可分为4向连通区域和8向连通区域;
也就是四个方向运动和八个方向运动。
四连通区域和八连通区域:
四向算法和八向算法:
四方向算法:允许从四个方向寻找下一个像素的方法,称为四向算法
八方向算法:允许从八个方向寻找下一个像素的方法,称为八向算法
八向算法可以填充八向连通区域,也可以填充四向连通区域;
四向算法可以填充四向连通区域,但不能填充八向连通区域
对如图所示的区域填充两种不同的颜色:
扫描线多边形填充算法
计算机上画图形,实际上就是写帧缓存(frame buffer). 如果知道多边形哪些像素在里面,就直接写到帧缓存里即可;
区域填充:指先将区域的一点赋予指定的颜色,然后将该颜色扩展到整个区域的过程。
多边形有两种重要的表示方法:顶点表示和点阵表示;
对于光栅图形的基本问题是把多边形的顶点表示转换为点阵表示。
也就是从多边形的给定边界出发,求出位于其内部的各个像素,并给帧缓存器内的各个对应单元设置相应的灰度和颜色,这种转换称为多边形的扫描转换。
多边形的扫描转换过程,实际上是给多边形包围的区域着色的过程,是一种面着色的方法。
逐点判断算法
逐点判断是最简单的一种多边形扫描转换方法;
基本思想:逐个窗口内的像素,确定它们是否在多边形之内,从面给出位于多边形内的点的集合;
方法:射线法、编码法、累计角度法等;
算法优点:简单;
算法缺点:计算量太大,速度慢;
射线法(也称累计交点法)
步骤
1.从待判别点v发出射线
2.求交点个数K
3.K的奇偶性决定了点与多边形的内外关系,若交点个数奇数,V点在多边形内部,反之在多边形外部
判断一点是否位于多边形内部?
看其于多边形交点的个数。
但是逐点判断算法中会出现一些奇异情况:
还得重新对点进行特殊的处理。
速度慢:几十万甚是几百万像素的多边形内外判断,大量的求交、乘除运算
没有考虑像素之间的联系
结论:逐点判断算法不可取!
扫描线算法
扫描线算法充分利用相邻像素之间的连贯性,避免了对像素的逐点判断和求交运算,提高了算法效率
基本思想: 按扫描线顺序,计算扫描线与多边形的相交区间再用要求的颜色显示这些区间的象素,即完成填充工作。
如何利用连贯性呢?
多边形连贯性的原理
区域连贯性
区域的连贯性是指多边形定义的区域内部相邻的像素具有相同的性质。例如具有相同的颜色 。
两条扫描线之间的长方形区域被所处理的多边形分割成若干梯形。
梯形分为两类:多边形内部和多边形外部。
两类梯形在多边形内部相间排列。
这样分割的话,也就是说:如果上述梯形属于多边形内(外),那么该梯形内所有点的均属于多边形内(外)。
效率提高的根源:逐点判断—》区域判断
扫描线的连贯性
区域连贯性在一条扫描线上的反映
若多边形与一条扫描线相交, 由区域连通性可得该交点序列的性质:
交点数目为偶数;
相邻交点间的线段分为两类:一类是线段上所有点均在多边形内部;一类是线段上所有点均在多边形外部;
两类线段相间排列;
实质:是多边形区域的连贯性在一条扫描线上的反映;而光栅显示器正是按行扫描。
推论:如果上述交点区间属于多边形内(外),那么该区间内所有点均属于多边形内(外)。
效率提高的根源:逐点判断–》区间判断。
边的连贯性——扫描线与边的关系
边的连贯性:直线的线性性质在光栅上的表现
设扫描线与边的交点如图所示:
那么相邻扫描线(y1=y11+1)与多边形的同一条边的交点存在如下关系:
当知道扫描线与一条边的一个交点之后,通过上述公式可以通过增量算法迅速求出其他交点。
边连贯性的实质:是区域的连贯性在相邻两扫描线上的反映;
推论:边的连贯性是连接区域连贯性和扫描线连贯性的纽带。
扫描线连贯性 “+” 边连贯性“=” 区域连贯性
奇异点
奇异点:扫描线与多边形相交于多边形的顶点
奇异点计为几个交点?
扫描线1:一个交点
扫描线2:两个交点
奇异点的分类
非极值点:相邻三个顶点的y坐标满足如下条件:
即相邻三个顶点位于扫描线的两侧。
交点按1个计算。
极值点:
相邻三个顶点的y坐标满足如下条件:
即相邻三个顶点位于扫描线的同一侧
当奇点在多边形两边的下方时,交点按2个计算
当奇点在多边形两边的上方时,交点按0个计算
对奇异点的处理:
在极值点处,按2个或0个交点计算
在非极值点处,按1个交点计算
实际计算前,奇异点(非极值点)的预处理
将扫描线上方线段截断一个单位,这样扫描线就只与多边形有一个交点。
扫描转换算法采用上开下闭的原则(解决扩大化问题)
这里涉及到一个边界点像素的填充问题:如下:
例,对左下角为(1,1), 右上角为(3,3)的正方形填充。
若对边界上所有的像素进行填充,则得到如图所示的结果;
填充后的面积为3×3,而实际面积只有2×2——填充扩大化问题;
解决方法: 规定落在右/上边界的像素不予填充; 而落在左/下边界的像素予以填充;
填充扩大化问题的解决:
扫描线与多边形的顶点相交区间取左闭右开-》解决了左右扩大化问题;
如何解决上下扩大化问题?—上开下闭原则
当扫描线与多边形的顶点相交,顶点是极值点时,交点计为2个。
为了解决填充扩大化问题,当极值点是多边形局部最高点时,交点计0个。
扫描转换算法的核心思想
核心思想(从下到上扫描)
计算扫描线 y = ymin与多边形的交点,通常这些交点由多边形的顶点组成
根据多边形边的连贯性,按从下到上的顺序求得各条扫描线的交点序列
根据区域和扫描线的连贯性判断位于多边形内部的区段
对位于多边形内的直线段进行着色
对于一条扫描线,多边形的填充过程可以分为以下四个步骤:
求交:计算扫描线与多边形各边的交点;
排序:把所有交点按x递增排序;
配对:第一个与第二个,第三个与第四个等,每对交点代表一个相交区间;
填色:把相交区间内的像素置多边形色,相交区间外的像素置背景色。
如何用计算机实现?
如何将信息存放在计算机中?
如何将多边形信息存储起来?(静态的)
如何存放扫描线与多边形的交点信息?(动态的)
如何获取交点?
如果将多边形的所有边放在一个表中, 那么只要顺序取出每条边与扫描线进行求交运算即可。
为了实现上述思想,算法中需要采取灵活的数据结构。
边的分类表ET (Sorted Edge Table):记录多边形信息
边的活化边链表AEL (Active Edge List) :记录当前扫描线信息,按与扫描线交点x坐标递增的顺序存放在一个链表中
它们共同基础是边的数据结构
结点的第一个信息:交点的横坐标x
结点的第二个信息:增量△x
结点的第三个信息:边所交的最高扫描线号ymax
那么边的数据结果如下:
边的数据结构
x:边的下端点x坐标,在活化边链表中,表示扫描线与边的交点的x坐标
dx:x的增量△x,即边的斜率的倒数
ymax:边的上端点的y坐标
next:指向下一条边的指针
边的ET表(边表):
分类表ET是按**边下端的纵坐标y**对非水平边进行分类的指针数组;
**有多少条扫描线,就设多少类;**
同一类中,各边按**x值(x相等时,按Δx值)递增**的顺序排列成行。
非极值点, 可作预处理;
水平边不参与分类。
活化边链表(AEL)——有效边表:
活化链表由与**当前扫描线**相交的边组成
记录了多边形的边沿扫描线的交点序列
根据边的连贯性不断刷新交点序列
基本单元是边(与扫描线相交的边)
与分类边表不同
分类边表记录初始状态——静态
活化边表随扫描线的移动而更新——动态
具体的边表和活化链表我录制了一个bili视频:
多边形的边表和活化链表表示
扫描线算法也称有序边表算法,具有以下特点:
对多边形的每个像素只访问一次;
输入/输出量小;
表结构复杂,且时刻要维护表结构;
对链表要排序;
适合软件实现,不适合硬件实现.
十分复杂,对于此,有人提出了边缘填充算法。
边缘填充算法
思路:利用求余运算代替交点排序、配对、构造填充区间。
原理:象素点颜色值经过偶数次求余运算后保持不变,经过奇数次求余运算后变为其余数
分类:边填充算法,栅栏填充算法
边填充算法
基本思想:
对于每条扫描线和每条多边形边的交点(xi,yi), 将该扫描线上交点的右方所有象素求余运算(取补);多边形的顺序任意;
当所有的边处理之后,按扫描线顺序读出帧缓冲器的内容,送入显示设备;
边填充算法的优缺点:
优点:
最适合于有帧缓存的显示器
可按任意顺序处理多边形的边
仅访问与**该边**有交点的扫描线上**右方**的像素