计算机图形学 有效边表填充算法实验报告
- 格式:doc
- 大小:349.00 KB
- 文档页数:11
实验题目:实验二有效边表填充算法
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_V ALID(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->TextOut(805,450,"P6");
}
void CTestView::OnMenuAET() //菜单函数
{
AfxGetMainWnd()->SetWindowText("多边形有效边表填充算法");//显示标题CColorDialog ccd(GetColor);
if(ccd.DoModal()==IDOK)//调用调色板选取前景色
{
GetColor=ccd.GetColor();
}