第四章二维填充与多边形扫描转化

合集下载

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

第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 扫描线填充算法

第四章 多边形填充

第四章  多边形填充
1.桶表和边表的表示法 (1)桶表是按照扫描线顺序管理边出现情况的一个数据 结构。首先,构造一个纵向扫描线链表,链表的长度为 多边形所占有的最大扫描线数,链表的每个结点称为桶 (bucket),对应多边形覆盖的每一条扫描线。
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值递增的顺序进行排序、 配对,以确定填充区间,最后用指定颜色填充区间内的 所有像素,即完成填充工作。有效边表填充算法已成为 目前最为有效的多边形填充算法之一。

CG04

CG04

9/73
4.3.1 逐点判断法

基本原理

判断绘图窗口内的像素是否位于多边形内,若是,则 用指定颜色绘制该像素 如何判断点在多边形的内外关系?
射线法

问题

(xmax, ymax)
累计角度法*
编码法*
P1 P2
(xmin, ymin)
10/73
4.3.1 点判断法

算法

假设判断点是否在多边形内的函数为IsInside()
如何识别多边形的凸凹性
方法1:观察多边形边的延长线是否划分顶点在两侧 方法2:向量的叉积 每条边建立一个向量,测试相邻边的叉积z坐标的正负 (1)如果叉积同号,那么是凸多边形 (2)如果叉积不同号,那么是凹多边形
(E1×E2 )z > 0 (E2×E3 )z > 0 (E3×E4 )z < 0 (E4×E5 )z > 0 (E5×E6 )z > 0 (E6×E1 )z > 0
11 7 5/4
11 12 11 12 8 7 -5 11
0^ 0^
12 0 ^
11 12 0 ^ 33/73
11 33/4 5/4
4.3.2 扫描线算法

思考问题


算法如何体现连贯性? 对凸多边形而言,算法是否可以简化?如何简化? 对三角形而言,算法如何简化?
三角形广泛应用于物体建模
30/73
4.3.2 扫描线算法

实例
(a) Y=6对应的活性边表 (b) Y=7对应的活性边表
31/73
4.3.2 扫描线算法

算法(Scan-Line Algorithm)
1、建立ET; 2、将扫描线纵坐标y的初值臵为ET中非空 元素的最小序号,如图中,y=1; 3、臵AEL为空; 4、执行下列步骤直至ET和AEL都为空. 4.1、如ET中的第y类非空,则将其中的所有 边取出并插入AEL中; 4.2、如果有新边插入AEL,则对AEL中各边排序; 4.3、对AEL中的边两两配对,(1和2为一对,3和4为一对,…), 将每对边中x坐标按规则取整,获得有效的填充区段,再填充. 4.4、将当前扫描线纵坐标 y 值递增1; 4.5、将AEL中满足y = ymax边删去(因为每条边被看作下闭上开 的); 4.6、对AEL中剩下的每一条边的x递增deltax,即x = x+deltax.

计算机图形学——多边形的扫描转换(基本光栅图形算法)

计算机图形学——多边形的扫描转换(基本光栅图形算法)

计算机图形学——多边形的扫描转换(基本光栅图形算法)⼀、多边形扫描转换在光栅图形中,区域是由【相连的】像素组成的集合,这些像素具有【相同的】属性值或者它们位于某边界线的内部1、光栅图形的⼀个基本问题是把多边形的顶点表⽰转换为点阵表⽰。

这种转换成为多边形的扫描转换。

2、多边形的扫描转换与区域填充问题是怎样在离散的像素集上表⽰⼀个连续的⼆维图形。

3、多边形有两种重要的表⽰⽅法:(1)顶点表⽰:⽤多边形的定点序列来表⽰多边形优点:直观、⼏何意义强、占内存少、易于进⾏⼏何变换缺点:没有明确指出那些象素在多边形内,故不能直接⽤于上⾊(2)点阵表⽰:是⽤位于多边形内的象素集合来刻画多边形缺点:丢失了许多⼏何信息(eg:边界、顶点等)但是【点阵表⽰是光栅显⽰系统显⽰时所需的表现形式。

】多边形的扫描转换就是把多边形的顶点表⽰转换为点阵表⽰,即从多边形的给定边界出发,求出位于其内部的各个像素,并将帧缓冲器内的各个对应元素设置相应的灰度或颜⾊。

实际上就是多边形内的区域的着⾊过程。

4、多边形分类⼆、X扫描线算法X扫描线算法填充多边形的基本思想是按扫描线顺序,计算扫描线与多边形的相交区间,再⽤要求的颜⾊显⽰这些区间的象素,即完成填充⼯作。

区间的端点可以通过计算扫描线与多边形边界线的交点获得。

