- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
计算机图形学 有效边表填充算法实验报告精选
实验题目:实验二 有效边表填充算法
1.实验目的:
设计有效边表结点和边表结点数据结构
设计有效边表填充算法
编程实现有效边表填充算法
2.实验描述:
下图 1 所示多边形覆盖了 12 条扫描线,共有 7 个顶点和 7 条边。7 个顶点分别为:P0(7,8) ,P1(3,12) ,P2(1,7) ,P3(3,1), P4(6,5), P5(8,1), P6(12,9)。在 1024×768 的显示分辩率下,将多边形顶点放大为 P0(500,400) ,P1(350,600) ,P2(250,350),P3(350,50), P4(500,250), P5(600,50), P6(800,450)。请使用有效边表算法填充该多边形。
图1示例多边形
图2 屏幕显示多边形
3.算法设计:
(1)建立AET和BUCKET类;
(2)初始化桶,并在建立桶结点时为其表示的扫描线初始化为带头结点的链表;
(3)对每个桶结点进行循环,将桶内每个结点的边表合并为有效边表,并进行有效边表循环;
(4)按照扫描线从小到大的移动顺序,计算当前扫描线与多边形各边的交点,然后把这些交点按X值递增的顺序进行排序,配对,以确定填充区间;
(5)用指定颜色点亮填充区间内的所有像素,即完成填充工作。
4.源程序:
1)//AET.h
class AET
{
public:
AET();
virtual ~AET();
double x;
int yMax;
double k;//代替1/k
AET *next;
};
//AET..cpp
AET::AET()
{
}
AET::~AET()
{
}
2) //Bucket.h
#include AET.h
class Bucket
{
public:
Bucket();
virtual ~Bucket();
int ScanLine;
AET *p;//桶上的边表指针
Bucket *next;
};
// Bucket.cpp
Bucket::Bucket()
{
}
Bucket::~Bucket()
{
}
3)//TestView.h
#include AET.h//包含有效边表类
#include Bucket.h//包含桶类
#define Number 7//N为闭合多边形顶点数,顶点存放在整型二维数组Point[N]中
class CTestView : public CView
{
。。。。。。。。。
public:
void PolygonFill();//上闭下开填充多边形
void CreatBucket();//建立桶结点桶
void Et();//构造边表
void AddEdge(AET *);//将边插入AET表
void EdgeOrder();//对AET表进行排序
。。。。。。。。。。
protected:
COLORREF GetColor;//调色板
CPoint Point[7];//定义多边形
Bucket *HeadB,*CurrentB;//桶的头结点和当前结点
AET E[Number],*HeadE,*CurrentE,*T1,*T2;//有效边表的结点
}
(4) TestView.cpp
#define ROUND(a) int(a+0.5) //四舍五入
CTestView::CTestView()
{
//设置多边形的7个顶点
Point[0]=CPoint(550,400);//P0
Point[1]=CPoint(350,600);//P1
Point[2]=CPoint(250,350);//P2
Point[3]=CPoint(350,50);//P3
Point[4]=CPoint(500,250);//P4
Point[5]=CPoint(600,50);//P5
Point[6]=CPoint(800,450);//P6
}
void CTestView::OnDraw(CDC* pDC)
{
CTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDC-Polygon(Point,7);//绘制多边形
//输出多边形的顶点编号
pDC-TextOut(550,410,P0);
pDC-TextOut(350,600,P1);
pDC-TextOut(230,340,P2);
pDC-TextOut(350,30,P3);
pDC-TextOut(490,220,P4);
pDC-TextOut(600,30,P5);
pDC-Tex
文档评论(0)