第4章 多边形的扫描转换与区域填充

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
的象素臵成背景色。
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 扫描线填充算法
4.2.2 扫描线填充算法
存在问题: 多边形边界上像素的取舍问题。 问题2:避免填充扩大化?
对左下角为(1,1),右上 角为(3,3)的正方形填充
4.2.2 扫描线填充算法
解决方法:规定落在右/上边界的象素不予填充,而落在左/下 边界的象素予以填充。
具体实现:
对扫描线与多边形的相交区间, 取“左闭右开”,如【2,9) 问题1保证了多边形的“下闭上开”
即假设屏幕上某区域内象素的颜色为M,则对该区域内象素颜色作偶数次求 余运算后,该区域内象素的颜色保持不变,而做奇数次求余运算后,该区域 内象素的颜色变为M’。
4.2.3 边缘填充算法
设x1,x2,…,xn(n为偶数)是扫描线y与多边形的交点的x坐标序列,则该 扫描线上位于多边形内部的象素可按以下步骤求得: (1)将当前扫描线y上的所有象素都初始化为颜色M: (2)在当前扫描线上,从横坐标为xi(i=1,2,…,n)的交点向右求余 扫描线y上位于多边形内部的象素都经过了奇数次求余运算,颜色为M’;而 位于多边形外部的象素都经过了偶数次求余运算,颜色为M。这种多边形的扫描 转换称为以扫描线为中心的边缘填充算法 边为中心的边缘填充算法: (1)将所有象素都初始化为颜色M (2)对于多边形的所有边,逐边向右求余,也就是计算扫描线与边的交点, 从交点开始向右取余
2.区域填充:
从给定的位臵开始涂描直到指定的边界为止。用在具有复杂形状边界 的多边形以及交互式绘图系统中。
第4章 多边形的扫描转换与区域填充
4.1 4.2 4.3 4.4 4.5

矩形填充 多边形扫描转换 区域填充 多边形扫描转换与区域填充的区别 光栅图形的反走样
4.1 矩形填充
为了将它用指定的颜色均匀填充,只要填充从ymin到ymax每条扫 描线位于xmin和xmax之间的区段就可以。其程序如下:
4.2.2 扫描线填充算法
五.扫描线算法步骤
4.2.2 扫描线填充算法
六、扫描线算法特点
1.数据结构和算法本身要比逐点判断算法复杂
2.速度比逐点判断算法快得多
利用边的连贯性来加速交点的计算
利用AET以排除盲目求交
利用扫描线的连贯性以避免逐点判别
4.2.3 边缘填充算法
求余运算:
假设A为一个给定的正数,则数M的余数定义为A-M,记为M’。当计算机内用 n位二进制表示M时,可取A=2n-1,易知M’’=M,即对M作偶数次求余运算, 其结果是M;而对M作奇数次求余运算的结果是M’。这一规律应用到多边形的 扫描转换,就称为边缘填充算法。
4.3.1 区域的表示
区域填充算法要求区域是连通的,只有在连通的区域中,才有可能将种子点的颜 色扩展到区域内的其他点。根据相互连通的定义不同,区域可分为: 4连通: 4连通内部表示区域:可以从任一一个象素出发,通过上、下、左、右等4 个方向的移动,到达另一个象素。 8连通



8连通内部表示区域:从任一个象素出发,需要通过水平、垂直、 对角线等8种方向的移动,到达另一个象素
4.2.2 扫描线填充算法
一、区域特点:
一条扫描线上的像素存在着相关性 在多边形边处,像素性质才发生变化
将相邻像素放在一起测试,从而减少测试点的数目
4.2.2 扫描线填充算法
二、基本思想
按扫描线顺序,先计算出扫描线与多边形区域边界的交点,然后
判断扫描线上的哪些部分在区域边界之内,再用要求的颜色显示边 界内的像素。
1: P2P1 2: P1P6 3: P3P4 P2P3
扫描线Y=
4:
5: P5P6 P5P4
所以,ET的意义在于为扫描线提供待加入的新边信息。
4.2.2 扫描线填充算法
2.活性边表(AET)
假设当前扫描线与多边形的某一条边的交点坐标为x,那么下一条
扫描线与该边的交点不必从头计算,只要加上一个增量即可。
2.点阵表示 用位于多边形内部或边界上的像素集合来刻画多边形 点阵表示特点 会失去很多重要的几何信息,不过它是光栅显示系统显 示面着色时所需的图形表示形式。
多边形的点阵表示
第4章 多边形的扫描转换与区域填充
二、多边形填充方式 1.多边形扫描转换:
顶点表示不能直接用于显示,必须要进行从多边形顶点表示到点阵表 示的转换,这种转换就是给多边形包围的区域着色的过程,即从多边 形的给定边界出发,求出位于其内部的各个像素,并将其灰度和颜色 值写入帧缓存中相应的单元。主要用来填充多边形区域以及由多边形 拟合的其他简单曲线区域。
二、弧长法
点P在多边形外部
点P在多边形内部
4.2.1 逐点判断算法
•算法实现:
用函数Inside(polygon,x,y)来测试被测点(x,y)的
位臵; 函数返回“真”值,即可对多边形内部的点进行填充。 •算法特点: 简单 速度慢
算法割断了像素间的联系,孤立地考察各个像素与多边形的
内外关系,使得绘图窗口内的每一个像素都要一一判别,每次 判别又需要大量的运算,所以效率很低。
线右边的边与射线相交时交点无效,不计数。(左闭右开原则) 点A: 0个交点,在多边形外 点B: 1个交点,在多边形内 点C:3个交点,在多边形内 点D: 1个交点,在多边形内
点E: 2个交点,在多边形外
点F: 1个交点,在多边形内(剔除重合边)
f
4.2.1 逐点判断算法
二、弧长法 要求
多边形由有向边组成,即规定沿多边形各边的走向其左侧(或 右侧)为多边形的内部。
第4章 多边形的扫描转换与区域填充
第4章 多边形的扫描转换与区域填充
一、在计算机图形学中,多边形有两种重要的表示方法: 1.顶点表示 用多边形的顶点序列来刻画多边形 顶点表示特点
表示方法直观,几何意义强,占内存空间少,但没指明哪些像素在
多边形内,不能直接用于着色。
多边形的顶点表示
第4章 多边形的扫描转换与区域填充
思想
以被测点为圆心作单位圆,将全部有向边向单位圆作径向投影, 并计算其在单位圆上弧长的代数和。
判断方法
如果代数和为0,则被测点在多边形之外,若代数和为2,则 被测点在多边形之内。
其他
对于内部有空洞的多边形,只要按照上述规定来定义多边形的 有向边,则可以采用同样的测试方法。
4.2.1 逐点判断算法
4.2.3 边缘填充算法
算法过程
边缘填充算法特点:
用求余运算代替排序 数据结构和程序结构简单
需要对帧缓存的大量象素反复赋值
运行速度比扫描线算法慢
4.3 区域填充
4.3.1 区域的表示

