《计算机图形学》实验报告区域填充扫描线算法
一、实验目的和要求
- 熟悉光栅图形学中的区域填充扫描线算法;
- 利用区域填充算法绘制多边形区域,区域由离散点组成;
- 应用OpenGL进行区域填充。
二、实验内容
用区域填充直线扫描法填充绘制六边形:
- 初始化一个空的栈用于存放种子点,将种子点(x, y)入栈;
- 判断栈是否为空,如果栈为空则结束算法,否则取出栈顶元素作为当前扫描线的种子点(x, y),y是当前的扫描线;
- 从种子点(x,y)出发,沿当前扫描线向左、右两个方向填充,直到边界。分别标记区段的左、右端点坐标为xLeft和xRight;
- 分别检查与当前扫描线相邻的y - 1和y + 1两条扫描线在区间[xLeft,xRight]中的像素,从xLeft开始向xRight方向搜索,若存在非边界且未填充的像素点,则找出这些相邻的像素点中最右边的一个,并将其作为种子点压入栈中,然后返回第2步;
三、实验过程及代码
#include<gl/glut.h>
#include<windows.h>
const int POINTNUM = 6; //多边形点数. //定义结构体用于活性边表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,500,150,550,400,400,250,200,350,100,100 }; //多边形顶点 void PolyScan()
{//计算最高点的y坐标(扫描到此结束)int MaxY = 0;int i;for (i = 0; i<POINTNUM; 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.5, 0.5, 0.0); //设置直线的颜色红色 glBegin(GL_POINTS);//扫描并建立NET表for (i = 0; i <= MaxY; i++){for (int j = 0; j<POINTNUM; 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;}}}//建立并更新活性边表AETfor (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;NET *s = p->next;p->next = tq->next;tq->next = p;p = s;tq = pAET;} // (改进算法)先从AET表中删除ymax==i的结点AET *q = pAET;p = q->next;while (p){if (p->ymax == i){q->next = p->next;delete p;p = q->next;}else{q = q->next;p = q->next;}} //将NET中的新点加入AET,并用插入法按X值递增排序p = pNET[i]->next;q = pAET;while (p){while (q->next && p->x >= q->next->x)q = q->next;NET *s = p->next;p->next = q->next;q->next = p;p = s;q = pAET;} //配对填充颜色p = pAET->next;while (p && p->next){for (float j = p->x; j <= p->next->x; j++)glVertex2i(static_cast<int>(j), i);p = p->next->next; //考虑端点情况 }}glEnd();glFlush();
}
void init(void)
{glClearColor(1.0, 1.0, 1.0, 0.0); //窗口的背景颜色设置为白色 glMatrixMode(GL_PROJECTION);gluOrtho2D(0.0, 600.0, 0.0, 600.0);
}void main(int argc, char* argv)
{glutInit(&argc, &argv); //初始化 GLUT. glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); //设置显示模式:单个缓存和使用RGB模型 glutInitWindowPosition(50, 50); //设置窗口的顶部和左边位置 glutInitWindowSize(800, 800); //设置窗口的高度和宽度 glutCreateWindow("An Example OpenGL Program"); //创建显示窗口 init(); //调用初始化过程 glutDisplayFunc(PolyScan); //图形的定义传递给我window. glutMainLoop(); //显示所有的图形并等待
}
四、实验运行结果截图
《计算机图形学》实验报告区域填充扫描线算法相关推荐
- 华北电力大学计算机图形学实验报告,华北电力大学计算机图形学实验报告分析.doc...
华北电力大学计算机图形学实验报告分析 科 技 学 院 课程设计(综合实验)报告 ( 2013 -- 2014 年度第 2 学期) 实验名称 OpenGL基本图元绘制实验 课程名称 计算机图形学 | | ...
- 计算机图形学直线扫描转论文,计算机图形学实验报告-实验1直线段扫描转换.doc...
PAGE 32 PAGE 7 计算机图形学 实验报告 班级 计算机工硕班 学号 2011220456 姓名 王泽晶 实验一:直线段扫描转换 实验目的 通过本次试验,学生可以掌握直线段的扫描转换算法及其 ...
- OpenGL南邮计算机图形学实验报告二——两个纹理的渐变变换和移动
OpenGL南邮计算机图形学实验报告二--两个纹理的渐变变换和移动 计算机图形学的新题目要求 OpenGL配置参考: 南邮老前辈wonz哥的OpenGL配置(Shader.h始终不用改).SOIL2 ...
- 计算机图形学直线线型实验报告,计算机图形学实验报告-直线中点bresenham算法的实现资料.doc...
计算机图形学实验报告-直线中点bresenham算法的实现资料.doc (10页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 29.90 积分 计算机图形 ...
- 计算机图学实验报告,计算机图形学实验报告实验1
计算机图形学实验报告实验1 (9页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.9 积分 贵州大学实验报告学院:计算机科学与信息专业:计科班级:101 ...
- 计算机图形学实验报告 裁剪,计算机图形学-实验报告三-图形裁剪算法
<计算机图形学-实验报告三-图形裁剪算法>由会员分享,可在线阅读,更多相关<计算机图形学-实验报告三-图形裁剪算法(9页珍藏版)>请在人人文库网上搜索. 1.图形裁剪算法1. ...
- OpenGL南邮计算机图形学实验报告四——用键盘控制物体
OpenGL南邮计算机图形学实验报告四--用键盘控制物体 计算机图形学的新题目要求 OpenGL配置参考: 南邮老前辈wonz哥的OpenGL配置(Shader.h始终不用改).SOIL2 环境配置. ...
- OpenGL南邮计算机图形学实验报告三——实现类似地月系统的两物体环绕移动
OpenGL南邮计算机图形学实验报告三--实现类似地月系统的两物体环绕移动 计算机图形学的新题目要求 OpenGL配置参考: 南邮老前辈wonz哥的OpenGL配置(Shader.h始终不用改).SO ...
- 计算机图形动画处理实训报告,西安石油大学计算机图形学 实验报告.doc
文档介绍: 西安石油大学计算机图形学_实验报告实验报告 -计算机图形学实验大作业 课程名称计算机图形学 实验名称二维绘图系统与计算机动画 姓名 学号 专业班级 成绩 指导教师爨莹 实验报告 课程名称计 ...
最新文章
- 调用 动态库 实现插件(windows linux)
- 基于matlab异步电机 s函数,建立电机状态方程的S 函数和仿真模)基于MATLAB的无刷双馈电机建模与仿真...
- Fckeditor插入视频或视频文件
- 《你不知道的JavaScript(上)》笔记——函数作用域和块作用域
- ffplay分析 (暂停 / 播放处理)
- 连续两年入选Gartner公共云容器,阿里云在边缘容器方面做了什么?
- python操作Excel文件
- 去掉重复的字符,比如 google,输出:gole(华为笔试题)
- 组态TwinCat软件安装时,There are some files marked for deletion on next reboot.Please reboot first and then
- 今晚7:00 | PhD Debate 自监督学习在推荐系统中的应用
- Qt Windows 制作圆形头像
- android流光字体实现,CSS3自定义动画实现流光文字特效
- uni-app打包上架vivo应用市场踩坑
- 《On Java》介绍
- Android自定义控件之拓展TextView(ExpandTextView)
- gdiplus 水印_GDI+ 实现透明水印和文字
- MysqlOracle中的日期
- OCR识别之LEADTOOLS介绍
- PMP计算(带例题)
- C++类、结构体、函数、变量等命名规则详解