扫描线多边形填充算法

合集下载

扫描线多边形填充算法

扫描线多边形填充算法

扫描线多边形填充算法扫描线多边形填充算法(Scanline Polygon Fill Algorithm)是一种计算机图形学中广泛使用的算法,用于将一个封闭的多边形形状涂色填充。

它通过扫描线的方式,从上到下将多边形内的像素按照预设的填充颜色来进行填充。

本文将详细介绍扫描线多边形填充算法的原理、流程和实现细节。

1.算法原理:扫描线多边形填充算法基于扫描线的思想,在水平方向上扫描每一行像素,并检测多边形边界与扫描线的交点。

通过将扫描线从上到下扫过整个多边形,对于每一行像素,找出与多边形边界交点的水平线段,然后根据填充颜色将像素点进行填充。

2.算法流程:-找出多边形的最小和最大Y坐标,确定扫描线的范围。

-从最小Y坐标开始,到最大Y坐标结束,逐行进行扫描。

-对于每一行,找出与多边形边界交点的水平线段。

-根据填充颜色,为每个水平线段上的像素点进行填充。

3.算法实现:-首先,需要根据给定的多边形描述边界的顶点坐标,计算出每条边的斜率、最小和最大Y值以及每条边的X坐标交点。

-然后,对于每一扫描线,找出与多边形边界交点的水平线段,即找出交点的X坐标范围。

-最后,根据填充颜色,将该范围内的像素点进行填充。

4.算法优化:- 针对复杂多边形,可以使用活性边表(AET,Active Edge Table)来管理边界信息,加快查找交点的速度。

-可以使用桶排序来排序边界事件点,提高扫描速度。

-根据多边形边的特征,对算法进行优化,减少不必要的计算和内存消耗。

5.算法应用:-扫描线多边形填充算法广泛应用于计算机图形学中的图形渲染、图像处理等领域。

-在游戏开发、CAD绘图、虚拟现实等应用中,扫描线多边形填充算法被用于快速绘制和渲染复杂多边形。

总结:扫描线多边形填充算法是一种经典的计算机图形学算法,通过扫描线的方式对多边形进行填充。

它可以高效地处理各种形状的多边形,包括凸多边形和凹多边形。

算法虽然简单,但在实际应用中具有广泛的用途。

贵州大学--实验三-多边形填充算法

贵州大学--实验三-多边形填充算法

贵州大学实验报告学院:计算机科学与信息专业:软件工程班级:102班边界上的象素填充所遵循的规则为:“左闭右开”,“下闭上开”(将左边界和下边界的点算为内部,而将右边界和上边界算为外部)顶点:“上开下闭”。

几种特殊情况:1.扫描线交于一顶点,共享的两条边分另处于扫描线的两边,这时交点只取一个。

2.共享交点的两条边处于扫描线的上方,这时交点取二个。

3.共享交点的两条边处于扫描线的下方,这时交点取0个。

4.水平边在算法中不起任何作用,可不考虑。

活性边表(提高效率):为了减少求交的计算量,要利用一条边与相继的两条扫描线的交点的连贯性。

在处理一条扫描线时只对活性边(与它相交的多边形的边)进行求交运算。

把交点按x增加方向存在一个链表(活性边表)中。

活性边:与当前扫描线相交的边。

活性边表(AEL):按交点x的增量顺序存放在一个链表中,该链表称作活性边表(AEL)。

二、种子填充算法种子填充首先假定区域由封闭轮廓线围成,且轮廓线内某点是已知的,然后开始搜索与种子点相邻且位于轮廓线内的点。

如果这相邻点不在轮廓线内,则已达到轮廓线的边界;如果相邻点在轮廓线之内,则这相邻点成为新的种子点,继续搜索下去。

只适用于光栅扫描设备。

区域分类(区域采用边界定义,即区域边界上与边界外的象素取相同值,区域内部的点取不同值)1、四向连通区域:各象素在水平垂直四个方向是边通的。

即从区域内任一点出发,可水平/垂直移动到达区域内任一点。

实验结果运用扫描线算法进行多边形的填充时,截图显示如下:运用扫描线种子算法进行多边形的填充时,截图显示如下:(注:可编辑下载,若有不当之处,请指正,谢谢!)[文档可能无法思考全面,请浏览后下载,另外祝您生活愉快,工作顺利,万事如意!]。

图形学实验报告四 多边形填充算法

图形学实验报告四 多边形填充算法

