一、实验目的和要求

  1. 熟悉光栅图形学中的区域填充扫描线算法;
  2. 利用区域填充算法绘制多边形区域,区域由离散点组成;
  3. 应用OpenGL进行区域填充。

二、实验内容

用区域填充直线扫描法填充绘制六边形:

  1. 初始化一个空的栈用于存放种子点,将种子点(x, y)入栈;
  2. 判断栈是否为空,如果栈为空则结束算法,否则取出栈顶元素作为当前扫描线的种子点(x, y),y是当前的扫描线;
  3. 从种子点(x,y)出发,沿当前扫描线向左、右两个方向填充,直到边界。分别标记区段的左、右端点坐标为xLeft和xRight;
  4. 分别检查与当前扫描线相邻的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();                        //显示所有的图形并等待
}

四、实验运行结果截图

《计算机图形学》实验报告区域填充扫描线算法相关推荐

  1. 华北电力大学计算机图形学实验报告,华北电力大学计算机图形学实验报告分析.doc...

    华北电力大学计算机图形学实验报告分析 科 技 学 院 课程设计(综合实验)报告 ( 2013 -- 2014 年度第 2 学期) 实验名称 OpenGL基本图元绘制实验 课程名称 计算机图形学 | | ...

  2. 计算机图形学直线扫描转论文,计算机图形学实验报告-实验1直线段扫描转换.doc...

    PAGE 32 PAGE 7 计算机图形学 实验报告 班级 计算机工硕班 学号 2011220456 姓名 王泽晶 实验一:直线段扫描转换 实验目的 通过本次试验,学生可以掌握直线段的扫描转换算法及其 ...

  3. OpenGL南邮计算机图形学实验报告二——两个纹理的渐变变换和移动

    OpenGL南邮计算机图形学实验报告二--两个纹理的渐变变换和移动 计算机图形学的新题目要求 OpenGL配置参考: 南邮老前辈wonz哥的OpenGL配置(Shader.h始终不用改).SOIL2 ...

  4. 计算机图形学直线线型实验报告,计算机图形学实验报告-直线中点bresenham算法的实现资料.doc...

    计算机图形学实验报告-直线中点bresenham算法的实现资料.doc (10页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 29.90 积分 计算机图形 ...

  5. 计算机图学实验报告,计算机图形学实验报告实验1

    计算机图形学实验报告实验1 (9页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.9 积分 贵州大学实验报告学院:计算机科学与信息专业:计科班级:101 ...

  6. 计算机图形学实验报告 裁剪,计算机图形学-实验报告三-图形裁剪算法

    <计算机图形学-实验报告三-图形裁剪算法>由会员分享,可在线阅读,更多相关<计算机图形学-实验报告三-图形裁剪算法(9页珍藏版)>请在人人文库网上搜索. 1.图形裁剪算法1. ...

  7. OpenGL南邮计算机图形学实验报告四——用键盘控制物体

    OpenGL南邮计算机图形学实验报告四--用键盘控制物体 计算机图形学的新题目要求 OpenGL配置参考: 南邮老前辈wonz哥的OpenGL配置(Shader.h始终不用改).SOIL2 环境配置. ...

  8. OpenGL南邮计算机图形学实验报告三——实现类似地月系统的两物体环绕移动

    OpenGL南邮计算机图形学实验报告三--实现类似地月系统的两物体环绕移动 计算机图形学的新题目要求 OpenGL配置参考: 南邮老前辈wonz哥的OpenGL配置(Shader.h始终不用改).SO ...

  9. 计算机图形动画处理实训报告,西安石油大学计算机图形学 实验报告.doc

    文档介绍: 西安石油大学计算机图形学_实验报告实验报告 -计算机图形学实验大作业 课程名称计算机图形学 实验名称二维绘图系统与计算机动画 姓名 学号 专业班级 成绩 指导教师爨莹 实验报告 课程名称计 ...

最新文章

  1. 调用 动态库 实现插件(windows linux)
  2. 基于matlab异步电机 s函数,建立电机状态方程的S 函数和仿真模)基于MATLAB的无刷双馈电机建模与仿真...
  3. Fckeditor插入视频或视频文件
  4. 《你不知道的JavaScript(上)》笔记——函数作用域和块作用域
  5. ffplay分析 (暂停 / 播放处理)
  6. 连续两年入选Gartner公共云容器,阿里云在边缘容器方面做了什么?
  7. python操作Excel文件
  8. 去掉重复的字符,比如 google,输出:gole(华为笔试题)
  9. 组态TwinCat软件安装时,There are some files marked for deletion on next reboot.Please reboot first and then
  10. 今晚7:00 | PhD Debate 自监督学习在推荐系统中的应用
  11. Qt Windows 制作圆形头像
  12. android流光字体实现,CSS3自定义动画实现流光文字特效
  13. uni-app打包上架vivo应用市场踩坑
  14. 《On Java》介绍
  15. Android自定义控件之拓展TextView(ExpandTextView)
  16. gdiplus 水印_GDI+ 实现透明水印和文字
  17. MysqlOracle中的日期
  18. OCR识别之LEADTOOLS介绍
  19. PMP计算(带例题)
  20. C++类、结构体、函数、变量等命名规则详解

热门文章

  1. 纯C语言写计算器界面
  2. 团队作业之一:团队介绍及选题背景与意义
  3. shopee上架接口java_Shopee虾皮店小秘ERP刊登发布产品图文教程
  4. 通过开源工具XCA工具签发和管理可被浏览器信任的SSL证书
  5. xca自签发证书解决chrome浏览器证书不可信问题记录
  6. Windows运行Nacos
  7. 修改windows的主机映射文件(hosts文件)
  8. distinct , in 的用法
  9. 【深度学习入门】- 神经网络
  10. Hexo+NexT 如何取消下划线