计算机图形区域填充算法

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

西安工程大学实验报告

课程实验名称区第 1 页共 6 页

系别组别_____________ 实验报告日期年月日

姓名学号报告退发 ( 订正、重做 )

E_mail:_________________________________ 教师审批评分___________________

区域填充算法

一、实验目的和任务

1. 学习多边形填充的基于扫描线的区域填充算法

2. 编程实现区域填充算法

二、实验环境和设备

windows系统下 vs2012 c++

三、实验步骤和过程

在MFC框架中通过菜单与对话框实现多边形顶点参量的输入,选择各种填充算法中的两种进行展示,其中栅栏填充和边填充算法不能同时选择,多边形的表示根据所选择的算法,以内点表示或边界表示均可

四、实验故障与排除

五、总结

附录

#include

#include

const int POINTNUM = 7; //多边形点数.

/******定义结构体用于活性边表AET和新边表NET***********************************/ typedef struct XET

{

float x;

float dx, ymax;

XET* next;

}AET, NET;

/******定义点结构体

point******************************************************/

struct point

{

float x;

float y;

}

polypoint[POINTNUM] = { 250, 50, 550, 150, 550, 400, 250, 250, 100, 350, 100, 100, 120, 30 };//多边形顶点

void PolyScan()

{

/******计算最高点的y坐标(扫描到此结

束)****************************************/

int MaxY = 0;

int i;

for (i = 0; i

if (polypoint[i].y>MaxY)

MaxY = polypoint[i].y;

/*******初始化AET表

***********************************************************/ AET *pAET = new AET;

pAET->next = NULL;

/******初始化NET表

************************************************************/ NET *pNET[1024];

for (i = 0; i <= MaxY; i++)

{

pNET[i] = new NET;

pNET[i]->next = NULL;

}

glClear(GL_COLOR_BUFFER_BIT); //赋值的窗体显示.

glColor3f(0.0, 0.0, 0.0); //设置直线的颜色红色

glBegin(GL_POINTS);

/******扫描并建立NET表

*********************************************************/ for (i = 0; i <= MaxY; i++)

{

for (int j = 0; j

if (polypoint[j].y == i)

{ //一个点跟前面的一个点形成一条线段。跟后面的点也形成线段

if (polypoint[(j - 1 + POINTNUM) % POINTNUM].y>polypoint[j].y)

{

NET *p = new NET;

p->x = polypoint[j].x;

p->ymax = polypoint[(j - 1 + POINTNUM) % POINTNUM].y;

p->dx = (polypoint[(j - 1 + POINTNUM) % POINTNUM].x - polypoint[j].x) / (polypoint[(j - 1 + POINTNUM) % POINTNUM].y - polypoint[j].y);

p->next = pNET[i]->next;

pNET[i]->next = p;

}

if (polypoint[(j + 1 + POINTNUM) % POINTNUM].y>polypoint[j].y)

{

NET *p = new NET;

p->x = polypoint[j].x;

p->ymax = polypoint[(j + 1 + POINTNUM) % POINTNUM].y;

p->dx = (polypoint[(j + 1 + POINTNUM) % POINTNUM].x - polypoint[j].x) / (polypoint[(j + 1 + POINTNUM) % POINTNUM].y - polypoint[j].y);

p->next = pNET[i]->next;

pNET[i]->next = p;

}

}

}

/******建立并更新活性边表

AET*****************************************************/ for (i = 0; i <= MaxY; i++)

{

//计算新的交点x,更新AET

NET *p = pAET->next;

while (p)

{

p->x = p->x + p->dx;

p = p->next;

}

//更新后新AET先排序

*************************************************************/ //断表排序,不再开辟空间

AET *tq = pAET;

p = pAET->next;

tq->next = NULL;

while (p)

{

while (tq->next && p->x >= tq->next->x)

tq = tq->next;

相关文档
最新文档