区域指已经表示成点阵形式的填充图形,它是象素的集合。 区域填充指先将区域的一点赋予指定的颜色,然后将该颜色扩展到 整个区域的过程。区域填充算法要求区域是连通的 区域建立和定义的方式: 内定义区域:区域内部所有象素具有同一种颜色或亮度值, 而区域外的所有象素具有另一种颜色或亮度值。 漫水法:将该区域种的全部象素都设臵为新值的算法,即填 充内定义的区域 边界定义区域:边界上所有象素均具有特定的颜色或亮度值, 而在区域内的象素则具有不是新值的某种颜色或亮度值 边界填充算法:将边界定义区域中的全部象素值都设臵为新 值的算法。
内定义区域示意图
边界定义区域示意图
4.3.2 递归填充算法
1.漫水法
基本方法: 设(x,y)为四连通区域内部的一点,old_Color为区域内部所有象素 的原色。现取(x,y)为种子点,要将整个区域填充为新的颜色 new_Color。 递归填充算法:
设边AB的斜率为m,若其与扫描线yi的交点横坐标为xi,则与扫描线 yi+1的交点的横坐标为:
xi+1=xi+1/m
4.2.2 扫描线填充算法
2.活性边表
活性边表的结点中至少应为对应边保存如下内容: Ymax :边所交的最高扫描线号; X :边与当前扫描线的交点的X坐标; ΔX :从当前扫描线到下一个扫描线之间的x增量;
•实现:
依次考察各条扫描线,一条扫描线从左至右与多边形的交点是成
对出现的,即A、B点,C、D点之间的像素都位于多边形之内,则A、 B为一个区段, C、D为一个区段。对这些区段内的像素用指定的颜 色进行填充后,就完成了该扫描线的填充工作,再继续下一条扫描 线。
4.2.2 扫描线填充算法
一般多边形的填充过程,对于一条扫描线,步骤为: 求交点:计算扫描线与多边形各边的交点(A、D、C、B) 交点排序:把所有交点按递增顺序进行排序(A、B、C、D) 交点配对:第一个交点与第二个交点,第三个交点与第四个交点等, 每对交点就代表扫描线与多边形的一个相交区间((A、B) (C、D)) 区间填色:把这些相交区间内的象素臵成多边形颜色,把相交区间外
B C A D
d a
b c
4.2.1 逐点判断算法
一、射线法
E
1
B F
2 3

射线f过顶点,若将交点计数为2,
则E在多边形内。

5 e f
A
4
•问题:当射线恰好通过多边形的顶点时,怎么判断?
4.2.1 逐点判断算法
一、射线法 措施:
在射线左边的边与该射线相交时交点有效,应计数;而在射
实质:进行多边形对平面上点的包含性检查
常用方法:
射线法 弧长法
4.2.1 逐点判断算法
1.射线法 •基本思想:
由被测点向某方向作射线,计算此射线与多边形所有边
的交点个数,用交点分布的奇偶性判别多边形与点的关系。
•判断依据:
若交点个数为奇数,则被测点在多边形内部;若交点个
数为偶数(包括0),则该点在多边形的外部。
4.2.2 扫描线填充算法
四、求交点的方法
为了求出扫描线与多边形边的交点,最简单的方法是将多边形 的所有边放在一个表中,称之为边表,在处理每条扫描线时,从表
中顺序取出所有的边,分别求这些边与扫描线的交点。这样做的结
果将做一些无益的求交点动作,因为扫描线并不一定与多边形的边 相交,扫描线只与部分甚至较少的边相交;因此,在进行扫描线与
解决方法:检查两相邻边在扫描线的哪一侧。
共享顶点的两条边分别落在扫描线两边,
取交点1次。 共享顶点的两条边均高于扫描线, 取交点2次。 共享顶点的两条边均低于扫描线, 取交点0次。
具体实现:只需要检查顶点的两条边的另外两个端点的y值,按这两个y值 中大于交点y值的个数是0、1、2来决定交点是取零个、一个、两个。
多边形边求交点时,应只求那些与扫描线相交的边的交点。我们把
与当前扫描线相交的边称为活性边,并把它们按与扫描线交点 x 坐标递增的顺序存放在一个链表中,称此链表为活性边表。
4.2.2 扫描线填充算法
四、求交点的方法
1.边表(ET)
边的分类表可以这样建立:先按下端点的纵坐标值对所有边作桶分
类,再将同一组中的边按下端点X坐标递增的顺序进行排序。
相关文档
最新文档