有效边表填充算法文档格式.docx

上传人:b****2 文档编号:14536303 上传时间:2022-10-23 格式:DOCX 页数:14 大小:85.76KB
下载 相关 举报
有效边表填充算法文档格式.docx_第1页
第1页 / 共14页
有效边表填充算法文档格式.docx_第2页
第2页 / 共14页
有效边表填充算法文档格式.docx_第3页
第3页 / 共14页
有效边表填充算法文档格式.docx_第4页
第4页 / 共14页
有效边表填充算法文档格式.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

有效边表填充算法文档格式.docx

《有效边表填充算法文档格式.docx》由会员分享,可在线阅读,更多相关《有效边表填充算法文档格式.docx(14页珍藏版)》请在冰豆网上搜索。

有效边表填充算法文档格式.docx

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)//继续两两比较相连的边表

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 教学研究 > 教学计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1