多边形的扫描转换之扫描线算法 c++实现 vc6.0控制台

本文介绍了作者在《计算机图形学》课程中实现多边形扫描转换的过程,最初尝试了边界标记算法和区域填充算法,但遇到了困难。最终选择了较为复杂的扫描线算法,并详细阐述了算法实现的难点,包括动态边表、新边表的数据结构以及构建新边表的思路。程序使用C++编写,并在VC6.0控制台环境下运行,同时也利用了OpenGL库。
摘要由CSDN通过智能技术生成


多边形的扫描转换算法实现,是我《计算机图形学》的一个作业。多边形扫描算法有很多,比如,扫描线算法,边界标记算法,各种区域填充算法配合直线的扫描转换算法。起初我不打算用扫描线算法,因为在这么多算法里面,扫描线算法最复杂,所以采用了边界标记算法。不过边界标记算法有好几个难以解决的问题,首先,当边界的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
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值