扫描线算法
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
© 2004 Dept. of Computer Science and Engineer 2018/11/22 23 / 56
多边形的扫描转换:扫描线算法:
•边表(Edge Table)的构造(2/2): •(3)每条边的数据形成一个结点,内容包括:该 扫描线与该边的初始交点x(即较低端点的x值), 1/k,以及该边的最大y值ymax。 x|ymin ymax 1/k NEXT •(4)同一桶中若干条边按X|ymin由小到大排序, 若X| ymin相等,则按照1/k由小到大排序。
© 2004 Dept. of Computer Science and Engineer
2018/11/22
21 / 56
多边形的扫描转换:扫描线算法:
•计算扫描线与多边形各边的交 点:最简单的方法: •将多边形的所有边放在一个 表中; •缺点:效率低 •改进的有效边表算法(Y连贯性 算法) •改进原理: •处理一条扫描线时,仅对有 效边求交;wk.baidu.com•利用扫描线的连贯性; •利用多边形边的连贯性;
© 2004 Dept. of Computer Science and Engineer
2018/11/22
11 / 56
多边形的扫描转换:扫描线算法:
扫描线算法:
-
目标:利用相邻像素之间的连贯性,提高算法效率; 处理对象:非自交多边形 (边与边之间除了顶点外无其它交点);
© 2004 Dept. of Computer Science and Engineer
© 2004 Dept. of Computer Science and Engineer 2018/11/22 8 / 56
多边形的扫描转换
逐点判断法
•2)累计角度法 步骤: 从v点向多边形P顶点发出 射线,形成有向角; 计算有相交的和,得出结论;
0,v位于P之外 i i 0 2 , v位于P之内
2018/11/22
2 / 56
区域填充
区域:点阵表示的图形,像素集合; 表示方法:内点表示、边界表示: - 内点表示:-》区域填充算法 枚举处区域内部的所有像素; 内部的所有像素填充同一个颜色; 边界像素填充与内部像素不同的颜色; - 边界表示:枚举出边界上所有的像素-》边界填充算法; 边界上的所有像素填充同一颜色; 内部像素填充与边界像素不同的颜色; 区域填充:对区域重新着色的过程,即从给定位置开始涂描直到指定 的边界条件为止; - 将指定的颜色从种子点扩展到整个区域的过程; - 区域填充算法要求区域是连通的; 一般步骤: - 确定那些像素位于填充图元的内部; - 确定以什么颜色填充这些像素;
A(2),B(3.5),C(7),D(11);
3、交点配对: (0,2),(2,3.5),(3.5,7),(7 ,11),(11,以后);
存在问题:当扫描线与多边形顶点相交时,交点的取舍问题。如:扫描 线2正确,扫描线7错误。
© 2004 Dept. of Computer Science and Engineer 2018/11/22 15 / 56
n
预处理; 离散计算方法:编码方法;
© 2004 Dept. of Computer Science and Engineer
2018/11/22
9 / 56
多边形的扫描转换
逐点判断法
•3)编码方法:累计角度方法的离散方法 Step: a.预处理,测试点在边上否? b.V为中点作局部坐标系,对象限按逆时针 (或顺时针)编码; P1 c.顶点编码Ipi, d.边编码。PiPi+1: △PiPi+1=Ipi+1-Ipi e.计算∑ △PiPi+1 (其中△PnPn+1 = △PnP0): 若 ∑ 为0, V在P外;若 ∑ 为+/-4,V 在 P内;
© 2004 Dept. of Computer Science and Engineer 2018/11/22 4 / 56
多边形的扫描转换
扫描转换矩形(2/2):
-
矩形是简单的多边形,那么为什么要单独处理矩形?
比一般多边形可简化计算; 应用多: 如窗口系统;
-
共享边界如何处理?
原则:左闭右开,下闭上开
•活性边表的每个结点:
x ymax 1/k next •边表(Edge Table)的构造(1/2): •(1)首先构造一个纵向链表,链表的长度为多边形所占有的最大 扫描线数,链表的每个结点,称为一个桶,对应多边形覆盖的每 一条扫描线。 •(2)将每条边的信息链入与该边最小y坐标(ymin )相对应的桶 处。也就是说,若某边的较低端点为ymin,则该边就放在相应的 扫描线桶中。
© 2004 Dept. of Computer Science and Engineer 2018/11/22 18 / 56
多边形的扫描转换:扫描线算法:
扫描线算法:
-
交点的取整规则 规则1: - X为小数,即交点落于扫描线上两个相邻像素之间; - (a)交点位于左边之上,向右取整; - (b)交点位于右边之上,向左取整;
2018/11/22 6 / 56
-
© 2004 Dept. of Computer Science and Engineer
多边形的扫描转换
逐点判断法
#define MAX 100
typedef struct{
int PolygonNum; // 多边形顶点个数 Point vertexces[MAX] //多边形顶点数组 } Polygon // 多边形结构 void FillPolygonPbyP(Polygon *P, int polygonColor) { int x,y; for(y = ymin; y <= ymax;y++) for(x = xmin; x <= xmax;x++) if( IsInside( P, x, y ) ) PutPixel(x, y, polygonColor); else PutPixel(x, y, backgroundColor); }/*end of FillPolygonPbyP() */
© 2004 Dept. of Computer Science and Engineer 2018/11/22 7 / 56
多边形的扫描转换
逐点判断法
•逐个判断绘图窗口内的像素: •如何判断点在多边形的内外关系? 1)射线法; 2)累计角度法; 3)编码法; •1)射线法 步骤: 1) 从待判别点v发出射线; 2) 求交点个数k; 3) K的奇偶性决定了点与多边形的内 外关系; 4)奇异情况处理;
2018/11/22
17 / 56
多边形的扫描转换:扫描线算法:
扫描线算法: - 交点的取整规则 要求:使生成的像素全部位 于多边形之内 - 用于线画图元扫描转换的 四舍五入原则导致部分像 素位于多边形之外,从而 不可用 假定非水平边与扫描线y=e相 交,交点的横坐标为x,规则 如下:
© 2004 Dept. of Computer Science and Engineer 2018/11/22 22 / 56
多边形的扫描转换:扫描线算法: •活性边(Active Edge):指与当前扫描线相交的多边形的边,也称 为活性边。 •活性边表(Active Edge Table, AET):把活性边按与扫描线交点x 坐标递增的顺序存放在一个链表中,此链表称活性边表。
© 2004 Dept. of Computer Science and Engineer
2018/11/22
20 / 56
多边形的扫描转换:扫描线算法:
扫描线算法:
-
交点的取整规则 规则3: 扫描线与多边形的顶点相交时,交点的取舍,保证交点正确配对。 解决方法: - 检查两相邻边在扫描线的哪一侧。 - 只要检查顶点的两条边的另外两个端点的Y值,两个Y值中大于交点Y 值的个数是0,1,2,来决定取0,1,2个交点。
属于谁?
© 2004 Dept. of Computer Science and Engineer 2018/11/22 5 / 56
多边形的扫描转换
多边形的表示方法: - 顶点表示:用多边形的顶点序列刻划多边 形;
-
点阵表示:用位于多边形内象素的集合来 刻划多边形;
-
扫描转换多边形:将顶点表示形式转换成 点阵表示形式; 三种方法:逐点判断法;扫描线算法;边 缘填充法;
2018/11/22
12 / 56
多边形的扫描转换:扫描线算法:
扫描线算法
基本思想:一条
扫描线与多边 形的边有偶数 个交点
© 2004 Dept. of Computer Science and Engineer
2018/11/22
13 / 56
区域填充(扫描线算法) 算法步骤:
(1)确定多边形所占有的最大扫描线数,得到多边形顶点的最小和最大y 值(ymin 和 ymax); (2)从y=ymin到y=ymax,每次用一条扫描线进行填充; (3)对一条扫描线填充的过程可分为四个步骤: a.求交:扫描线与各边的交点;
© 2004 Dept. of Computer Science and Engineer
2018/11/22
3 / 56
多边形的扫描转换
扫描转换矩形(1/2):
void FillRectangle(Rectangle *rect,int color) { int x,y; for(y = rect->ymin; y <= rect->ymax; y++) for(x = rect->xmin; x <= rect->xmax; x++) PutPixel(x,y,color); }/*end of FillRectangle() */
第四章 基本图形生成算法 (二)
© 2004 Dept. of Computer Science and Engineer
2018/11/22
主要内容:
直线的扫描转换
圆与椭圆的扫描算法
区域填充 线宽与线型的处理 字符 裁剪
反走样
© 2004 Dept. of Computer Science and Engineer
© 2004 Dept. of Computer Science and Engineer
2018/11/22
19 / 56
多边形的扫描转换:扫描线算法:
扫描线算法:
-
交点的取整规则 规则2: - 边界上象素的取舍问题,避免填充扩大化; 解决方法: - 边界象素:规定落在右上边界的象素不予填充; - 具体实现时,只要对扫描线与多边形的相交区间左闭右开;
b.排序:按X大小对各交点排序;
c.交点配对:每对交点表示一个区间; d.区间填色:区间内置填充色;区间外填背景色;
© 2004 Dept. of Computer Science and Engineer
2018/11/22
14 / 56
区域填充(扫描线算法) 例:扫描线6的填充。 1、求交: A(2),B(3.5),C(7),D(11); 2、排序:
© 2004 Dept. of Computer Science and Engineer 16 / 56
2018/11/22
多边形的扫描转换:扫描线算法:
扫描线算法:
-
扫描线与边的交点类型: 第一类交点:新出现的边与扫描线的交点; 第二类交点:位于同一条边上的后继交点;
© 2004 Dept. of Computer Science and Engineer
P0
v P2
结论:逐点判断法程序简单,速度太慢,效率低。
© 2004 Dept. of Computer Science and Engineer 2018/11/22 10 / 56
多边形的扫描转换:扫描线算法:
-
几个概念:
边的连贯性:某条边与当前扫描线相交,也可能与下一条扫描 线相交; 扫描线的连贯性:当前扫描线与各边的交点顺序与下一条扫描 线与各边的交点顺序可能相同或类似; 区间连贯性:同一区间上的像素取同一颜色属性;
区域填充(扫描线算法)
•解决方法:当扫描线与多边形的顶 点相交时:
• 若共享顶点的两条边分别落在 扫描线的两边,交点只算一个; • 若共享顶点的两条边在扫描线 的同一边,这时交点作为零个或 两个。 •多边形边界上象素的取舍问题: •例:2×2图形填充:若不加处理 则变成3×3; •解决办法:下闭上开;左闭右开;
多边形的扫描转换:扫描线算法:
•边表(Edge Table)的构造(2/2): •(3)每条边的数据形成一个结点,内容包括:该 扫描线与该边的初始交点x(即较低端点的x值), 1/k,以及该边的最大y值ymax。 x|ymin ymax 1/k NEXT •(4)同一桶中若干条边按X|ymin由小到大排序, 若X| ymin相等,则按照1/k由小到大排序。
© 2004 Dept. of Computer Science and Engineer
2018/11/22
21 / 56
多边形的扫描转换:扫描线算法:
•计算扫描线与多边形各边的交 点:最简单的方法: •将多边形的所有边放在一个 表中; •缺点:效率低 •改进的有效边表算法(Y连贯性 算法) •改进原理: •处理一条扫描线时,仅对有 效边求交;wk.baidu.com•利用扫描线的连贯性; •利用多边形边的连贯性;
© 2004 Dept. of Computer Science and Engineer
2018/11/22
11 / 56
多边形的扫描转换:扫描线算法:
扫描线算法:
-
目标:利用相邻像素之间的连贯性,提高算法效率; 处理对象:非自交多边形 (边与边之间除了顶点外无其它交点);
© 2004 Dept. of Computer Science and Engineer
© 2004 Dept. of Computer Science and Engineer 2018/11/22 8 / 56
多边形的扫描转换
逐点判断法
•2)累计角度法 步骤: 从v点向多边形P顶点发出 射线,形成有向角; 计算有相交的和,得出结论;
0,v位于P之外 i i 0 2 , v位于P之内
2018/11/22
2 / 56
区域填充
区域:点阵表示的图形,像素集合; 表示方法:内点表示、边界表示: - 内点表示:-》区域填充算法 枚举处区域内部的所有像素; 内部的所有像素填充同一个颜色; 边界像素填充与内部像素不同的颜色; - 边界表示:枚举出边界上所有的像素-》边界填充算法; 边界上的所有像素填充同一颜色; 内部像素填充与边界像素不同的颜色; 区域填充:对区域重新着色的过程,即从给定位置开始涂描直到指定 的边界条件为止; - 将指定的颜色从种子点扩展到整个区域的过程; - 区域填充算法要求区域是连通的; 一般步骤: - 确定那些像素位于填充图元的内部; - 确定以什么颜色填充这些像素;
A(2),B(3.5),C(7),D(11);
3、交点配对: (0,2),(2,3.5),(3.5,7),(7 ,11),(11,以后);
存在问题:当扫描线与多边形顶点相交时,交点的取舍问题。如:扫描 线2正确,扫描线7错误。
© 2004 Dept. of Computer Science and Engineer 2018/11/22 15 / 56
n
预处理; 离散计算方法:编码方法;
© 2004 Dept. of Computer Science and Engineer
2018/11/22
9 / 56
多边形的扫描转换
逐点判断法
•3)编码方法:累计角度方法的离散方法 Step: a.预处理,测试点在边上否? b.V为中点作局部坐标系,对象限按逆时针 (或顺时针)编码; P1 c.顶点编码Ipi, d.边编码。PiPi+1: △PiPi+1=Ipi+1-Ipi e.计算∑ △PiPi+1 (其中△PnPn+1 = △PnP0): 若 ∑ 为0, V在P外;若 ∑ 为+/-4,V 在 P内;
© 2004 Dept. of Computer Science and Engineer 2018/11/22 4 / 56
多边形的扫描转换
扫描转换矩形(2/2):
-
矩形是简单的多边形,那么为什么要单独处理矩形?
比一般多边形可简化计算; 应用多: 如窗口系统;
-
共享边界如何处理?
原则:左闭右开,下闭上开
•活性边表的每个结点:
x ymax 1/k next •边表(Edge Table)的构造(1/2): •(1)首先构造一个纵向链表,链表的长度为多边形所占有的最大 扫描线数,链表的每个结点,称为一个桶,对应多边形覆盖的每 一条扫描线。 •(2)将每条边的信息链入与该边最小y坐标(ymin )相对应的桶 处。也就是说,若某边的较低端点为ymin,则该边就放在相应的 扫描线桶中。
© 2004 Dept. of Computer Science and Engineer 2018/11/22 18 / 56
多边形的扫描转换:扫描线算法:
扫描线算法:
-
交点的取整规则 规则1: - X为小数,即交点落于扫描线上两个相邻像素之间; - (a)交点位于左边之上,向右取整; - (b)交点位于右边之上,向左取整;
2018/11/22 6 / 56
-
© 2004 Dept. of Computer Science and Engineer
多边形的扫描转换
逐点判断法
#define MAX 100
typedef struct{
int PolygonNum; // 多边形顶点个数 Point vertexces[MAX] //多边形顶点数组 } Polygon // 多边形结构 void FillPolygonPbyP(Polygon *P, int polygonColor) { int x,y; for(y = ymin; y <= ymax;y++) for(x = xmin; x <= xmax;x++) if( IsInside( P, x, y ) ) PutPixel(x, y, polygonColor); else PutPixel(x, y, backgroundColor); }/*end of FillPolygonPbyP() */
© 2004 Dept. of Computer Science and Engineer 2018/11/22 7 / 56
多边形的扫描转换
逐点判断法
•逐个判断绘图窗口内的像素: •如何判断点在多边形的内外关系? 1)射线法; 2)累计角度法; 3)编码法; •1)射线法 步骤: 1) 从待判别点v发出射线; 2) 求交点个数k; 3) K的奇偶性决定了点与多边形的内 外关系; 4)奇异情况处理;
2018/11/22
17 / 56
多边形的扫描转换:扫描线算法:
扫描线算法: - 交点的取整规则 要求:使生成的像素全部位 于多边形之内 - 用于线画图元扫描转换的 四舍五入原则导致部分像 素位于多边形之外,从而 不可用 假定非水平边与扫描线y=e相 交,交点的横坐标为x,规则 如下:
© 2004 Dept. of Computer Science and Engineer 2018/11/22 22 / 56
多边形的扫描转换:扫描线算法: •活性边(Active Edge):指与当前扫描线相交的多边形的边,也称 为活性边。 •活性边表(Active Edge Table, AET):把活性边按与扫描线交点x 坐标递增的顺序存放在一个链表中,此链表称活性边表。
© 2004 Dept. of Computer Science and Engineer
2018/11/22
20 / 56
多边形的扫描转换:扫描线算法:
扫描线算法:
-
交点的取整规则 规则3: 扫描线与多边形的顶点相交时,交点的取舍,保证交点正确配对。 解决方法: - 检查两相邻边在扫描线的哪一侧。 - 只要检查顶点的两条边的另外两个端点的Y值,两个Y值中大于交点Y 值的个数是0,1,2,来决定取0,1,2个交点。
属于谁?
© 2004 Dept. of Computer Science and Engineer 2018/11/22 5 / 56
多边形的扫描转换
多边形的表示方法: - 顶点表示:用多边形的顶点序列刻划多边 形;
-
点阵表示:用位于多边形内象素的集合来 刻划多边形;
-
扫描转换多边形:将顶点表示形式转换成 点阵表示形式; 三种方法:逐点判断法;扫描线算法;边 缘填充法;
2018/11/22
12 / 56
多边形的扫描转换:扫描线算法:
扫描线算法
基本思想:一条
扫描线与多边 形的边有偶数 个交点
© 2004 Dept. of Computer Science and Engineer
2018/11/22
13 / 56
区域填充(扫描线算法) 算法步骤:
(1)确定多边形所占有的最大扫描线数,得到多边形顶点的最小和最大y 值(ymin 和 ymax); (2)从y=ymin到y=ymax,每次用一条扫描线进行填充; (3)对一条扫描线填充的过程可分为四个步骤: a.求交:扫描线与各边的交点;
© 2004 Dept. of Computer Science and Engineer
2018/11/22
3 / 56
多边形的扫描转换
扫描转换矩形(1/2):
void FillRectangle(Rectangle *rect,int color) { int x,y; for(y = rect->ymin; y <= rect->ymax; y++) for(x = rect->xmin; x <= rect->xmax; x++) PutPixel(x,y,color); }/*end of FillRectangle() */
第四章 基本图形生成算法 (二)
© 2004 Dept. of Computer Science and Engineer
2018/11/22
主要内容:
直线的扫描转换
圆与椭圆的扫描算法
区域填充 线宽与线型的处理 字符 裁剪
反走样
© 2004 Dept. of Computer Science and Engineer
© 2004 Dept. of Computer Science and Engineer
2018/11/22
19 / 56
多边形的扫描转换:扫描线算法:
扫描线算法:
-
交点的取整规则 规则2: - 边界上象素的取舍问题,避免填充扩大化; 解决方法: - 边界象素:规定落在右上边界的象素不予填充; - 具体实现时,只要对扫描线与多边形的相交区间左闭右开;
b.排序:按X大小对各交点排序;
c.交点配对:每对交点表示一个区间; d.区间填色:区间内置填充色;区间外填背景色;
© 2004 Dept. of Computer Science and Engineer
2018/11/22
14 / 56
区域填充(扫描线算法) 例:扫描线6的填充。 1、求交: A(2),B(3.5),C(7),D(11); 2、排序:
© 2004 Dept. of Computer Science and Engineer 16 / 56
2018/11/22
多边形的扫描转换:扫描线算法:
扫描线算法:
-
扫描线与边的交点类型: 第一类交点:新出现的边与扫描线的交点; 第二类交点:位于同一条边上的后继交点;
© 2004 Dept. of Computer Science and Engineer
P0
v P2
结论:逐点判断法程序简单,速度太慢,效率低。
© 2004 Dept. of Computer Science and Engineer 2018/11/22 10 / 56
多边形的扫描转换:扫描线算法:
-
几个概念:
边的连贯性:某条边与当前扫描线相交,也可能与下一条扫描 线相交; 扫描线的连贯性:当前扫描线与各边的交点顺序与下一条扫描 线与各边的交点顺序可能相同或类似; 区间连贯性:同一区间上的像素取同一颜色属性;
区域填充(扫描线算法)
•解决方法:当扫描线与多边形的顶 点相交时:
• 若共享顶点的两条边分别落在 扫描线的两边,交点只算一个; • 若共享顶点的两条边在扫描线 的同一边,这时交点作为零个或 两个。 •多边形边界上象素的取舍问题: •例:2×2图形填充:若不加处理 则变成3×3; •解决办法:下闭上开;左闭右开;