计算机图形区域填充算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;