如扫描线y=3与多边形的边界相交于4点(2,3)、(4,3)、(7,3)、(9,3)这四个点定义了扫描线从x=2到x=4,从x=7到x=9两个落在多边形内的区间,该区间内像素应取填充⾊。

算法的核⼼是按x递增顺序排列交点的x坐标序列。

由此可得到扫描线算法步骤如下:算法步骤:1.确定多边形所占有的最⼤扫描线数,得到多边形定点的最⼩最⼤值(y min和y max);2.从y min到ymax每次⽤⼀条扫描线进⾏填充;3.对⼀条扫描线填充的过程分为四个步骤:a)求交点;b)把所有交点按递增顺序排序;c)交点配对(第⼀个和第⼆个,第三个和第四个);d)区间填⾊。

计算机图形学5多边形扫描转换和区域填充

计算机图形学5多边形扫描转换和区域填充
多边形的扫描转换与区域填充
可编辑ppt
1
一、多边形的扫描转换
前面讲的画直线是一维图形的光栅化,就是如何在计算机 屏幕上即在一个离散的像素集上表示一个连续的图形。而多 边形的扫描转换和区域填充这个问题是怎么样在离散的像素 集上表示一个连续的二维图形。
多边形有两种重要的表示方法:顶点表示和点阵表示。
P2
当扫描线与多边形顶点相 交时,会出现异常情况。
解决方案: (1)、若共享顶点的两条 边分别落在扫描线的两边, 交点只算一个;
y
12 11 10
9 8 7 6 5 4 3 2 1
1 2 3 4 5 6 7 8 9 10 11 12 x
与多边形顶点相交的交点的处理
(2)若共享顶点的两条边在扫描线的同一边,这 时交点作为零个或两个。
凸多边形 凹多边形 含内环的多边形
有关概念
1) 区域:一组相邻而且又相连的像素,而且具有 相同属性的封闭区域。 2)种类:①单域 ②复合域
3) 区域填充:以某种属性对整个区域进行设置的过
程。
可编辑ppt
6
逐点判断填充算法
区域填充的基本(初级)方法:逐点判断填充算法
逐点判断绘图窗口内的每一个像素; 若在区域的内部:用指定的属性设置该点; 否则不予处理;
光栅图形的一个基本问题是把多边形的顶点表示转换为点阵 表示。这种转换称为多边形的扫描转换。
为什么叫扫描转换?因为光栅显示器是逐行扫描!
区域填充:指先将区域的一点赋予指定的颜色,然后将该颜 色扩展到整个区域的过程。
可编辑ppt
4
多边形分为凸多边形、凹多边形、含内环的多边 形等: (1)凸多边形 任意两顶点间的连线均在多边形内。 (2)凹多边形 任意两顶点间的连线有不在多边形内的部分。

第四章多边形的转换

第四章多边形的转换

数据结构与实现步骤

如何计算下一条扫描线与边的交点。
直线方程:ax+by+c = 0 当前交点坐标:(xi, yi) 下一交点坐标:(xi+1,yi+1) xi+1= ((-byi+1)-c)/a = ((-byi+1)-c)/a =xi-b/a=xi+1/mi 活动边表中需要存放的信息: x:当前扫描线与边的交点 dx=-b/a:从当前扫描线到下一条扫描线之间的x增量 ymax:边所交的最高扫描线
数据结构与实现步骤
所有的边和扫描线求交,效率很低。因为一条扫 描线往往只和少数几条边相交。 如何判断多边形的一条边与扫描线是否相交? 与当前扫描线相交的边称为活性边(active edge),把它们按与扫描线交点x坐标递增的顺 序存入一个链表中,边的活化链表 ( AEL, Active edge table)。它记录了多边形边沿扫 描线的交点序列。 只需对当前扫描线的活动边表作更新,即可得到 下一条扫描线的活动边表。
扫描线的连贯性
1)设L是偶数。 2)在该扫描线上,只有区段 (xeik,xeik+1),k=1,3,5,…,L-1位于多边形P内, 其余区段都在P外。 以上性质称为扫描线的连贯性,它是多边形 区域连贯性在一条扫描线上的反映。
边的连贯性
设d为一整数,并且d=e-1,并且 yi0≥d≥yin。设位于 扫描线y=d上的交点序列为xdj1,xdj2,xdj3,…,xdjk 现在来讨论扫描线d,e交点序列之间的关系。若多 边形P的边Pr-1Pr与扫描线y=e,y=d都相交,则交点序列 中对应元素xer,xdr满足下列关系: xer= xdr + 1/mr (1) 其中mr为边Pr-1Pr的斜率。

多边形扫描转换与区域填充技巧

多边形扫描转换与区域填充技巧

