多边形的扫描转换算法实现,是我《计算机图形学》的一个作业。多边形扫描算法有很多,比如,扫描线算法,边界标记算法,各种区域填充算法配合直线的扫描转换算法。起初我不打算用扫描线算法,因为在这么多算法里面,扫描线算法最复杂,所以采用了边界标记算法。不过边界标记算法有好几个难以解决的问题,首先,当边界的K(斜率)>1的时候,边界的像元数目是多于一的,所以很难处理,还有奇点问题也很难处理。弄了好久,效果都不是很好,于是我转向了区域填充算法,很快也发现了区域填充算法的弱点,就是边界往往封不住,导致填充的时候外溢。最后还是只能转向扫描线算法了。
扫描线算法倒真的是蛮复杂的,主要是实现复杂,实现复杂又体现在数据结构很复杂。这里我假设你已经知道了“扫描线算法”,如果不知道,随便查查也很快学会了,我想写的是算法实现。
扫描线算法的数据结构主要是,动态边表和新边表,还有一些是我需要的数据结构,其它实现方法可能就不需要了。
一下是“边”的结构:
//头文件:
class Edge
{
public:
int y_max;
float x;
float delta_x;
Edge* next_edge;
int y_min;
Edge();
Edge(float x,float delta_x,int y_max,Edge* next_edge);
Edge(float x,float delta_x,int y_max,Edge* next_edge,int y_min);
virtual ~Edge();
};
//源文件
#include "Edge.h"
Edge::Edge()
{
this->x=0;
this->delta_x=0;
this->y_max=0;
this->next_edge=NULL;
this->y_min=-1;
}
Edge::Edge(float x,float delta_x,int y_max,Edge* next_edge)
{
this->x=x;
this->delta_x=delta_x;
this->y_max=y_max;
this->next_edge=next_edge;
this->y_min=-1;
}
Edge::Edge(float x,float delta_x,int y_max,Edge* next_edge,int y_min)
{
this->x=x;
this->delta_x=delta_x;
this->y_max=y_max;
this->nex