③ 为了验证改进的有效边表填充算法,现将本程序的像素大小恢复为1:1,按
比例扩大多边形的顶点坐标,测试结果如下:
从上图可以看出填充过后的多边形与原多边形P0P1P2P3P4P5P6的形状一致,
该算法验证通过。
11
④ 测试其他多边形
长方形:
三角形:
12
五角星:
13
从以上结果来看,该算法基本得到完美实现。而程序的执行时间来看,生成边表的时间(包括分配内存、对桶中的结点进行排序等)远比填充像素点的时间要长。因此,该算法的效率虽然很高,但对于表的维护和排序开销太大,它适合软件实现而不适合硬件实现。
14
五、总结
通过本次课程设计,我掌握了多边形的填充算法,了解了OpenGL的运行结构,
熟悉了很多OpenGL的函数,对OpenGL编程也产生的浓厚的兴趣。同时也巩固了对计算机图形学知识的掌握,锻炼了我对手实验的能力,看清了自己的水平,认识到了自己的不足。
在本次课程设计中,存在一些不足之处。比如对边界的处理,课本上的说法模糊
不清,在网上也没有找到相应的解答,我只能根据自己的理解来试着解决;这方面也存在没有及时和老师沟通的原因。从这一点上,我认识到理论和实践的差别,我们应该多实践才能真正掌握理论。
还有就是完全填充后的多边形,边缘有“锯齿”现象,不知道是我程序的原因还
是算法的问题。或许对于多边形的填充算法还应该处理“锯齿”。
六、源代码
//源代码仅包含文件PolygonFilling.cpp
#include
#define EPSILON 0.000001 //最小浮点数
//点结构体 struct Point {
int x; //x坐标 int y; //y坐标 };
//线结构体 struct Line {
Point high_point; //高端点
15