Rotational method: Align each edge with the x axis
2020/11/22
多边形的扫描转换和区域填充技巧
11
多边形扫描转换
逐点判断算法 扫描线填充算法 边缘填充算法
2020/11/22
多边形的扫描转换和区域填充技巧
12
逐点判断算法
实现扫描转换多边形最简单的算法是逐 点判断,即判断一个像素是否在多边形 内部,是则填充颜色,否则放弃
ymax
2020/11/22
ymin xmin
多边形的扫描转换和区域填充技巧
xmax
6
ymax
ymin 如何完成填充
的?? xmin
xmax
如何实现算法??
ymax
填充前 填充后
2020/11/22
ymin xmin
多边形的扫描转换和区域填充技巧
xmax
7
矩形扫描转换算法
FillRect(Rect *rect, int color) { int x,y; for (y=rect->ymin;y<=rect->ymax,y++)
第5章
2020/11/22
多边形的扫描转换和区域填充技巧
提出问题
上一章讲述了如何生成点、线和圆等 基本几何构造。
本章重点如何在指定的输出设备上构 造多边形域、像素数组等高级图元
2020/11/22
多边形的扫描转换和区域填充技巧
2
主要内容 主要内容
矩形填充 内外测试 多边形扫描转换 区域填充 多边形扫描转换与区域填充的区别 反走样
2020/11/22
多边形的扫描转换和区域填充技巧

图形学CG第4章扫描转换分析

图形学CG第4章扫描转换分析
进行区域填充时,有时需要用一种图案来填充平面区域。
基本思想是:
首先用模板定义各种图案;然后,修改填充的扫描转换算
法,即在确定了区域内一个象素之后,不是马上往该象素填
色,而是先查询模板位图的对应位置,若对应位置有图案的
象素,即图案的对应位置为1时,填充颜色,否则,不改变
2021/6/4 该象素的值。
36
算法要求: 区域是连通的。一个封闭区域确定以后,填充要解决的 问题是如何确定填充的象素以及如何高效地填充。
2021/6/4
25
1. 区域的表示
区域表示方法:内点表示和边界表示。
内点表示:枚举出区域内部的所有象素,内部的所 有象素着同一个颜色,边界象素着与内部象素不 同的颜色。
边界表示:枚举出边界上所有的象素,边界上的所
2021/6/4
14
数据结构: 边表(Edge Table, ET): (1)按下端点的纵坐标(y)对所有边作桶分类. (2)再按与扫描线交点x坐标递增的顺序存放在一个链
表中,此链表称为有效边表。 有效边表的每个结点: x,ymax,1/k,next x:边的下端点的x坐标,ymax:边的上端点的y坐标 k:边的斜率, next:指向下一条边的指针.
2021/6/4
18
解决顶点交点计为1时的情形:
扫描线y+1 扫描线y 扫描线y-1
(a)原图
(b)缩短ymax的边 (c)缩短ymin的边
图5-28 将多边形的某些边缩短以分离那些应 计为1个交点的顶点
2021/6/4
19
2021/6/4
y
12
p1
11
10
9
p0
p6
8
7
p2
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

着色的平面 多边形
线框多边形物体
填充多边形物体
5.1多边形的扫描转换
5.1.1概念 多边形分为凸多边形、凹多边形、含内
环的多边形。
• 多边形的表示方法 –顶点表示
–点阵表示
• 顶点表示:用多边形顶点的序列来刻划多 边形。 优点:直观、几何意义强、占内存少; 缺点:难以判断哪些像素位于多边形内部, 不能直接用于面着色。
y=yik y=yik+1
算法步骤:
(1)确定多边形所占有的最大扫描线数。即得 到多边形顶点的最小和最大y值。(Ymin和 Ymax)
(2)从y=ymin到y=ymax:每次用一条扫描线填充。 (3)填充步骤: • 求交:计算扫描线与多边形各边的交点。 • 排序:所有交点按递增的顺序排序。 • 交点配对:第一个与第二个,第三个与第四
•假定非水平边与扫描线y=e 相交,交点的横坐标为x, 规则如下
●规则1: X为小数,即交点落于扫描线上两个相邻 像素之间 (a)交点位于左边之上,向右取整 (b)交点位于右边之上,向左取整
●规则2:
边界上象素的取舍问题,避免填充扩大 化。
●解决方法:
边界象素:规定落在右上边界的象素 不予填充。
P3 P4 6 3 -2
AET指针 扫描线2
P3 P4 4 3 -2
AET指针 扫描线3
P4 P5 260
(x, ymax,Δx, next)
P3 P2 6 5 0.5 ^
P3 P2 6.5 5 0.5 ^
P3 P2 7 5 0.5 ^
活动边表的例子
AET指针 扫描线4
AET指针 扫描线5
AET指针 扫描线6
第五章 多边形的扫描转换 与区域填充
教学内容: 1、多边形扫描转换:
通过确定穿越区域的扫描线的覆 盖去件来填充。 2、区域填充:
是从给定的位置开始涂描直到指 定的边界条件为止。
• 关于光栅图形
– 本质:点阵表示 – 特点:面着色,画面明暗自然、色彩丰富 – 与线框图相比:更加生动、直观、真实感强
线框平面多 边形
二、改进的有效边表算法(Y-连贯性算法)
(1)有效边(Active Edge):与该扫描线 相关的多边形的边。
Pi+1 Pi
边的相关性: 扫描线Yi+1 若pi(xi,yi),则有 扫描线Yi pi+1(xi+1,yi+1),其中
xi+1=xi+1/k,yi+1=yi+1
两边的相关性为每条边建立一个边记录, 其结点内容为:
在ET表中:
•与X轴平行的边不计入 •顶点:如前法则相同。
(3)有效边表(活动边表):AET(Active Edge Table)
将有效边按与扫描线交点x坐标递增的顺序 存放在一个链表中,称此链表为AET。
结点内容为:
X
ymax 1/k
next
其中x为当前扫描线与边的交点
活动边表的例子
AET指针 扫描线1
P4 P5 26 0
P4 P5 260
P5 P1 274
P3 P2 7.5 5 0.5 ^
P2 P1 8 7 -1 ^
P2 P1 8 7 -1 ^
(4)算法实现步骤
这样,当建立了边的分类表ET后,扫描线算法可 按下列步骤进行: (1)取扫描线纵坐标y的初始值为ET中非空 元素的最小序号。 (2)将边的活化链表AEL设置为空。 (3)按从下到上的顺序对纵坐标值为y的扫 描线(当前扫描线)执行下列步骤,直到边的 分类表ET和边的活化链表都变成空为止。
具体实现时,只要对扫描线与多边形的 相交区间左闭右开
●规则3:
扫描线与多边形的顶点相交时,交点的取舍, 保证交点正确配对。
●解决方法:
检查两相邻边在扫描线的哪一侧。
只要检查顶点的两条边的另外两个端点的 Y值,两个Y值中大于交法 基本思想:按扫描线顺序,计算扫描线与 多边形的相交区间(像素),再用相应的 颜色(或图案)显示这些像素。
–两种方法:扫描线算法;边界标 志法。
多边形的顶 点表示
多边形的点 阵表示
5.1.2 扫描线算法
• 扫描线算法 –目标:利用相邻像素之间的连贯性, 提高算法效率 –处理对象:非自交多边形 (边与边 之间除了顶点外无其它交点)
–交点的取整规则 •要求:使生成的像素全部位于多边 形之内 –用于线画图元扫描转换的四舍五 入原则导致部分像素位于多边形 之外,从而不可用
C)将边的活化链表AEL中满足y=ymax的边删去。 D)将边的活化链表AEL剩下的每一条边的x域累
X|ymin
ymax 1/k
next
(2)边表(ET:Edge Table):是一个包含 多边形全部边记录的表。
边表
^
P5 P1
274 ^
P2 P1 8 7 -1 ^
^
P4 P5
26 0 ^
^
P3 P4
P3 P2
6 3 -2
6 5 0.5 ^
•纵向链表的构造:长度为最大扫描线数。 •将相关边(该扫描线)的记录接点链入。 •一个结点(纵向链)有多个相关边时,按x|ymin 由小到大的顺序;如果x|ymin相等,则按1/k由 小到大的顺序。
A)如边分类表ET中的第y类元素非空,则将属 于该类的所有边从ET中取出并插入边的活化 链表中,AEL中的各边按照x值(当x值相等时, 按Δx值)递增方向排序。
B)若相对于当前扫描线,边的活化链表AEL非 空,则将AEL中的边两两依次配对,即1,2边 为一对,3,4边为一对,依次类推。每一对 边与当前扫描线的交点所构成的区段位于多 边形内,依次对这些区段上的点(象素)按 多边形属性着色。
个等,每对交点代表扫描线与多边行的一个 相交区间。 • 区间填色:把这些相交区间内的像素置成不 同于背景的填充色。
存在的问题:
当扫描线与多边形顶点相交时,交点 的取舍问题.
解决的方法:
• 共享顶点的两条边分别落在扫描线 的两边,则交点只算一个.
• 共享顶点的两条边在扫描线的一侧, 则交点算0或者2个.
点阵表示:用位于多边形内的象素的集 合来刻划多边形。
缺点:失去了许多重要的几何信息;
优点:便于运用帧缓冲存储器表示图形, 易于面着色。
–多边形的扫描转换:
把多边形的顶点表示转换为点 阵表示,也就是从多边形的给定 边界出发,求出位于其内部的各 个象素,并给帧缓冲器内的各个 对应元素设置相应的灰度和颜色, 通常称这种转换为多边形的扫描 转换。
相关文档
最新文档