扫描线种子填充:
public void FillField(int x, int y, Color newColor, uint oldColor, Graphics g) {
if ("".Equals(txtx.Text) || "".Equals(txty.Text)) { return; } else { x = Convert.ToInt32(txtx.Text); y = Convert.ToInt32(txty.Text); } int xl, xr; bool spanNeedFill; myStack.Clear();
个交点。如右图,对 y=8 的扫描线排序 x 坐标得到的表是(2,4,9,13),然后对交点 2 与 4 之间、9 与 13 之间 的所有象素点进行填充。 边界上的象素:“左闭右开”,“下闭上开”(将左边界和下边界的点算为内部,而将右边界和上边界 算为外部) 顶点:“上开下闭”。
几种特殊情况: 1.扫描线交于一顶点,共享的两条边分另处于扫描线的两边,这时交点只取一个,如扫描线 y=3,该点被填 充一次。2.共享交点的两条边处于扫描线的上方,这时交点取二个,如扫描线 y=1,该点被填充一次。 3.共享交点的两条边处于扫描线的下方,这时交点取 0 个,如扫描线 y=9,无交点,不填充。 4.水平边在算法中不起任何作用,可不考虑。 活性边表(提高效率): 为了减少求交的计算量,要利用一条边与相继的两条扫描线的交点的连贯性。在处理一条扫描线时只对活 性边(与它相交的多边形的边)进行求交运算。把交点按 x 增加方向存在一个链表(活性边表)中。活性边: 与当前扫描线相交的边。 活性边表(AEL) :按交点 x 的增量顺序存放在一个链表中,该链表称作活性边表(AEL) 。

多边形扫描线填充算法技巧

多边形扫描线填充算法技巧

多边形扫描线填充算法技巧扫描线填充算法是计算机图形学中常用的一种填充算法,用于对多边形进行填充。

其基本原理是通过扫描线与多边形边界的交点来确定需要填充的像素点。

本文将介绍多边形扫描线填充算法的基本思想以及一些常用的优化技巧。

一、基本思想多边形扫描线填充算法的基本思想是将多边形分解成一系列水平线段,然后对每条水平线段进行扫描,找出与多边形边界相交的点,并进行填充。

具体步骤如下:1. 确定多边形的边界:对于给定的多边形,首先需要确定其边界。

可以使用边界表(edge table)来存储多边形的边界信息,包括每条边的起点和终点坐标以及斜率等。

2. 初始化扫描线:从多边形边界中找出最小的y坐标和最大的y坐标,作为扫描线的起点和终点。

3. 扫描线算法:对于每条扫描线,通过遍历边界表,找出与扫描线相交的边界线段。

根据相交点的x坐标,确定需要填充的像素点范围。

4. 填充像素点:根据上一步确定的像素点范围,将扫描线上的像素点进行填充。

二、技巧和优化1. 边界表的构建:为了提高算法的效率,可以对边界表进行排序,按照扫描线的y坐标来排序。

这样可以减少对边界表的遍历次数,提高算法的执行速度。

2. 边界交点的计算:在扫描线算法中,需要计算扫描线与多边形边界的交点。

可以使用活性边表(active edge table)来存储当前与扫描线相交的边界线段,并根据交点的x坐标进行排序。

这样可以减少计算交点的次数,提高算法的效率。

3. 填充像素点的优化:在填充像素点时,可以使用扫描线种子填充算法来进行优化。

该算法通过选择合适的填充起点,在填充过程中自动推进扫描线,减少不必要的计算和填充操作,提高填充的速度。

4. 填充规则的处理:在实际应用中,可能会遇到一些特殊情况,如多边形内部有孔洞或交叉等。

针对这些情况,可以通过修改填充规则来处理。

常用的填充规则有奇偶填充规则和非零填充规则,可以根据实际情况选择合适的填充规则。

5. 像素点颜色的处理:在多边形填充过程中,可以通过设置填充的颜色或纹理来实现不同的效果。

带孔多边形填充算法

带孔多边形填充算法

带孔多边形填充算法一. 基本原理用自上而下的每一条水平的扫描线扫描多边形,每一条扫描线被多边形分成几段,每一段要么在多边形内,要么在多边形外。

在内的填充,在外的舍弃。

见图1图1二. 基本算法1. 水平扫描线与线段求交点假定当前扫描线y 与多边形的某一条边的交点x 坐标为x,那么下一条扫描线y-1与该边的交点不必从头算起,只要加上一个增量即可。

设增量为dx,显然dx= -(x1-x0)/(y1-y0) 结果是:若y=y i ,x=x i ,则当y=y i -1时,x=x i -(x1-x0)/(y1-y0)图22. 活性边与活性边表为了提高效率,在处理一条扫描线时,仅对与它相交的多边形的边进行求交运算。

我们把与当前扫描线相交的边称为活性边,并把它们按与扫描线交点x 坐标递增的顺序存放在一个链表中,称此链表为活性边表。

由于边的连贯性(即当某条边与当前扫描线相交时,它很可能也与下一条扫描线相交),以及扫描线的连贯性(当前扫描线与各边的交点顺序与下一条扫描线与各边的交点顺序很可能相同或非常类似),在当前扫描线处理完毕之后,我们不必为下一条扫描线从头开始构造活性边表,而只要对当前扫描线的活性边表稍作修改,即可更新得到下一条扫描线的活性边表。

例如,(见图3)扫描线6的活性边表如下:P 6P 1 →P 6P 5→ P 5P 4 →P 4P 3扫描线4的活性边表如下:P 6P 1→P 4P 3扫描线3的活性边表如下:P 6P 1→P 3P 2 (满足上闭下开的原则)。

扫描线2的活性边表如下:P 1P 2→P 2P 3 (满足上闭下开的原则)。

y-1 (x0,y0) (x1,y1) y dx 1图3 3.Y 桶表为了方便活性边表的建立与更新,我们为每一条扫描线建立一个新边表,存放在该扫描线第一次出现的边。

也就是说,若某边的较高端点为Y max ,则该边就放在扫描线Y max 的新边表中。

这样,当我们按扫描线从大到小顺序处理扫描线时,该边在该扫描线第一次出现。

计算机图形学扫描线种子填充算法

计算机图形学扫描线种子填充算法

2.1 深度递归的种子填充算法
2.2 扫描线种子填充算法
2.1 深度递归的种子填充算法
种子填色又称边界填色(Boundary Filling)。 它的功能是,给出多边形光栅化后的边界位置及边 界色代码oundary_color,以及多边形内的一点(x, y)位置,要求将颜色fill_color填满多边形。
动画演示
扫描线种子填充算法特点
1. 该算法考虑了扫描线上象素的相关性,种子象 素不再代表一个孤立的象素,而是代表一个尚 未填充的区段。 2. 进栈时,只将每个区段选一个象素进栈(每个 区段最右边或最左边的象素),这样解决了堆 栈溢出的问题。 3. 种子出栈时,则填充整个区段。 4. 这样有机的结合:一边对尚未填充象素的登记 (象素进栈),一边进行填充(象素出栈), 既可以节省堆栈空间,又可以实施快速填充。

3. 已知有一个5边形如下。建立新边表 NET,并写出每一条扫描线经过时活性边 表AET中的数据状态。
X ΔX Ymax
第1项存当前扫描线与边的交点坐标x值; 第2项存从当前扫描线到下一条扫描线间x的增量Dx; 第3项存该边所交的最高扫描线号ymax; 第4项存指向下一条边的指针。
假定当前扫描线与多边形某一条边的交点的x 坐标为x,则下一条扫描线与该边的交点不要重计 算,只要加一个增量△x。(连贯性) 设该边的直线方程为:ax+by+c=0; 若y=yi,x=x i;则当y = y i+1时, x i+1=xi-b/a 其中ΔX= -b/a为常数, 另外使用增量法计算时,我们需要知道一条边 何时不再与下一条扫描线相交,以便及时把它从 活性边表中删除出去。
建立或调整AET(ActiveEdgeList);

扫描线填充算法讲解

扫描线填充算法讲解

扫描线算法(Scan-Line F illing)扫描线算法适合对矢量图形进行区域填充,只需要直到多边形区域的几何位置,不需要指定种子点,适合计算机自动进行图形处理的场合使用,比如电脑游戏和三维CAD软件的渲染等等。

对矢量多边形区域填充,算法核心还是求交。

《计算几何与图形学有关的几种常用算法》一文给出了判断点与多边形关系的算法――扫描交点的奇偶数判断算法,利用此算法可以判断一个点是否在多边形内,也就是是否需要填充,但是实际工程中使用的填充算法都是只使用求交的思想,并不直接使用这种求交算法。

究其原因,除了算法效率问题之外,还存在一个光栅图形设备和矢量之间的转换问题。

比如某个点位于非常靠近边界的临界位置,用矢量算法判断这个点应该是在多边形内,但是光栅化后,这个点在光栅图形设备上看就有可能是在多边形外边(矢量点没有大小概念,光栅图形设备的点有大小概念),因此,适用于矢量图形的填充算法必须适应光栅图形设备。

扫描线算法的基本思想扫描线填充算法的基本思想是:用水平扫描线从上到下(或从下到上)扫描由多条首尾相连的线段构成的多边形,每根扫描线与多边形的某些边产生一系列交点。

将这些交点按照x坐标排序,将排序后的点两两成对,作为线段的两个端点,以所填的颜色画水平直线。

多边形被扫描完毕后,颜色填充也就完成了。

扫描线填充算法也可以归纳为以下4个步骤:(1)求交,计算扫描线与多边形的交点(2)交点排序,对第2步得到的交点按照x值从小到大进行排序;(3)颜色填充,对排序后的交点两两组成一个水平线段,以画线段的方式进行颜色填充;(4)是否完成多边形扫描?如果是就结束算法,如果不是就改变扫描线,然后转第1步继续处理;整个算法的关键是第1步,需要用尽量少的计算量求出交点,还要考虑交点是线段端点的特殊情况,最后,交点的步进计算最好是整数,便于光栅设备输出显示。

对于每一条扫描线,如果每次都按照正常的线段求交算法进行计算,则计算量大,而且效率底下,如图(6)所示:图(6)多边形与扫描线示意图观察多边形与扫描线的交点情况,可以得到以下两个特点:(1)每次只有相关的几条边可能与扫描线有交点,不必对所有的边进行求交计算;(2)相邻的扫描线与同一直线段的交点存在步进关系,这个关系与直线段所在直线的斜率有关;第一个特点是显而易见的,为了减少计算量,扫描线算法需要维护一张由“活动边”组成的表,称为“活动边表(AET)”。

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

计算机图形学5多边形扫描转换和区域填充
这些属性独立于填充模式或填充颜色而设置这些属性独立于填充模式或填充颜色而设置且它们提供与且它们提供与线属性参数线属性参数线型线型线宽和线颜色线宽和线颜色相同的选择相同的选择也就是说也就是说可以以点线或划线可以以点线或划线宽或扁以及任何可用的颜色宽或扁以及任何可用的颜色来显示区域的边来显示区域的边而不必考虑怎样填充区域而不必考虑怎样填充区域
多边形分为凸多边形、凹多边形、含内环的多边 形等:
(1)凸多边形 任意两顶点间的连线均在多边形内。
(2)凹多边形
任意两顶点间的连线有不在多边形内的部分。
凸多边形
凹多边形
含内环的多边形
有关概念
1) 区域:一组相邻而且又相连的像素,而且具有 相同属性的封闭区域。 2)种类:①单域 ②复合域
3) 区域填充:以某种属性对整个区域进行设置的过 程。
另外使用增量法计算时,我们需要知道一条边何时不再与下 一条扫描线相交,以便及时把它从有效边表中删除出去,避免 下一步进行无谓的计算。 综上所述,有效边表AET的每个结点存放对应边的有关信息 如下:
x
△x
ymax
next
其中x为当前扫描线与边的交点,ymax是边所在的最大扫描 线值,通过它可以知道何时才能“抛弃”该边,△x表示从 当前扫描线到下一条扫描线之间的x增量即斜率的倒数。 next为指向下一条边的指针
P6(2,7)
P4(11,8) F G B P5(5,5) P3(11,3) C D
A
1
0 1
P1(2,2) P2(5,1) 2 3 4 5 6 7
E
8
9
10
11
一个多边形与若干扫描线
7
把多边形所有 的边全部填成这 样的结构,插到 这个指针数组里 面来。

