有效边表填充算法文档格式.docx
《有效边表填充算法文档格式.docx》由会员分享,可在线阅读,更多相关《有效边表填充算法文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
1)//AET.h和AET..cpp
classAET
{
public:
AET();
virtual~AET();
doublex;
intyMax;
doublek;
//代替1/k
AET*next;
}
2)//Bucket.h和Bucket.cpp
classBucket
public:
Bucket();
virtual~Bucket();
intScanLine;
AET*p;
//桶上的边表指针
Bucket*next;
3)//TestView.h
#include"
AET.h"
//包含有效边表类
Bucket.h"
//包含桶类
#defineNumber7//N为闭合多边形顶点数,顶点存放在整型二维数组Point[N]中
classCTestView:
publicCView
。
voidPolygonFill();
//上闭下开填充多边形
voidCreatBucket();
//建立桶结点桶
voidEt();
//构造边表
voidAddEdge(AET*);
//将边插入AET表
voidEdgeOrder();
//对AET表进行排序
。
protected:
COLORREFGetColor;
//调色板
CPointPoint[7];
//定义多边形
Bucket*HeadB,*CurrentB;
//桶的头结点和当前结点
AETE[Number],*HeadE,*CurrentE,*T1,*T2;
//有效边表的结点
4)//TestView.cpp
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
voidCTestView:
OnDraw(CDC*pDC)
CTestDoc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
pDC->
Polygon(Point,7);
//绘制多边形
//输出多边形的顶点编号
TextOut(550,410,"
P0"
);
TextOut(350,600,"
P1"
TextOut(230,340,"
P2"
TextOut(350,30,"
P3"
TextOut(490,220,"
P4"
TextOut(600,30,"
P5"
TextOut(805,450,"
P6"
}
OnMenuAET()//菜单函数
AfxGetMainWnd()->
SetWindowText("
多边形有效边表填充算法"
//显示标题
CColorDialogccd(GetColor);
if(ccd.DoModal()==IDOK)//调用调色板选取前景色
{
GetColor=ccd.GetColor();
}
RedrawWindow();
//刷新屏幕
CreatBucket();
//初始化桶
Et();
//建立边表
PolygonFill();
//多边形填充
CreatBucket()//初始化桶
intScanMin,ScanMax;
//确定扫描线的最小值和最大值
ScanMax=ScanMin=Point[0].y;
for(inti=1;
i<
Number;
i++)
if(Point[i].y<
ScanMin)
{
ScanMin=Point[i].y;
//扫描线的最小值
}
if(Point[i].y>
ScanMax)
ScanMax=Point[i].y;
//扫描线的最大值
}
for(i=ScanMin;
=ScanMax;
i++)//建立桶结点
if(ScanMin==i)//桶头结点
HeadB=newBucket;
//建立桶的头结点
CurrentB=HeadB;
//CurrentB为Bucket当前结点指针
CurrentB->
ScanLine=ScanMin;
p=NULL;
//没有连接边链表
next=NULL;
else//建立桶的其它结点
next=newBucket;
//新建一个桶结点
CurrentB=CurrentB->
next;
//使CurrentB指向新建的桶结点
ScanLine=i;
Et()//构造边表
for(inti=0;
i++)//访问每个顶点
CurrentB=HeadB;
//从桶链表的头结点开始循环
intj=i+1;
//边的第二个顶点,Point[i]和Point[j]构成边
if(j==Number)j=0;
//保证多边形的闭合
if(Point[j].y>
Point[i].y)//终点比起点高
while(CurrentB->
ScanLine!
=Point[i].y)//在桶内寻找该边的yMin
{
CurrentB=CurrentB->
//移到下一个桶结点
}
E[i].x=Point[i].x;
//计算AET表的值
E[i].yMax=Point[j].y;
E[i].k=double((Point[j].x-Point[i].x))/(Point[j].y-Point[i].y);
//代表1/k
E[i].next=NULL;
CurrentE=CurrentB->
p;
//获得桶上链接边表的地址
if(CurrentB->
p==NULL)//当前桶结点上没有链接边结点
CurrentE=&
E[i];
//赋边的起始地址
CurrentB->
p=CurrentE;
//第一个边结点直接连接到对应的桶中
else
while(CurrentE->
next!
=NULL)//如果当前边已连有边结点
{
CurrentE=CurrentE->
//移动指针到当前边的最后一个边结点
}
CurrentE->
next=&
//把当前边接上去
if(Point[j].y<
Point[i].y)//终点比起点低
=Point[j].y)
E[i].x=Point[j].x;
E[i].yMax=Point[i].y;
E[i].k=double((Point[i].x-Point[j].x))/(Point[i].y-Point[j].y);
if(CurrentE==NULL)
=NULL)
CurrentB=NULL;
CurrentE=NULL;
AddEdge(AET*NewEdge)//插入临时边表函数
T1=HeadE;
if(T1==NULL)//边表为空,将边表置为TempEdge
T1=NewEdge;
HeadE=T1;
else
while(T1->
=NULL)//边表不为空,将TempEdge连在该边之后
T1=T1->
T1->
next=NewEdge;
EdgeOrder()//对边表进行排序函数
if(T1==NULL)
return;
if(T1->
next==NULL)//如果该边表没有再连边表
//桶结点只有一条边,不需要排序
if(T1->
next->
x<
T1->
x)//边表按x值排序
T2=T1->
T1->
next=T2->
T2->
next=T1;
HeadE=T2;
T2=HeadE;
T1=HeadE->
=NULL)//继续两两比较相连的边表