• 扫描线算法是扫描转换多边形的常用算法,它充分利用了相邻像素之间的连贯性,避免了逐点判断和反复求交计算,达到了减少计算量和提高算法效率的目的。

  • 处理对象:非自交多边形 (边与边之间除了顶点外无其它交点)。开发和利用相邻象素之间的连贯性是光栅图形学算法的重要技巧。

  • 扫描线算法综合利用了区域的连贯性、扫描线的连贯性和边的连贯性等三种形式的连贯性。

  • **区域的连贯性:**相邻两条扫描线构成一个水平长方形区域,并被多边形的边分割为若干梯形(一类位于多边形的内部;另一类在多边形的外部,且间隔排列)。只需知道该区域内任一梯形中一点关于多边形的内外关系,即可确定区域内所有梯形关于多边形的内外关系。

  • **扫描线的连贯性:**区域的连贯性在一条扫描线上的反映;

  • **边的连贯性:**某条边与当前扫描线相交,也可能与下一条扫描线相交。可通过与当前扫描线的交点计算与下一扫描线的交点(利用斜率)。(区域的连贯性在相邻两扫描线上的反映)

算法的具体实现步骤:

  1. **求交点:**求出扫描线与多边形所有边的交点
  2. **交点排序:**把这些交点按x坐标值以升序排列
  3. **配对:**对排序后的交点进行奇偶配对
  4. **填色:**对每一对交点间的区域进行填充

数据结构:

与当前扫描线相交的边称为活性边(Active Edge),把它们按与扫描线交点x坐标递增的顺序存入一个链表中,称为活性边表AET (AEL, Active Edge List)。它记录了多边形边沿扫描线的交点序列。
新边表(NET)存放在一条扫描线中第一次出现的边。若某边的较低端点为ymin,则该边就放在扫描线ymin的新边表中。
AET,NET存放信息:
ymax:边所交的最高扫描线;
x:当前扫描线与边的交点;
Δx:从当前扫描线到下一条扫描线之间的x增量

扫描转换如下三角形:顶点为:(80,120),(20,30),(150,50)。(扫描线算法)
代码来源:多边形的扫描转换算法

#include <iostream>
#include <GL/glut.h>
#include <windows.h>
const int POINTNUM = 3;
//链表的实现
typedef struct XET {float x;float dx, ymax;XET* next;}AET, NET;
//结构体对于某一个点的实现
struct point {float x;float y;
}
void PolyScan() {int MaxY = 0;int i;for (i = 0; i < POINTNUM; i++) {if (polypoint[i].y > MaxY)MaxY = polypoint[i].y;}//选出最大的顶点所对应的y值AET* pAET = new AET;pAET->next = NULL;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);//一个点跟前面的点形成一条线段,同时跟后面一个点形成线段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;}}}}//把新边表net[i]中的边节点用插入排序法插入AET表,使之按照x的坐标递增顺序排序for (i = 0; i <= MaxY; i++) {NET* p = pAET->next;while (p) {p->x = p->x + p->dx;p = p->next;}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表,把配对交点的区间(左闭右开)上的像素(x,y)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;}}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 main(int argc, char* argv) {glutInit(&argc, &argv);//窗口的初始化glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);//窗口谋模式的设定glutInitWindowPosition(50, 100);//窗口位置的设定glutInitWindowSize(400, 300);//窗口大小的设定glutCreateWindow("多边形扫描转换算法");glClearColor(1.0, 1.0, 1.0, 0.0);glMatrixMode(GL_PROJECTION);gluOrtho2D(0.0, 600.0, 0.0, 450.0);glutDisplayFunc(PolyScan);//调用函数glutMainLoop();
}