多边形填充算法实验报告

多边形填充算法实验报告

学生实验报告
实验课名称:计算机图形学
实验项目名称:多边形填充算法
专业名称:计算机科学与技术
班级:
学号:
学生姓名:
教师姓名:
2016年4月30 日
六.运行结果与分析:
图1:扫描线种子填充算法
图2:种子填充算法
七.实验中遇到的问题、解决方法及体会:
多边形的填充对我来说很困难,因为一开始我不知道要输入什么数据,后来我决定要输入五个点来形成一个五边形,但是输入的顺序是一个大问题。

后来我采取顺序输入的方法,但是程序运行时常常崩溃,结果不尽人意。

最后,我在同班同学的帮助之下,找到了自己的问题,完成了填充。

实验六 扫描线填充算法

实验六  扫描线填充算法

实验六扫描线填充算法一、实验目的编写多边形的扫描线填充算法程序,加深对扫描线算法的理解,验证算法的正确性。

二、实验任务(2学时)编写多边形的扫描线填充算法程序,利用数组实现AET,考虑与链表实现程序的不同。

三、实验内容1、算法对一条扫描线的填充一般分为以下4个步骤:(1)求交:计算扫描线与多边形各边的交点;(2)排序:把扫描线上所有交点按递增顺序进行排序;(3)配对:将第一个交点与第二个交点,第三个交点与第四个交点等等进行配对,每对交点代表扫描线与多边形的一个相交区间。

(4)着色:把区间内的像素置为填充色。

2、成员函数的关系主程序名为fill_area(count, x, y),其中参数x, y是两个一维数组,存放多边形顶点(共c ount个)的x和y坐标。

它调用8个子程序,彼此之间的调用关系图1所示为:图1 fill_area的程序结构3、算法的程序设计步骤1:创建“S_L_Fill”工程文件;步骤2:创建类class:“EACH_ENTRY”。

