200 likes | 373 Views
多边形填充. 掌握多边形填充中的 AET 算法 在 VC++ 中实现 AET 算法. AET 算法相关知识. 从下面两个方面出发,修改 X 扫描线算法 扫描线的相关性 :某条扫描线上相邻的象素,几乎都具有同样的内外性质,这种性质只有遇到多边形边线与该扫描线的交点时才会发生改变。. AET 算法相关知识. 从下面两个方面出发,修改 X 扫描线算法 边的相关性 :对同一条边,前一条扫描线 y i 与该边的交点为 x i ,而后一条扫描线 y i+1 =y i +1 与该边的交点则为 x i+1 =x i +1/m ,利用这种相关性可以省去大量的求交运算。.
E N D
多边形填充 • 掌握多边形填充中的AET算法 • 在VC++中实现AET算法
AET算法相关知识 • 从下面两个方面出发,修改X扫描线算法 • 扫描线的相关性:某条扫描线上相邻的象素,几乎都具有同样的内外性质,这种性质只有遇到多边形边线与该扫描线的交点时才会发生改变。
AET算法相关知识 • 从下面两个方面出发,修改X扫描线算法 • 边的相关性:对同一条边,前一条扫描线yi与该边的交点为xi,而后一条扫描线yi+1=yi+1与该边的交点则为xi+1=xi+1/m,利用这种相关性可以省去大量的求交运算。
AET算法相关知识 • 边相关扫描线填充算法的实现需要建立两个表:边表(ET)和活动边表(AET)
AET算法相关知识 • 边表(ET:Edge Table) • 用来对除水平边外的所有边进行登记,来建立边的记录。边的记录定义为 • 某边的最大y值(ymax)。注意要进行奇异点处理:对于非极值点应该ymax=ymax-1。 • 某边的最小的y对应的x值。 • 斜率的倒数 • next
AET算法相关知识 • 活动边表(AET:Active Edge Table) • 只与当前扫描线相交的边记录链表,称之为活动边表。
AET算法相关知识 • 算法的基本实现步骤 • 根据给出的多边形顶点坐标,建立ET表;求出顶点坐标中最大y值ymax和最小y值ymin • 在做奇异点处理时,当该边最大y值对应的顶点为非极值点时,边记录的第一项:ymax=ymax-1。
AET算法相关知识 • 算法的基本实现步骤
AET算法相关知识 • 算法的基本实现步骤 • 接着建立AET表。AET表的建立过程就是有效地进行填充的操作,在这个期间不断地做以下工作: • 合并ET表 • x递增排序 • 实施填充 • 删除ymax=yj的边 • 修改边记录xi=xi+1/m • yj+1进入下一轮循环。
AET算法相关知识 • 算法的基本实现 • 根据多边形顶点坐标,建立ET 表。 • AET表初始化,每个桶置空。 • for(y=ymin;y<= ymax;y++) • { 合并当前扫描线y的ET表; • 将y桶中每个记录按x项升序排列 • 在当前y值下,将两两记录的x值之间的象素进行填充; • 删除y=ymax的边记录 • 修改边记录x=x+1/m;}
Typedef struct tEdge { int yMax; float x,dx; struct tEdge *next;}Edge //边表edges,活动边表actEdge,pts存放多边形顶点序列 //win_height为扫描线数目,cnt为顶点数目 int win_height,int cnt; Edge *edges[win_height],* actEdge; CPoint *pts; AET算法相关知识 • AET算法的数据结构
AET算法相关知识 • 实现 • 定义类 CUPolygon,数据成员记录顶点序列的数组,边表和活动边表,顶点数目,扫描线数目,最大扫描线数 • 为该类设计一个带参数的构造函数,用于初始化相关变量的值 • 该类包含主要成员函数 • Scanfill,调用该函数实现填充 • buildEdgeList调用函数建立边表
AET算法相关知识 • 实现 • 该类包含成员函数 • buildActiveList:产生活动边表 • Fillscan:实现两端点间线段填充 • UpdateActiveList:更新活动边表 • resortActiveList:排序活动边表
1 从键盘接收多边形顶点数和顶点坐标等信息 2 定义CUPolygon类对象polygon,并在构造函数中完成对 相关变量初始化(pts,cnt,win_height等) 3 polygon.scanFill()函数,完成填充并显示的过程 AET算法相关知识 • 程序结构
scanFill多边形填充函数主要完成以下工作: 产生ET表中的桶 调用buillEdgeList建立边表 对每一条扫描线,重复以下工作: buildActiveList建立活动边表 使用fillscan填充(配对,填充) 使用updateActiveList更新活动边表结点 resortActiveList排序AET表结点 AET算法相关知识 • 程序结构
实验要求 • 参照上述知识,完成实验 • 请打开工程polygon.dsw • 工程的polygon.cpp为主函数main所在文件,请实现多边形顶点信息的输入,并在该文件中实现多边形填充函数的调用 • 工程的Upolygon.cpp和Upolygon.h为类CUpolygon的类定义文件和成员函数实现文件,请将有关代码书写在这里
实验要求 • 阅读参考程序1.txt的有关内容,在读懂的基础上将相关函数代码移植到Upolygon.cpp和Upolygon.h文件中 • 程序执行结果以及相关信息报告,请运行test.exe文件,并输入测试多边形数据( 6,7) ( 8,5) ( 6,1) (2,3) (2,6),查看程序输出结果
除了上述提到的函数,在程序中可能用到的函数有除了上述提到的函数,在程序中可能用到的函数有 增删链表结点的函数 建立链表结点的函数 判断奇异点的函数等 AET算法相关知识 • 程序结构
对于奇异点的判断,主体思想是: 考察的边为:当前边的ymax、与当前边ymax端点相邻的边的ymin比较 AET算法相关知识 • 程序结构