计算机图形学第7讲
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
信息科学与工程学院 12
解决:
当扫描线与多边形的顶点相交时,
•
若共享顶点的两条边分别落在扫描线的两边,交点 只算一个;
•
若共享顶点的两条边在扫描线的同一边,这时交点 作为零个或两个。
具体解决方法为:
检查共享顶点的两条边的另外两个端点的y值,按这两个y 值中大于交点y值的个数是0、1、2来决定交点数取0、1、2。
在光栅扫描显示器中表示一个区域,仅仅画出其边界
是不够的,有时还要填上一定的灰度、色彩。
多边形的扫描转换主要是通过确定穿越多边形区域
的扫描线的覆盖区间来填充。/适用于多边形区域和
多边形拟合的其他简单曲线区域。 区域填充是从给定的位置开始涂描直到指定的边界 条件为止。/适用于复杂边界的多边形以及交互式绘 图系统中。
p0 p2 p4
p6
p3 p5 1 2 3 4 5 6 7 8 9 10 11 12
x
(a)
2013-6-21
多边形P0P1P2P3P4P5P6P0
信息科学与工程学院 22
1 2 3 4 5 6 7 8 9 10 11 12
3
p3p2 6 -1/3
3
p3p4 5 3/4
8
p5p4 5 -1/2
8
p5p6 9 1/2
1 xi,yi 1/k xi+1,yi+1
图5-26 与多边形边界相交的两条 连续扫描线交点的相关性
2013-6-21 信息科学与工程学院 15
有效边(Active Edge):指与当前扫描线相交的多边形 的边,也称为活性边。 有效边表(Active Edge Table, AET):把有效边按与扫 描线交点x坐标递增的顺序存放在一个链表中,此链表 称为有效边表。 有效边表的每个结点: x ymax 1/k next
b. 排序:把所有交点按x值递增顺序排序; c. 配对:第一个与第二个,第三个与第四个等等;每对交点代 表扫描线与多边形的一个相交区间; d. 填色:把相交区间内的像素置成多边形颜色,把相交区间外
的像素置成背景色。
2013-6-21 信息科学与工程学院 10
对下图,试想扫描转换过程?
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
③ 含内环的多边形
2013-6-21
信息源自文库学与工程学院
8
x-扫描线算法原理:
对于每条穿越多边形的
扫描线,此算法确定扫描
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
线与多边形相交区间的像
素点位置。 如:y=3 算法的核心: 必须按x递增顺序排列交点 的x的坐标序列。
2013-6-21 信息科学与工程学院 13
0
1
1
1
0 2 2 2
1
图5-25
与扫描线相交的多边形顶点的交点数
填充过程实例
2013-6-21 信息科学与工程学院 14
3. 改进的有效边表算法(Y连贯性算法) 改进原理: • 处理一条扫描线时,仅对有效 边求交 • 利用扫描线的连贯性 • 利用多边形边的连贯性
x|ymin 1 7 p2p1 12 2/5 12 -1 p0p1 桶
ymax 1/k next
7
9 p0p6
5
(c)
边表
2013-6-21
信息科学与工程学院
23
算法步骤:
(1)初始化:构造边表,AET表置空; (2)将第一个不空的ET表中的边与AET表合并; (3)由AET表中取出交点对进行填充。 填充时设一布尔变量b(初值为假),令指针从AET中 第一个结点到最后一个结点遍历一次,每访问一个结点, 把b取反一次,若b为真,则把从当前结点的x值到下一 结点的x值结束的区间用多边形色填充。填充之后删除 y=ymax的边。(期间,x=round(x) ) ( 4)yi+1=yi+1,根据xi+1=xi+1/k计算并修改AET表,同时合并 若将步骤(3)改为先删除y=ymax的 ET表中y=yi+1 桶中的边,按次序插入到AET表中,形成 新的AET表; 边再填充,则是按照“下闭上开”的 (5)AET表不为空则转(3),否则结束。
9 P5P6
5
(a)
多边形P0P1P2P3P4P5P6P0
11.5 9
1/2
2013-6-21
信息科学与工程学院
17
有效边表的结点类型可为: typedef struct LineAE { float x; float dx; int ymax; /*有效边描述结构*/
/*当前扫描线与边的交点 */ /*斜率的倒数*/ /*边所在的最大扫描线值*/
} }
2013-6-21 信息科学与工程学院 25
5.4.2
边缘填充算法
边缘填充算法基本思想 按任意顺序处理多边形的每条边。在处理每条边时,首先 求出该边与扫描线的交点,然后将每一条扫描线上交点 右方的所有像素取补。
2013-6-21
信息科学与工程学院
26
边缘填充算法最适用于具有帧缓存的图形系统, 算法简单,但对于复杂图型,每一像素可能被 访问多次,输入输出的量比有效边表算法大得 多。 栅栏填充算法 栅栏指的是一条过多边形顶点且与扫描线垂直的 直线。它把多边形分为两半。 基本思想:按任意顺序处理多边形的每条边,但 在处理每条边与扫描线的交点时,将交点与栅 栏之间的像素取补。
第 七 讲
2013-6-21
信息科学与工程学院
1
本节内容安排
上节回顾 5.4 多边形的扫描转换与区域填充(部分) 小结、作业
2013-6-21
信息科学与工程学院
2
上节回顾
直线的扫描转换 圆的扫描转换
椭圆的扫描转换
2013-6-21
信息科学与工程学院
3
5.4 多边形的扫描转换与区域填充
2013-6-21
原则进行填充,就不必再缩短任何边 信息科学与工程学院
24
算法描述为: (参考)
void polyfill (多边形 polygon, int color) { for (各条扫描线i )
{ 初始化新边表头指针NET [i]; y = 最低扫描线号; 初始化活性边表AET为空; for (各条扫描线i )
x为当前扫描线与边的交点 ymax为边所在的最大扫描线值 1/k为从当前扫描线到下一条扫描线间x的增量
2013-6-21 信息科学与工程学院 16
y 12 11 10 9 8 7 6 5 4 3 2 1 p1
y=8
P2P1
1.4 12 2/5
p0 p2 p4
p6
P0P1
7 12 -1
P0P6 7
p3 p5 1 2 3 4 5 6 7 8 9 10 11 12 x
相等,则按照1/k由小到大排序。
2013-6-21
信息科学与工程学院
20
解决顶点交点计为1时的情形:
扫描线y+1 扫描线y 扫描线y-1
(a)原图
(b)缩短ymax 的边
(c)缩短ymin 的边
图5-28
将多边形的某些边缩短以分离那些应 计为1个交点的顶点
2013-6-21
信息科学与工程学院
21
y 12 11 10 9 8 7 6 5 4 3 2 1 p1
2013-6-21 信息科学与工程学院 4
5.4.1 多边形的扫描转换
1. 什么是多边形的扫描转换 多边形的两种表示方法:
顶点表示:用多边形的顶点序列来刻划多边形。直观、几
何意义强、占内存少;不能直接用于面着色。
点阵表示是用位于多边形内的像素的集合来刻划多边形。
失去了许多重要的几何信息;便于运用帧缓冲存储器表示图形, 易于面着色。
2013-6-21 信息科学与工程学院 27
观看演示
尽管栅栏填充算法减少了被重复访问像素的数目,但仍 有一些像素会被重复访问。为了改进该方法,可采用 先画边界后填色的方法——边标志算法。
2013-6-21 信息科学与工程学院 28
小结
X-扫描线算法 多边形的扫描转换
改进的有效边表算法
边缘填充算法
图5-23
2013-6-21 信息科学与工程学院
x-扫描线算法填充多边形
9
算法步骤: (1)确定多边形所占有的最大扫描线数,得到多边形顶 点的最小和最大y值(ymin和ymax)。
(2)从y=ymin到y=ymax,每次用一条扫描线进行填充。对
一条扫描线填充的过程可分为四个步骤:
a. 求交:计算扫描线与多边形各边的交点;
基本思想:
按扫描线顺序,计算扫描线与多边形的相交区间,再用要求的
颜色显示这些区间的像素,完成填充工作。
根据该原理,此算法可以填充凸的、凹的、带孔的多边形域。
2013-6-21
信息科学与工程学院
7
多边形分为凸多边形、凹多边形、含内环的多边形。
① 凸多边形:任意两顶点间的连线均在多边形
② 凹多边形任意两顶点间的连线有不在多边内形内的部分
就放在相应的扫描线桶中。
2013-6-21
信息科学与工程学院
19
(3)每条边的数据形成一个结点,内容包括:该扫描线 与该边的初始交点x(即较低端点的x值),1/k,以
及该边的最大y值ymax。
x|ymin ymax 1/k next
(4)同一桶中若干条边按x|ymin 由小到大排序,若x|ymin
把ymin = i 的边放进边表NET [i];
}
{ 把新边表NET[i]中的边结点用插入排序法插入AET表,使之按x坐标递增顺 序排列; 若允许多边形的边自相交,则用冒泡排序法对AET表重新排序;
遍历AET表,把ymax= i 的结点从AET表中删除,并把ymax> i结点的x值递增Dx;
遍历AET表,把配对交点区间(左闭右开)上的像素(x, y),用putpixel (x, y, color) 改写像素颜色值;
2013-6-21
信息科学与工程学院
29
2013-6-21
信息科学与工程学院
30
图5-24
2013-6-21
与多边形顶点相交的交点的处理
信息科学与工程学院 11
存在问题:当扫描线与多边形顶点相交时,交点
的取舍问题。
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
图5-24
2013-6-21
与多边形顶点相交的交点的处理
P0 P1 P5 P4 P3
2013-6-21 信息科学与工程学院 5
P2
扫描转换多边形或多边形的填充:从多边形顶 点表示到点阵表示的转换。 也就是从多边形的给定边界出发,求出位于其 内部的各个像素,并给帧缓冲器内的各个对应 元素设置相应的灰度和颜色
2013-6-21
信息科学与工程学院
6
2. x-扫描线算法
struct LineAE *next; /*指向下一条有效边*/ }ActiveEdge;
2013-6-21
信息科学与工程学院
18
边表(Edge Table)——方便有效边的建立和更新 边表的构造: (1)首先构造一个纵向链表,链表的长度为多边形所占有 的最大扫描线数,链表的每个结点,称为一个桶,其 对应多边形覆盖的每一条扫描线。 (2)将每条边的信息链入与该边最小y坐标(ymin )相对应 的桶处。也就是说,若某边的较低端点为ymin,则该边
解决:
当扫描线与多边形的顶点相交时,
•
若共享顶点的两条边分别落在扫描线的两边,交点 只算一个;
•
若共享顶点的两条边在扫描线的同一边,这时交点 作为零个或两个。
具体解决方法为:
检查共享顶点的两条边的另外两个端点的y值,按这两个y 值中大于交点y值的个数是0、1、2来决定交点数取0、1、2。
在光栅扫描显示器中表示一个区域,仅仅画出其边界
是不够的,有时还要填上一定的灰度、色彩。
多边形的扫描转换主要是通过确定穿越多边形区域
的扫描线的覆盖区间来填充。/适用于多边形区域和
多边形拟合的其他简单曲线区域。 区域填充是从给定的位置开始涂描直到指定的边界 条件为止。/适用于复杂边界的多边形以及交互式绘 图系统中。
p0 p2 p4
p6
p3 p5 1 2 3 4 5 6 7 8 9 10 11 12
x
(a)
2013-6-21
多边形P0P1P2P3P4P5P6P0
信息科学与工程学院 22
1 2 3 4 5 6 7 8 9 10 11 12
3
p3p2 6 -1/3
3
p3p4 5 3/4
8
p5p4 5 -1/2
8
p5p6 9 1/2
1 xi,yi 1/k xi+1,yi+1
图5-26 与多边形边界相交的两条 连续扫描线交点的相关性
2013-6-21 信息科学与工程学院 15
有效边(Active Edge):指与当前扫描线相交的多边形 的边,也称为活性边。 有效边表(Active Edge Table, AET):把有效边按与扫 描线交点x坐标递增的顺序存放在一个链表中,此链表 称为有效边表。 有效边表的每个结点: x ymax 1/k next
b. 排序:把所有交点按x值递增顺序排序; c. 配对:第一个与第二个,第三个与第四个等等;每对交点代 表扫描线与多边形的一个相交区间; d. 填色:把相交区间内的像素置成多边形颜色,把相交区间外
的像素置成背景色。
2013-6-21 信息科学与工程学院 10
对下图,试想扫描转换过程?
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
③ 含内环的多边形
2013-6-21
信息源自文库学与工程学院
8
x-扫描线算法原理:
对于每条穿越多边形的
扫描线,此算法确定扫描
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
线与多边形相交区间的像
素点位置。 如:y=3 算法的核心: 必须按x递增顺序排列交点 的x的坐标序列。
2013-6-21 信息科学与工程学院 13
0
1
1
1
0 2 2 2
1
图5-25
与扫描线相交的多边形顶点的交点数
填充过程实例
2013-6-21 信息科学与工程学院 14
3. 改进的有效边表算法(Y连贯性算法) 改进原理: • 处理一条扫描线时,仅对有效 边求交 • 利用扫描线的连贯性 • 利用多边形边的连贯性
x|ymin 1 7 p2p1 12 2/5 12 -1 p0p1 桶
ymax 1/k next
7
9 p0p6
5
(c)
边表
2013-6-21
信息科学与工程学院
23
算法步骤:
(1)初始化:构造边表,AET表置空; (2)将第一个不空的ET表中的边与AET表合并; (3)由AET表中取出交点对进行填充。 填充时设一布尔变量b(初值为假),令指针从AET中 第一个结点到最后一个结点遍历一次,每访问一个结点, 把b取反一次,若b为真,则把从当前结点的x值到下一 结点的x值结束的区间用多边形色填充。填充之后删除 y=ymax的边。(期间,x=round(x) ) ( 4)yi+1=yi+1,根据xi+1=xi+1/k计算并修改AET表,同时合并 若将步骤(3)改为先删除y=ymax的 ET表中y=yi+1 桶中的边,按次序插入到AET表中,形成 新的AET表; 边再填充,则是按照“下闭上开”的 (5)AET表不为空则转(3),否则结束。
9 P5P6
5
(a)
多边形P0P1P2P3P4P5P6P0
11.5 9
1/2
2013-6-21
信息科学与工程学院
17
有效边表的结点类型可为: typedef struct LineAE { float x; float dx; int ymax; /*有效边描述结构*/
/*当前扫描线与边的交点 */ /*斜率的倒数*/ /*边所在的最大扫描线值*/
} }
2013-6-21 信息科学与工程学院 25
5.4.2
边缘填充算法
边缘填充算法基本思想 按任意顺序处理多边形的每条边。在处理每条边时,首先 求出该边与扫描线的交点,然后将每一条扫描线上交点 右方的所有像素取补。
2013-6-21
信息科学与工程学院
26
边缘填充算法最适用于具有帧缓存的图形系统, 算法简单,但对于复杂图型,每一像素可能被 访问多次,输入输出的量比有效边表算法大得 多。 栅栏填充算法 栅栏指的是一条过多边形顶点且与扫描线垂直的 直线。它把多边形分为两半。 基本思想:按任意顺序处理多边形的每条边,但 在处理每条边与扫描线的交点时,将交点与栅 栏之间的像素取补。
第 七 讲
2013-6-21
信息科学与工程学院
1
本节内容安排
上节回顾 5.4 多边形的扫描转换与区域填充(部分) 小结、作业
2013-6-21
信息科学与工程学院
2
上节回顾
直线的扫描转换 圆的扫描转换
椭圆的扫描转换
2013-6-21
信息科学与工程学院
3
5.4 多边形的扫描转换与区域填充
2013-6-21
原则进行填充,就不必再缩短任何边 信息科学与工程学院
24
算法描述为: (参考)
void polyfill (多边形 polygon, int color) { for (各条扫描线i )
{ 初始化新边表头指针NET [i]; y = 最低扫描线号; 初始化活性边表AET为空; for (各条扫描线i )
x为当前扫描线与边的交点 ymax为边所在的最大扫描线值 1/k为从当前扫描线到下一条扫描线间x的增量
2013-6-21 信息科学与工程学院 16
y 12 11 10 9 8 7 6 5 4 3 2 1 p1
y=8
P2P1
1.4 12 2/5
p0 p2 p4
p6
P0P1
7 12 -1
P0P6 7
p3 p5 1 2 3 4 5 6 7 8 9 10 11 12 x
相等,则按照1/k由小到大排序。
2013-6-21
信息科学与工程学院
20
解决顶点交点计为1时的情形:
扫描线y+1 扫描线y 扫描线y-1
(a)原图
(b)缩短ymax 的边
(c)缩短ymin 的边
图5-28
将多边形的某些边缩短以分离那些应 计为1个交点的顶点
2013-6-21
信息科学与工程学院
21
y 12 11 10 9 8 7 6 5 4 3 2 1 p1
2013-6-21 信息科学与工程学院 4
5.4.1 多边形的扫描转换
1. 什么是多边形的扫描转换 多边形的两种表示方法:
顶点表示:用多边形的顶点序列来刻划多边形。直观、几
何意义强、占内存少;不能直接用于面着色。
点阵表示是用位于多边形内的像素的集合来刻划多边形。
失去了许多重要的几何信息;便于运用帧缓冲存储器表示图形, 易于面着色。
2013-6-21 信息科学与工程学院 27
观看演示
尽管栅栏填充算法减少了被重复访问像素的数目,但仍 有一些像素会被重复访问。为了改进该方法,可采用 先画边界后填色的方法——边标志算法。
2013-6-21 信息科学与工程学院 28
小结
X-扫描线算法 多边形的扫描转换
改进的有效边表算法
边缘填充算法
图5-23
2013-6-21 信息科学与工程学院
x-扫描线算法填充多边形
9
算法步骤: (1)确定多边形所占有的最大扫描线数,得到多边形顶 点的最小和最大y值(ymin和ymax)。
(2)从y=ymin到y=ymax,每次用一条扫描线进行填充。对
一条扫描线填充的过程可分为四个步骤:
a. 求交:计算扫描线与多边形各边的交点;
基本思想:
按扫描线顺序,计算扫描线与多边形的相交区间,再用要求的
颜色显示这些区间的像素,完成填充工作。
根据该原理,此算法可以填充凸的、凹的、带孔的多边形域。
2013-6-21
信息科学与工程学院
7
多边形分为凸多边形、凹多边形、含内环的多边形。
① 凸多边形:任意两顶点间的连线均在多边形
② 凹多边形任意两顶点间的连线有不在多边内形内的部分
就放在相应的扫描线桶中。
2013-6-21
信息科学与工程学院
19
(3)每条边的数据形成一个结点,内容包括:该扫描线 与该边的初始交点x(即较低端点的x值),1/k,以
及该边的最大y值ymax。
x|ymin ymax 1/k next
(4)同一桶中若干条边按x|ymin 由小到大排序,若x|ymin
把ymin = i 的边放进边表NET [i];
}
{ 把新边表NET[i]中的边结点用插入排序法插入AET表,使之按x坐标递增顺 序排列; 若允许多边形的边自相交,则用冒泡排序法对AET表重新排序;
遍历AET表,把ymax= i 的结点从AET表中删除,并把ymax> i结点的x值递增Dx;
遍历AET表,把配对交点区间(左闭右开)上的像素(x, y),用putpixel (x, y, color) 改写像素颜色值;
2013-6-21
信息科学与工程学院
29
2013-6-21
信息科学与工程学院
30
图5-24
2013-6-21
与多边形顶点相交的交点的处理
信息科学与工程学院 11
存在问题:当扫描线与多边形顶点相交时,交点
的取舍问题。
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
图5-24
2013-6-21
与多边形顶点相交的交点的处理
P0 P1 P5 P4 P3
2013-6-21 信息科学与工程学院 5
P2
扫描转换多边形或多边形的填充:从多边形顶 点表示到点阵表示的转换。 也就是从多边形的给定边界出发,求出位于其 内部的各个像素,并给帧缓冲器内的各个对应 元素设置相应的灰度和颜色
2013-6-21
信息科学与工程学院
6
2. x-扫描线算法
struct LineAE *next; /*指向下一条有效边*/ }ActiveEdge;
2013-6-21
信息科学与工程学院
18
边表(Edge Table)——方便有效边的建立和更新 边表的构造: (1)首先构造一个纵向链表,链表的长度为多边形所占有 的最大扫描线数,链表的每个结点,称为一个桶,其 对应多边形覆盖的每一条扫描线。 (2)将每条边的信息链入与该边最小y坐标(ymin )相对应 的桶处。也就是说,若某边的较低端点为ymin,则该边