在工作区“S_L_Fill classes”单击右键-→“new class”-→选择类型“Generic Class”名称为“EACH_ENTRY”,添加成员变量(添加至“class EACH_ENTRY { public:”之内):int y_top;float x_int;int delta_y;float x_change_per_scan;步骤3:包含头文件,同时初始化定义多边形顶点数目。

在“class CS_L_FillView : public Cview……”之前添加代码“#include EACH_ENTRY.h”及“#define MAX_POINT 9”。

#define MAX_POINT 9#include "EACH_ENTRY.h"步骤4:在类“class CS_L_FillView”中添加成员变量(鼠标双击工作区“CS_L_FillView”,代码添加至“class CS_L_FillView : public Cview {protected: ……public:之后”):EACH_ENTRY sides[MAX_POINT];int x[MAX_POINT],y[MAX_POINT];int side_count,first_s,last_s,scan,bottomscan,x_int_count;步骤5:利用构造函数“CS_L_FillView::CS_L_FillView()”初始化顶点坐标(鼠标双击工作区“CS_L_FillView”,代码添加至“CS_L_FillView()之内”):x[0]=200;y[0]=100;x[1]=240;y[1]=160;x[2]=220;y[2]=340;x[3]=330;y[3]=100;x[4]=400;y[4]=180;x[5]=300;y[5]=400;x[6]=170;y[6]=380;x[7]=120;y[7]=440;x[8]=100;y[8]=220;步骤6:在“class CS_L_FillView”下添加实现不同功能的成员函数。

图形学_06_二维图形填充

图形学_06_二维图形填充

⑷.对于多边形的水平边 , 则不计它与扫描线 对于多边形的水平边,
的交点。 的交点。
F H G C
E G′ D ℓ m
A
B
如图: 与扫描线ℓ 如图 : ① 边 AB与扫描线 ℓ 与扫描线 交点不计,则扫描线ℓ 交点不计 , 则扫描线ℓ与边 HA有一 ( 下方) 交点A, 有一( 下方 ) 交点 , 有一 只计一次,与边BC有一交 只计一次 , 与边 有一交 下方) , 则填充AB。 点 ( 下方 ) B, 则填充 。
Ymax Ymin中的 中的X 中的
1 m
下一结点地址
8 7 6 5 4 3 2 1 0 ∧ ∧ 3 7 ∧ 9 2 ∧ 9 7
e3 e3
−5 2
∧ ∧ e5 e2
e4 11 7
3 2

11 13 0 0
−5 2
e1
e6 5 7
3 2

② 有效边表(当前边表AET) 有效边表(当前边表AET) 为一动态链表, 由一系列边结点组成, 为一动态链表 , 由一系列边结点组成 , 表 示当前扫描线与所有相关的边求出的交点, 示当前扫描线与所有相关的边求出的交点, 且 按 X 从小 到大排 序 。 当 该边处 理完毕 , 则 从 AET中删除,若ET中有相关边,则加入到 中删除, 中有相关边, 中删除 中有相关边 则加入到AET, , 直至ET、 全为空。 直至 、AET全为空。 全为空 以下图为例: 以下图为例:
四连通区域
八连通区域
1、简单填充算法 基本思想: 从多边形内部任一点(象素 象素)出 基本思想 : 从多边形内部任一点 象素 出 左上右下”顺序判断相邻象素, 发,依“左上右下”顺序判断相邻象素,若其 不是边界象素,对其填充,并重复上述过程, 不是边界象素,对其填充,并重复上述过程, 直到所有象素填充完毕——称四向种子填充算 称四向种子填充算 直到所有象素填充完毕 法。

《计算机图形学教学资料》第6讲-多边形填充

《计算机图形学教学资料》第6讲-多边形填充

05
多边形填充的未来发展
新型填充算法的研究
基于物理的填充算法
模拟真实世界的物理现象,如流体动 力学、表面张力等,以实现更加自然 的多边形填充效果。
智能优化算法
利用遗传算法、模拟退火等智能优化 技术,自动寻找最优的填充方案,提 高填充效率和准确性。
人工智能在多边形填充中的应用
学习型填充算法
通过机器学习技术,让算法自动学习优秀的人类设计师的填充风格,实现更加 艺术化的多边形填充效果。
优化内存管理
合理分配和释放内存,避免频繁的内 存分配和释放操作,可以提高多边形 填充的性能。
04
多边形填充的实践案例
使用OpenGL实现多边形填充
总结词
使用OpenGL进行多边形填充是一种常见的图形编程实践,它涉及到顶点数据、着色器程序和渲染流程的配置。
详细描述
首先,你需要定义多边形的顶点坐标,并将其存储在一个顶点数组中。然后,你需要编写一个OpenGL着色器程 序,用于处理顶点数据并进行渲染。在渲染过程中,你需要设置正确的顶点属性、着色器程序和渲染流程,以确 保多边形能够正确填充颜色。
填充区域
填充区域指的是多边形的内部区域,即所有被填充 的像素组成的区域。
填充颜色
填充颜色是指用于填充多边形内部的颜色,可以根 据需要选择不同的颜色。
填充算法的分类
扫描线填充算法
扫描线填充算法是一种基于扫 描线的填充算法,通过从左到 右、从上到下扫描多边形的内 部像素,对落在多边形内部的 扫描线进行上色。
在游戏开发中应用多边形填充
总结词
在游戏开发中应用多边形填充技术可以创建 更加逼真的游戏场景和角色模型。
详细描述
游戏开发者通常使用游戏引擎(如Unity或 Unreal Engine)来创建游戏场景和角色模 型。在这些引擎中,多边形填充技术被广泛 应用,以实现更加逼真的场景和角色模型。 通过合理配置顶点数据、着色器程序和渲染 流程,游戏开发者可以创建出令人惊叹的游 戏视觉效果。

多边形的转换与区域填充

