改进的有效边表算法,多边形的扫描转换
2010-12-04 21:51
246 查看
这里不仔细讲原理,只是把我写的算法发出来,跟大家分享下,如果有错误的话,还请大家告诉我,如果写的不好,也请指出来,一起讨论进步。
边表构造的算法:
(1) 首先构造一个纵向链表,链表的长度为多边形所占有的最大扫描线数,链表的每个结点,称为一个桶,则对应多边形覆盖的每一条扫描线。
(2) 将每条边的信息链入与该边最小y坐标相对的桶处。也就是说,若某条边的较低点为ymin,则该边就放在相应的扫描线中。
(3) 每条边的数据形成一个结点,内容包括:该扫描线与该的初始交点x(即较低端点的x值),1/k,以及该边的最大y值ymax如下:
x|ymin ymax 1/k next
(4) 同一桶中若干条边按x|ymin由小到在大排序,若x|ymin相等,则按照1/k由小到大排序。
改进的有效边表填充算法步骤如下:
(1) 初始化: 构造边表, AET表置空.
(2) 将第一个不空的ET表中的边与AET表合并。
(3) 删除AET表中y = ymax的边后再填充,按“下闭上升”的原则进行填充,此时就无需缩短任何边。然后进行填充,填充时设置一个布尔量b(初值为假),令指针从有效边表中第一个结点到最后一个结点进行遍历一次。每访问一个结点,把b取反一次,若b为真,则把从当前结点的x值开始下一结点的x值结束的区间用多边形色填充。(填充时需要对x坐标进行四舍五入处理)。
(4) yi+1 = yi + 1,根据xi+1 = xi + 1 / k计算并修改AET表,同时合并ET表中y = yi+1桶的边,按次序插入到AET表中,形成新的AET表。
(5) AET表不空则转(3),否则结束。
边表构造的算法:
(1) 首先构造一个纵向链表,链表的长度为多边形所占有的最大扫描线数,链表的每个结点,称为一个桶,则对应多边形覆盖的每一条扫描线。
(2) 将每条边的信息链入与该边最小y坐标相对的桶处。也就是说,若某条边的较低点为ymin,则该边就放在相应的扫描线中。
(3) 每条边的数据形成一个结点,内容包括:该扫描线与该的初始交点x(即较低端点的x值),1/k,以及该边的最大y值ymax如下:
x|ymin ymax 1/k next
(4) 同一桶中若干条边按x|ymin由小到在大排序,若x|ymin相等,则按照1/k由小到大排序。
改进的有效边表填充算法步骤如下:
(1) 初始化: 构造边表, AET表置空.
(2) 将第一个不空的ET表中的边与AET表合并。
(3) 删除AET表中y = ymax的边后再填充,按“下闭上升”的原则进行填充,此时就无需缩短任何边。然后进行填充,填充时设置一个布尔量b(初值为假),令指针从有效边表中第一个结点到最后一个结点进行遍历一次。每访问一个结点,把b取反一次,若b为真,则把从当前结点的x值开始下一结点的x值结束的区间用多边形色填充。(填充时需要对x坐标进行四舍五入处理)。
(4) yi+1 = yi + 1,根据xi+1 = xi + 1 / k计算并修改AET表,同时合并ET表中y = yi+1桶的边,按次序插入到AET表中,形成新的AET表。
(5) AET表不空则转(3),否则结束。
// 这里为了简单所以把分配的内存放在vector容器中,方便删除。:-) vector<EdgeItem *>::iterator itr = g_pItemVector.begin (), endItr = g_pItemVector.end (); while (itr != endItr) { delete (*itr); ++ itr; } g_pItemVector.clear (); } void display (void) { glClear (GL_COLOR_BUFFER_BIT); glLoadIdentity (); glColor3f (1.0f, 0.0f, 0.0f); // Fill a polygon activEdgeListFillPolygon (); glutSwapBuffers (); } void reshape (int w, int h) { glViewport (0, 0, (GLsizei) w, (GLsizei) h); glMatrixMode (GL_PROJECTION); glLoadIdentity (); if (w <= h) { gluOrtho2D (-600.0, 600.0, -600.0 * (GLfloat) h / (GLfloat) w, 600.0 * (GLfloat) h / (GLfloat) w); } else { gluOrtho2D (-600.0 * (GLfloat) w / (GLfloat) h,600.0 * (GLfloat) w / (GLfloat) h, -600.0, 600.0); } glMatrixMode (GL_MODELVIEW); glLoadIdentity (); } void keyboard (unsigned char key, int x, int y) { switch (key) { case 27: // 'VK_ESCAPE'exit (0); break; default: break; } } int main (int argc, char ** argv) { glutInit (&argc, argv); glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB); glutInitWindowSize (600, 600); glutCreateWindow ("Optimized active edge list"); init (); inputPoints (); constructEdgeList (); glutReshapeFunc (reshape); glutDisplayFunc (display); glutKeyboardFunc (keyboard); glutMainLoop (); destroy (); // 这里destroy并没有调用。 return 0; }
polypoints.txt
中的示例内容如下:
7
30 120
10 70
30 10
60 50
80 10
120 90
70 80
相关文章推荐
- 改进的有效边表算法,多边形的扫描转换
- 计算机图形学 学习笔记(二):多边形扫描转换:X扫描线算法 和 改进的X扫描线算法
- 计算机图形学:多边形的扫描转换算法(有详细代码)
- 多边形的扫描转换与区域填充算法
- 【OpenCV】图形生成算法:多边形的扫描转换
- 算法系列之十二:多边形区域填充算法--改进的扫描线填充算法
- 计算机图形学之光栅图形学——多边形的扫描转换算法简介
- 【OpenCV】图形生成算法:多边形的扫描转换
- 多边形区域填充算法--改进的扫描线填充算法
- [计算机图形学经典算法] 多边形的扫描转换
- 算法系列之十二:多边形区域填充算法--改进的扫描线填充算法
- OpenGL实现多边形扫描转换的扫描线算法
- 多边形的扫描转换算法
- 算法系列之十二:多边形区域填充算法--改进的扫描线填充算法
- 图形生成算法:多边形的扫描转换与区域填充算法
- 算法系列之十二:多边形区域填充算法--改进的扫描线填充算法 .
- 多边形扫描转换-X-扫描线算法
- 直线扫描转换算法-中点画线法
- 扫描多边形填充算法
- 计算机图形学基础 : 基本图形生成算法之直线的扫描转换