多边形的扫描转换算法——扫描线算法(计算机图形学)相关推荐

  1. matlab多边形扫描线填充算法代码,计算机图形学—多边形扫描与填充

    [实例简介] 包含了AET扫描算法.边界填充法.四连通种子算法 [实例截图] [核心代码] 63815b9f-1212-4c77-8732-11bf70c1ca86 └── 多边形扫描及填充 ├── ...

  2. (计算机图形学)多边形的扫描转换算法——边界标志算法

    多边形的扫描转换算法--边界标志算法 边界标志算法基本思想 -帧缓冲器中对多边形的每条边进行直线扫描转换,亦即对多边形边界所经过的象素打上标志. –然后再采用和扫描线算法类似的方法将位于多边形内的各个 ...

  3. DDA直线生成算法|MFC|计算机图形学

    DDA直线生成算法|MFC|计算机图形学|保姆篇 1.如何创建MFC编译环境? 点击工具->获取工具和功能 2.创建MFC编辑窗口 3.进入到MFC编辑窗口后 1)设计窗口,修改ID 2)添加事 ...

  4. 中点Bresenham画圆算法|MFC|计算机图形学

    中点Bresenham画圆算法|MFC|计算机图形学 Bresenham中点画圆算法 计算机图形学-基本图元的生成-圆 基于学习直线的生成算法后,又展开了圆.椭圆的讲解: 此次试验是简单的MFC应用, ...

  5. 计算机图形学常见算法原理,计算机图形学常用算法及代码大全

    <计算机图形学常用算法及代码大全>由会员分享,可在线阅读,更多相关<计算机图形学常用算法及代码大全(41页珍藏版)>请在人人文库网上搜索. 1.2.1.1 生成直线的DDA算法 ...

  6. c语言消隐算法实现,计算机图形学试卷.doc

    PAGE 计算机图形学试题 共 NUMPAGES 6页 第 PAGE 1页 卷号:5029 浙江广播电视大学2005年上半年期末考试 计算机科学与技术专业(开放本科) 计算机图形学基础 试题(B卷) ...

  7. 计算机图形学曲线算法代码,计算机图形学自由曲线绘制算法.doc

    计算机图形学自由曲线绘制算法 宁夏师范学院数学与计算机科学学院 <>实验报告 实验序号: 实验项目名称: 学 号姓 名专业.班实验地点指导教师时 间.实验内容与步骤 1 //TestVie ...

  8. 多边形的扫描转换算法——边界标志算法(计算机图形学)

    边界标志算法基本思想: 帧缓冲器中对多边形的每条边进行直线扫描转换,也就是对多边形边界所经过的像素打上标志.然后再采用和扫描线算法类似的方法将位于多边形内的各个区段着色. 使用一个布尔量inside来 ...

  9. java代码隐藏面消除算法_计算机图形学—— 隐藏线和隐藏面的消除(消隐算法)...

    一.概述 由于投影变换失去了深度信息,往往导致图形的二义性.要消除二义性,就必须在绘制时消除被遮挡的不可见的线或面,习惯上称作消除隐藏线和隐藏面(或可见线判定.可见面判定),或简称为消隐.经过消隐得到 ...

最新文章

  1. eclipse svn 与资源库同步 符号说明
  2. JStorm与Storm源码分析(二)--任务分配,assignment
  3. CCF - 201509-2 - 日期计算
  4. 机器人峰会王伟_【“峰”景独好】大美中国探春中国机器人峰会举办地——浙江宁波余姚...
  5. HDVPSS模块介绍及使用
  6. windows 设置ssh登录
  7. SLAM_汇总 | 视觉/激光/多传感器融合SLAM重点知识点
  8. hdu1166 敌兵布阵(模板题 单点修改 + 区间查询)
  9. DNS域传送漏洞(CVE-2015-5254)
  10. 【计算机网络】根据IP地址计算网络地址
  11. Python——全国二级等级考试
  12. 退款单号在微信支付申请退款中的重要性
  13. CDOJ1323柱爷的下凡
  14. 多线程(一)线程与进程、Thread
  15. linux服务器安装vncserve过程记录
  16. (跟我一起来学区块链(1.3))之区块链的起源与发展
  17. [转]火爆背后的挑战:直播平台的高并发架构设计
  18. Spark 调度模式-FIFO和FAIR
  19. 关于局域网共享excel链接问题
  20. (转)【解析】能力考N2各部分特点及解题关键

热门文章

  1. 常见的主流自动化测试框架,这5种能帮到你很多
  2. MongoDB迁移方案
  3. pos共识机制_PoS共识机制是什么?其优缺点分别是什么?
  4. ios 运行 release 版本
  5. 第47章 表单验证之DataAnnotations与FluentValidation
  6. GDPR条例的12项重点分析
  7. Distinct语法的使用
  8. 华为防火墙虚拟系统实验
  9. VL53L0X调试总结
  10. UE4 将项目压缩成最小的Zip压缩包