多边形的转换与区域填充
取交点0次。
扫描线填充算法
解决方法:规定落在右/上边界的象素不予填充,而落在左/下边界的象素予以填充。 具体实现: 对扫描线与多边形的相交区间, 取“左闭右开”,如【2,9) 问题1保证了多边形的“下闭上开”
扫描线填充算法
为了求出扫描线与多边形边的交点,最简单的方法是将多边形的所有边放在一个表中,称之为边表,在处理每条扫描线时,从表中顺序取出所有的边,分别求这些边与扫描线的交点。这样做的结果将做一些无益的求交点动作,因为扫描线并不一定与多边形的边相交,扫描线只与部分甚至较少的边相交;因此,在进行扫描线与多边形边求交点时,应只求那些与扫描线相交的边的交点。我们把与当前扫描线相交的边称为活性边,并把它们按与扫描线交点 x 坐标递增的顺序存放在一个链表中,称此链表为活性边表。
边缘填充算法
算法过程
1
2
4.3 区域填充 4.3.1 区域的表示
区域指已经表示成点阵形式的填充图形,它是象素的集合。 区域填充指先将区域的一点赋予指定的颜色,然后将该颜色扩展到整个区域的过程。区域填充算法要求区域是连通的 区域建立和定义的方式: 内定义区域:区域内部所有象素具有同一种颜色或亮度值,而区域外的所有象素具有另一种颜色或亮度值。 漫水法:将该区域种的全部象素都设置为新值的算法,即填充内定义的区域 边界定义区域:边界上所有象素均具有特定的颜色或亮度值,而在区域内的象素则具有不是新值的某种颜色或亮度值 边界填充算法:将边界定义区域中的全部象素值都设置为新值的算法。
01
为了减少递归次数,相继出现改进的算法,最具代表性的是区域填充的扫描线算法
02
算法特点:
递归填充算法
扫描线区域填充算法
扫描线区域填充算法
算法步骤:
扫描线区域填充算法 上图所示是对四连通边界定义区域进行填充的扫描线算法的执行过程,其中 表示边界象素。

算法系列之十二:多边形区域填充算法--扫描线填充算法(有序边表法)

算法系列之十二:多边形区域填充算法--扫描线填充算法(有序边表法)

算法系列之⼗⼆:多边形区域填充算法--扫描线填充算法(有序边表法)⼆、扫描线算法(Scan-Line Filling)扫描线算法适合对⽮量图形进⾏区域填充,只需要直到多边形区域的⼏何位置,不需要指定种⼦点,适合计算机⾃动进⾏图形处理的场合使⽤,⽐如电脑游戏和三维CAD软件的渲染等等。

对⽮量多边形区域填充,算法核⼼还是求交。

《计算⼏何与图形学有关的⼏种常⽤算法》⼀⽂给出了判断点与多边形关系的算法――扫描交点的奇偶数判断算法,利⽤此算法可以判断⼀个点是否在多边形内,也就是是否需要填充,但是实际⼯程中使⽤的填充算法都是只使⽤求交的思想,并不直接使⽤这种求交算法。

究其原因,除了算法效率问题之外,还存在⼀个光栅图形设备和⽮量之间的转换问题。

⽐如某个点位于⾮常靠近边界的临界位置,⽤⽮量算法判断这个点应该是在多边形内,但是光栅化后,这个点在光栅图形设备上看就有可能是在多边形外边(⽮量点没有⼤⼩概念,光栅图形设备的点有⼤⼩概念),因此,适⽤于⽮量图形的填充算法必须适应光栅图形设备。

2.1扫描线算法的基本思想扫描线填充算法的基本思想是:⽤⽔平扫描线从上到下(或从下到上)扫描由多条⾸尾相连的线段构成的多边形,每根扫描线与多边形的某些边产⽣⼀系列交点。

将这些交点按照x坐标排序,将排序后的点两两成对,作为线段的两个端点,以所填的颜⾊画⽔平直线。

多边形被扫描完毕后,颜⾊填充也就完成了。

扫描线填充算法也可以归纳为以下4个步骤:(1) 求交,计算扫描线与多边形的交点(2) 交点排序,对第2步得到的交点按照x值从⼩到⼤进⾏排序;(3) 颜⾊填充,对排序后的交点两两组成⼀个⽔平线段,以画线段的⽅式进⾏颜⾊填充;(4) 是否完成多边形扫描?如果是就结束算法,如果不是就改变扫描线,然后转第1步继续处理;整个算法的关键是第1步,需要⽤尽量少的计算量求出交点,还要考虑交点是线段端点的特殊情况,最后,交点的步进计算最好是整数,便于光栅设备输出显⽰。

计算机图形学二、多边形的扫描转换算法

计算机图形学二、多边形的扫描转换算法

e2 92 0
e3 9 2 -5/2
9∧
8∧
e3
e4
7
9 7 -5/2
11 7 6/4 λ
e5
6
11 13 0 λ
5∧
e2
4
92

3∧
e2
2∧
e1
e6
1
3 7 -5/2
5 7 6/4 λ
0∧
ymax xmin 1/m
e4 11 81/2 6/4
e4 11 10 6/4
e5 11 13 0 λ
e5 11 13 0 λ

扫描线5 扫描线6
e2 92 0
e2 92 0
e6 5 13 6/4 λ
e5 11 13 0 λ
9∧
8∧
e3
e4
7
9 7 -5/2
11 7 6/4 λ
e5
6
11 13 0 λ
5∧
e2
e3
4
9 2 0λ
3∧
e2
2∧
e1
e6
1
3 7 -5/2
5 7 6/4 λ
e1
0∧
ymax xmin 1/m
e4 e5

e3 e2
e1
e6
3 7 -5/2
5 7 6/4 λ
e1
ymax xmin 1/m
e5 11 13 0 λ
e4 e5
e6
ET: ∧
11 ∧ 10 ∧

扫描线10 扫描线11
e4 11 111/2 6/4
e4 11 13 6/4
e5 11 13 0 λ
e5 11 13 0 λ

(计算机图形学)多边形区域扫描线填充或种子填充

(计算机图形学)多边形区域扫描线填充或种子填充

实验2:多边形区域扫描线填充或种子填充实验类型:验证、设计所需时间:3学时主要实验内容及要求:实现多边形区域扫描线填充的有序边表算法,并将实现的算法应用于任意多边形的填充,要求多边形的顶点由键盘输入或鼠标拾取,填充要准确,不能多填也不能少填。

要求掌握边形区域扫描线填充的有序边表算法的基本原理和算法设计,画出算法实现的程序流程图,使用C或者VC++实现算法,并演示。

参考试验步骤:1)分析多边形区域扫描线填充算法的原理,确定算法流程①初始化:构造边表,AET表置空②将第一个不空的ET表中的边插入AET表③由AET表取出交点进行配对(奇偶)获得填充区间,依次对这些填充区间着色④y=y i+1时,根据x=x i+1/k修改AET表所有结点中交点的x坐标。

同时如果相应的ET表不空,则将其中的结点插入AET表,形成新的AET表⑤AET表不空,则转(3),否则结束。

