1 / 20

多边形填充

多边形填充. 掌握多边形填充中的 AET 算法 在 VC++ 中实现 AET 算法. AET 算法相关知识. 从下面两个方面出发,修改 X 扫描线算法 扫描线的相关性 :某条扫描线上相邻的象素,几乎都具有同样的内外性质,这种性质只有遇到多边形边线与该扫描线的交点时才会发生改变。. AET 算法相关知识. 从下面两个方面出发,修改 X 扫描线算法 边的相关性 :对同一条边,前一条扫描线 y i 与该边的交点为 x i ,而后一条扫描线 y i+1 =y i +1 与该边的交点则为 x i+1 =x i +1/m ,利用这种相关性可以省去大量的求交运算。.

raleigh
Download Presentation

多边形填充

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 多边形填充 • 掌握多边形填充中的AET算法 • 在VC++中实现AET算法

  2. AET算法相关知识 • 从下面两个方面出发,修改X扫描线算法 • 扫描线的相关性:某条扫描线上相邻的象素,几乎都具有同样的内外性质,这种性质只有遇到多边形边线与该扫描线的交点时才会发生改变。

  3. AET算法相关知识 • 从下面两个方面出发,修改X扫描线算法 • 边的相关性:对同一条边,前一条扫描线yi与该边的交点为xi,而后一条扫描线yi+1=yi+1与该边的交点则为xi+1=xi+1/m,利用这种相关性可以省去大量的求交运算。

  4. AET算法相关知识 • 边相关扫描线填充算法的实现需要建立两个表:边表(ET)和活动边表(AET)

  5. AET算法相关知识 • 边表(ET:Edge Table) • 用来对除水平边外的所有边进行登记,来建立边的记录。边的记录定义为 • 某边的最大y值(ymax)。注意要进行奇异点处理:对于非极值点应该ymax=ymax-1。 • 某边的最小的y对应的x值。 • 斜率的倒数 • next

  6. AET算法相关知识 • 活动边表(AET:Active Edge Table) • 只与当前扫描线相交的边记录链表,称之为活动边表。

  7. AET算法相关知识 • 算法的基本实现步骤 • 根据给出的多边形顶点坐标,建立ET表;求出顶点坐标中最大y值ymax和最小y值ymin • 在做奇异点处理时,当该边最大y值对应的顶点为非极值点时,边记录的第一项:ymax=ymax-1。

  8. AET算法相关知识 • 算法的基本实现步骤

  9. AET算法相关知识 • 算法的基本实现步骤 • 接着建立AET表。AET表的建立过程就是有效地进行填充的操作,在这个期间不断地做以下工作: • 合并ET表 • x递增排序 • 实施填充 • 删除ymax=yj的边 • 修改边记录xi=xi+1/m • yj+1进入下一轮循环。

  10. AET算法相关知识 • 算法的基本实现 • 根据多边形顶点坐标,建立ET 表。 • AET表初始化,每个桶置空。 • for(y=ymin;y<= ymax;y++) • {  合并当前扫描线y的ET表; • 将y桶中每个记录按x项升序排列 • 在当前y值下,将两两记录的x值之间的象素进行填充; • 删除y=ymax的边记录 • 修改边记录x=x+1/m;}

  11. 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算法的数据结构

  12. AET算法相关知识 • 实现 • 定义类 CUPolygon,数据成员记录顶点序列的数组,边表和活动边表,顶点数目,扫描线数目,最大扫描线数 • 为该类设计一个带参数的构造函数,用于初始化相关变量的值 • 该类包含主要成员函数 • Scanfill,调用该函数实现填充 • buildEdgeList调用函数建立边表

  13. AET算法相关知识 • 实现 • 该类包含成员函数 • buildActiveList:产生活动边表 • Fillscan:实现两端点间线段填充 • UpdateActiveList:更新活动边表 • resortActiveList:排序活动边表

  14. 1 从键盘接收多边形顶点数和顶点坐标等信息 2 定义CUPolygon类对象polygon,并在构造函数中完成对 相关变量初始化(pts,cnt,win_height等) 3 polygon.scanFill()函数,完成填充并显示的过程 AET算法相关知识 • 程序结构

  15. scanFill多边形填充函数主要完成以下工作: 产生ET表中的桶 调用buillEdgeList建立边表 对每一条扫描线,重复以下工作: buildActiveList建立活动边表 使用fillscan填充(配对,填充) 使用updateActiveList更新活动边表结点 resortActiveList排序AET表结点 AET算法相关知识 • 程序结构

  16. 实验要求 • 参照上述知识,完成实验 • 请打开工程polygon.dsw • 工程的polygon.cpp为主函数main所在文件,请实现多边形顶点信息的输入,并在该文件中实现多边形填充函数的调用 • 工程的Upolygon.cpp和Upolygon.h为类CUpolygon的类定义文件和成员函数实现文件,请将有关代码书写在这里

  17. 实验要求 • 阅读参考程序1.txt的有关内容,在读懂的基础上将相关函数代码移植到Upolygon.cpp和Upolygon.h文件中 • 程序执行结果以及相关信息报告,请运行test.exe文件,并输入测试多边形数据( 6,7) ( 8,5) ( 6,1) (2,3) (2,6),查看程序输出结果

  18. 除了上述提到的函数,在程序中可能用到的函数有除了上述提到的函数,在程序中可能用到的函数有 增删链表结点的函数 建立链表结点的函数 判断奇异点的函数等 AET算法相关知识 • 程序结构

  19. 对于奇异点的判断,主体思想是: 考察的边为:当前边的ymax、与当前边ymax端点相邻的边的ymin比较 AET算法相关知识 • 程序结构

More Related