2)编程实现①首先确定多边形顶点和ET/AET表中结点的结构②编写链表相关操作(如链表结点插入、删除和排序等)③根据1)中的算法结合上述已有的链表操作函数实现多边形区域扫描线填充的主体功能④编写主函数,测试该算法源代码:#include<gl/glut.h>#include<iostream>using namespace std;typedef struct dePt{int x;int y;}dePt;void fill(GLint x1,GLint y1,GLint z1){glBegin(GL_POINTS);glVertex3f(x1,y1,0.0f);glEnd();}typedef struct Edge{int yUpper;float xIntersect, dxPerScan;struct Edge *next;}Edge;void insertEdge(Edge *list, Edge *edge){Edge *p,*q=list;p=q->next;while(p!=NULL){if(edge->xIntersect<p->xIntersect)p=NULL;else{q=p;p=p->next;}}edge->next=q->next;q->next=edge;}int yNext(int k, int cnt, dePt*pts){int j;if((k+1)>(cnt-1))j=0;elsej=k+1;while(pts[k].y==pts[j].y)if((j+1)>(cnt-1))j=0;else j++;return (pts[j].y);}void makeEdgeRec(dePt lower, dePt upper,int yComp,Edge *edge,Edge *edges[]) {edge->dxPerScan=(float)(upper.x-lower.x)/(upper.y-lower.y);edge->xIntersect=lower.x;if(upper.y<yComp)edge->yUpper=upper.y-1;elseedge->yUpper=upper.y;insertEdge(edges[lower.y],edge);}void buildEdgeList(int cnt,dePt *pts,Edge *edges[]){Edge *edge;dePt v1,v2;int i,yPrev=pts[cnt-2].y;v1.x=pts[cnt-1].x;v1.y=pts[cnt-1].y;for(i=0;i<cnt;i++){v2=pts[i];if(v1.y!=v2.y){edge=(Edge *)malloc(sizeof(Edge));if(v1.y<v2.y)makeEdgeRec(v1,v2,yNext(i,cnt,pts),edge,edges);elsemakeEdgeRec(v2,v1,yPrev,edge,edges);}yPrev=v1.y;v1=v2;}}void buildActiveList(int scan,Edge *active,Edge *edges[]) {Edge *p,*q;p=edges[scan]->next;while(p){q=p->next;insertEdge(active,p);p=q;}}void fillScan(int scan,Edge *active){Edge *p1,*p2;int i;p1=active->next;while(p1){p2=p1->next;for(i=p1->xIntersect;i<p2->xIntersect;i++)fill((int)i,scan,3);p1=p2->next;}}void deleteAfter(Edge *q){Edge *p=q->next;q->next=p->next;free(p);}void updateActiveList(int scan,Edge *active) {Edge *q=active, *p=active->next;while(p)if(scan>=p->yUpper){p=p->next;deleteAfter(q);}else{p->xIntersect=p->xIntersect+p->dxPerScan; q=p;p=p->next;}}void resortActiveList(Edge *active){Edge *q,*p=active->next;active->next=NULL;while(p){q=p->next;insertEdge(active,p);p=q;}}void scanFill(int cnt,dePt *pts){Edge *edges[1024],*active;int i,scan;for(i=0;i<1024;i++){edges[i]=(Edge *)malloc(sizeof(Edge)); edges[i]->next=NULL;}buildEdgeList(cnt,pts,edges);active=(Edge *)malloc(sizeof(Edge)); active->next=NULL;for(scan=0;scan<1024;scan++)buildActiveList(scan,active,edges);if(active->next){fillScan(scan,active);updateActiveList(scan,active);resortActiveList(active);}}}void ChangeSize(GLsizei w,GLsizei h){GLfloat nRange=400.0f;if(h==0) h=1;glViewport(0,0,w,h);glMatrixMode(GL_PROJECTION);glLoadIdentity();if(w<=h)glOrtho(-nRange,nRange,-nRange*h/w,nRange*h/w,-nRange,nRange);elseglOrtho(-nRange*h/w,nRange*h/w,-nRange,nRange,-nRange,nRange); glMatrixMode(GL_MODELVIEW);glLoadIdentity();}void Display(void){glClear(GL_COLOR_BUFFER_BIT);glLineWidth(5.0);int n,x,y,i;cout<<"请输入多边形顶点数:"<<endl;cin>>n;dePt *t=new dePt[n];for(i=0;i<n;i++){cout<<"请输入第"<<i+1<<"个顶点坐标"<<endl;cin>>x>>y;t[i].x=x;t[i].y=y;glVertex2i(t[i].x,t[i].y);} glEnd();glFlush();scanFill(n,t);glFlush();}void SetupRC()glClearColor(1.0f,1.0f,1.0f,1.0f); glColor3f(1.0f,0.0f,0.0f);}实验结果:。

多边形的填充——扫描线算法(原理)

多边形的填充——扫描线算法(原理)

多边形的填充——扫描线算法(原理)2007年10月05日星期五 11:52多边形在计算机中有两种表示:点阵表示和顶点表示。

顶点表示是用多边形的顶点的序列来描述多边形,该表示几何意义强、占内存少,但它不能直观地说明哪些像素在多边形内。

点阵表示是用位于多边形内的象素的集合来刻划多边形,该方法虽然没有多边形的几何信息,但具有面着色所需要的图像表示形式。

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

多边形填充最常用的方法就是扫描线算法。

下面分两篇文章介绍这种算法的原理和具体实现。

这里所介绍的算法只是针对非自交多边形,这些多边形可以是凸的、凹的或者带有空洞的。

所谓扫描线算法就是找到多边形的最小y值和最大y值,然后用这个范围内的每一条水平线与多边形相交,求得交点,再绘制线段。

所以我们只需要对一条水平线进行分析就可以。

很显然,一条扫描线和多边形有偶数个交点,将这些交点按照x值从小到大排列,然后取第1、2个绘制,第3、4个绘制......直到所有交点都被取完。

所以,对于一条扫描线,我们需要做的工作可以分为三个步骤:1)求出扫描线与多边形边的交点 2)将交点按照x升序排列 3)将排好序的交点两两配对,然后绘制相应线段。

这三个步骤中,后两个步骤很简单,没有特别的内容需要介绍。

但是第一个步骤比较麻烦。

这里有几个问题需要解决。

一是当扫描线与顶点相交时,交点的取舍。

当与那个顶点关联的边在扫描线同侧时,交点自然算两次,当与那个顶点关联的边在扫描线两侧时,交点只能算一次。

我们使用“下闭上开”的办法。

二是多边形边界上的像素取舍,我们采用“左闭右开”的办法。

三是如何减少计算量。

在绘制直线时,有一种DDA算法,它是利用(x,y)直接求出下一个点位于(x+1,y+m)或者(x+1/m, y+1)。

在这里可以利用这一点。

当已经得到y = e和多边形所有边的交点时,对于下一条扫描线y=e+1,如果没有新边与y=e+1相交,就可以推出y = e+1 和多边形所有边的交点。

计算机图形学实验1------Y-X扫描线填充

计算机图形学实验1------Y-X扫描线填充

实验一 多边形彩色填充一、实验目的学习并掌握Y-X 扫描线算法掌握基于 Win32、Visual C++环境下MFC 编程绘制图形二、实验原理1. 对任一条扫描线,确定该扫描线与多边形边的交点位置,自左向右存储,并对每对内部交点间的帧缓存填写指定颜色2.算法步骤3.扫描线链表123456784. 边表ET :初始化时建立全局边表(ET),包含多边形所有边,按边端点的ymin排序存放。

即:若该边的下端点为ymin,则该边就放在扫描线ymin对应的链表中。

每条扫描线交的多边形的边按其下端点的x坐标增序排列。

5. 活跃边表AET:与当前扫描线相交的边称为活性边,按与扫描线交点x坐标递增的顺序存放在一个链表中,称此链表为活性边表(AET)三、实验关键代码CPolyFill::CPolyFill(){m_pEDGEs = NULL;m_pET = NULL;m_pAET = NULL;MinY = 10000;MaxY = -1;MinX = 10000;MaxX = -1;}CPolyFill::~CPolyFill(){if(m_pEDGEs) delete[] m_pEDGEs;if(m_pET) delete[] m_pET;if(m_pAET) delete[] m_pAET;}// 统计多边形各条边的信息,生成Edge结构。

void CPolyFill::BuildEDGEs(){if(m_pEDGEs){delete[] m_pEDGEs; m_pEDGEs = NULL;}m_pEDGEs = new EDGE[m_PtNum];for(int i = 0; i < m_PtNum-1; i++){if (m_Pts[i].y > m_Pts[i+1].y){m_pEDGEs[i].Up = m_Pts[i];m_pEDGEs[i].Down = m_Pts[i+1];}else{m_pEDGEs[i].Up = m_Pts[i+1];m_pEDGEs[i].Down = m_Pts[i];}m_pEDGEs[i].EG.Ymax = m_pEDGEs[i].Up.y ;m_pEDGEs[i].EG.X = m_pEDGEs[i].Down.x;m_pEDGEs[i].EG.Dx = double((m_pEDGEs[i].Up.x - m_pEDGEs[i].Down.x))/(m_pEDGEs[i].Up.y - m_pEDGEs[i].Down.y);}if (m_Pts[0].y > m_Pts[m_PtNum-1].y){m_pEDGEs[m_PtNum-1].Up = m_Pts[0];m_pEDGEs[m_PtNum-1].Down = m_Pts[m_PtNum-1];}else{m_pEDGEs[m_PtNum-1].Up = m_Pts[m_PtNum-1];m_pEDGEs[m_PtNum-1].Down = m_Pts[0];}m_pEDGEs[m_PtNum-1].EG.Ymax = m_pEDGEs[m_PtNum-1].Up.y ;m_pEDGEs[m_PtNum-1].EG.X = m_pEDGEs[m_PtNum-1].Down.x;m_pEDGEs[m_PtNum-1].EG.Dx = double((m_pEDGEs[m_PtNum-1].Up.x - m_pEDGEs[m_PtNum-1].Down.x))/(m_pEDGEs[m_PtNum-1].Up.y - m_pEDGEs[m_PtNum-1].Down.y);}void CPolyFill::Polygon(CPoint *pts, int cnt){m_Pts = pts;m_PtNum = cnt;BuildEDGEs(); // 计算出每条多边形边的斜率,Ymax, Xmin等。

扫描线多边形填充算法

扫描线多边形填充算法

扫描线多边形填充算法扫描线多边形填充算法是计算机图形学中常用的一种算法。

该算法在计算机图形学中的应用非常广泛,主要用于生成3D模型、游戏场景绘制、平面设计和室内设计等领域。

扫描线多边形填充算法是一种基于扫描线的绘制算法,利用扫描线的方法逐行扫描多边形,根据多边形的边界信息实现多边形的填充效果。

该算法能够处理任意形状的多边形,准确率较高且填充速度较快,广泛被应用于图形处理和计算机图形学领域,成为常用的图形算法之一。

扫描线多边形填充算法的基本思路是利用扫描线的思想,从上到下逐行扫描多边形,记录下所有交点,然后分别对相邻的两个交点进行连线,将扫描线与多边形的交点看做是线段的端点,用线段相交的奇偶性来决定颜色的填充,最后形成连续的填充区域。

扫描线多边形填充算法的实现需要经过以下步骤:1. 对多边形边界进行预处理,将所有边界的交点按照从上到下的顺序排列,如果存在重合的交点则去重。

2. 从上到下遍历扫描线,记录扫描线与多边形边界的交点。

3. 将相邻的两个交点之间的线段按照扫描线的方向进行连线。

4. 判断连线与多边形每条边的交点数目,通过判断奇偶性来确定线段的颜色填充方向,奇数填充,偶数不填充。

5. 当扫描线遍历到最后一行时,多边形的填充工作完成。

扫描线多边形填充算法的优点是填充精度高、处理速度快、容易实现、适用于各种形状的图形等,但也存在一些缺点,例如,不能处理自交和孔洞性多边形,所以需要在实际应用中注意多边形的选择。

总的来说,扫描线多边形填充算法具有重要的应用价值,对于计算机图形学领域中的制图、绘制和渲染方面有着广泛的应用,实现算法的关键在于正确处理多边形的交点和判断线段的奇偶性,只有正确理解这些问题才能够在实践中使用扫描线多边形填充算法进行有效的图形填充处理。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

线两个端点作为交点,即扫描线与该水平边界线相交了两次。如
y 2019/5D/2E7
3
2.边相关性及边记录
很显然,不能利用区域内部点判别准则对显示平面 上每个点逐个判别,这样计算量太大。
事实上,相对于一个给定多边形区域来说,显示平 面上每个像素点内外特性是互相关联的。相邻像素间具 有相关属性。在实施多边形填充时,利用扫描线相关性, 就无需对扫描线上所有像素点逐个地进行内外特性判断, 只需对一条扫描线从左到右求出该扫描线与区域边界交 点,这些交点必将扫描线分成内外交替线段,这些交点x 值大小依次排列。
2019/5/27
B点向右引射线 与区域边界共2 个交点,为外点
1
此时应注意两点: (1)当扫描线与多边形相交如下情况时:
Y
A
I
yyba
B1
3
D
C
EF
X
①若两相邻边与扫描线相交于同一点,且两边位于扫描线同侧
,则视为两个交点。
如yb:1点向右交点为3个(奇数)是内点 3点向右交点为4个(偶数)是外点
出了该边线所在区间),而且扫描线yi+1与该边线的交点,很容易从
前一条扫描线yi与该边的交点递推求得。
设某条直线边的方程为
y=mx+b
该边两个端点坐标为(x1,y1)、(x2,y2) 且x1≠x2 则该边斜率为m=(y2-y1)/(x2-x1)
令扫描线yi与该边交点为(xi,yi) 扫描线yi+1与该边交点(xi+1,yi+1)
2019/5/27
4
Y A
BC D
X
如上图,按x从小到大排列为A B C D 交点AB间线段上像素点必在区域内。 所以关键是求交点。
2019/5/27
5
(1)交点计算
多边形填充首先需要求出扫描线与边界的交点,利用边的相关
性可以简单有效地解决这个问题。当一条扫描线yi 与多边形的某一
边线有交点时,其相邻扫描线yi+1一般也与该边线相交(除非yi+1超
标值处写入一个边记录。当同时有多条边进入时,则在ET表中
按链表结构写入相应数目的多个记录,这些记录是按边线较低
端点的x值增加的顺序排列。当没有新边加入时,表中对应的y
坐标值处存储内容为空白。
P5P1
7^
72 4^
7 6
P5
5
P1 P2
4
3 2 P4
1
P3
O 12345678
图4.40 多边形
6 5 4^ 3 2^ 1
P2P1 7 8 -1 ^
P4P5 62 0^
P3P4 3 6 -2
P3P2 5 6 0.5 ^
y?m4a.x41x?i ?1?/m? ? ?
2019/5/27
9
注意:在ET表中:①与x轴平行的边不计入。②多边形的顶点 分为两大类:一类是局部极值点,如下图中的P1、P3;另一类 是非极值点,如下图中的P2、P4、P5。当扫描线与第一类顶点 相遇时,应看作两个点;当扫描线与第二类顶点相遇时,应 视为一个点。
7
(2)边记录
利用边的这种相关性,不必算出边线与各条扫描线的全 部交点,只需以边线为单位,对每条边建立一个边记录, 其内容包括:该边y的最大值ymax ,该边底端的x坐标xi, 从一条扫描线到下一条扫描线间的x增量1/m,以及指示 下一个边记录地址的指针
B(3,7)
C(8,8)
2019/5/27
A(8,2)
②若两相邻边与扫描线相交于同一点,且两边位于扫描线异侧
,则视为一个交点。
如ya
2019/5/27
2
(2)当扫描线重合多边形某条边界水平线时,如该水平 边线前后两条边线是一上一下的,则该水平边线两个端点 作为一个交点,即扫描线与该水平边界线相交了一次。
如下ห้องสมุดไป่ตู้yCB
Y
A
yCB
B C
yDE
D
E
X 如该水平边线前后两条边线是同为上或同为下的,则将该水平边
2019/5/27
6
yi m xi b
(1)
yi 1 yi 1 m xi 1 b
(2)
xi 1 ( yi 1 b) / m ( yi 1 b) / m
(m xi b 1 b) / m xi 1 / m
则第yi+1条扫描线与AB的交点为yi+1=yi+1, xi+1=xi+1/m 即由前一条
1.区域内部点判断准则
区域填充首先判断一个像素点是否处于多边形区域内,其判 断准则如下:
从该点向无穷远处引出一条射线(也称扫描线),若射线与 区域边界交点目标数目为奇数,则此点在区域内。若射线与区 域边界交点目标数目为偶数,则此点为区域外点。 例如:
A
B
A点向右引射线 与区域边界共3 个交点,为内点
7 6
P5
5
P1 P2
4
3 2
P4
1
P3
O 12345678
图4.40 多边形
2019/5/27
7^ 6 5 4^ 3 2^ 1
P5P1 72 4^
P2P1 7 8 -1 ^
P4P5 62 0^
P3P4 3 6 -2
P3P2 5 6 0.5 ^
多边? 形4.4边1 表? ?多?边? 形? ?边yma表x x边i 1表/m
AB 7 8 -1
ymax xi 1/m
AC 8 80
ymax xi 1/m
8
3.边表ET和活动边表AET
(1)边表ET (Edge Table)
边表是一个包含多边形全部边记录的表,它按y坐标(与扫描线
一一对应)递增(或递减)的顺序存放区域边界的所有边。每
个y坐标值存放一个或者说几个边记录。当某条扫描线yi碰到多 边形边界的新边时(以边线底端为准),则在ET表中相应的y坐
任何新边都加到AET表中,而与之不相交的边又被从AET表中删除
掉了。下图列出了多边形图在扫描线为4、5、6时的AET表。AET表
扫斜率描。线交点第Xi,yYi+i1求条下扫一描条线扫描线交点Xi+1,Yi+1,式中,m是这条边的
与AB的交点为(
C(8,8)
xi+1, yi+1 ) B(3,7)
边线AC
边线AB
(xi+1, yi+1)
yi+1
(xi,yi)
yi
第yi条扫描线
与某边线AB的
1/m
交点是(xi,yi)
A(8,2)
2019/5/27
10
⑵活动边表AET(Activities Edge Table)
活动边表AET是一个只与当前扫描线相交的边记录链表。随着
扫 描 线 从 一 条 到 另 一 条 的 转 换 , AET 表 也 应 随 之 变 动 , 利 用
yi+1=yi+1,
xi+1=xi+1/m
可以算出AET表中x域中的新值xi。凡是与这一条扫描线相交的
相关文档
最新文档