目录

1、基本思想

2、算法步骤

3、例题

4、算法的优缺点


1、基本思想

        对于一个多边形,用一组水平或垂直的扫描线进行扫描,求出每条扫描线与多边形的交点,这些交点将扫描线分割线段,将落在多边形内的所有线段上的每个像素点赋以给定的多边形填充色。简单来说就是用一段水平的扫描线,从下往上扫描一个多边形,将扫描线与多边形的交点记录,并用像素填上。

2、算法步骤

  1. 确定多边形所占有的最大扫描线数,得到多边形顶点的最小和最大y值(yminymax)。
  2. y=yminy=ymax进行扫描,每次用一条扫描线进行填充。

那么具体如何进行填充呢?

我们需要建立两个表:边表(ET)和活动边表(AET),即使用有序边表算法对扫描线进行转化。

边表用来对除水平边外的所有边进行登记,来建立边的记录 它的结构一般是这样↓

 活动边表当对某一条扫描线进行扫描转换时,我们只需要考虑与它相交的那些边线,为此需要建立一个只与当前扫描线相交的边记录链表,称之为活动边表

3、例题

以下图中的多边形为例,要求将这幅多边形填充

解:

1、先建立边表(ET):

扫描线从多边形最下方(ymin)扫到最上方(ymax),依次经过的边有:

y = 1时,经过直线 P2P3, P3P4, P4P5

y = 7时,经过直线 P1P2

y = 8时,经过直线 P1P0, P0P6

开始建立边表,边表的结构如下:

边表结构
​​​​

可以画出如下表图:

注意红色数字“6”,因为那一点恰好是极值点,所以ymax值应该取成ymax - 1,即 7 - 1 = 6。

原因是极值点可以看成是两条线的交点↓

两条相交的直线(因为太细了所以颜色有点淡)

将顶点放大↓

此处极值点相当于两个直线一上一下地相交

如何判断是否是极值点呢?

判断当前点是否是极值点,让相邻两个坐标的y轴分别与当前点的y轴相减,它们各自相减后的值,符号相同说明当前点是极值点,反之则不是。

建立完边表之后,开始建立活动边表(AET),AET表的建立过程就是有效地进行填充的操作,在这个期间不断地做以下工作:

1)合并ET表;

2x递增排序;

3)实施填充;

4)删除ymaxyj的边;

5)修改边记录xi=xi+1/m

6yj+1进入下一轮循环。

比如下图给了y=1到y=7的活动边表图↓

得到的坐标点依次是:

y=1时,(3,1)-(3,1) (8,1)-(8,1)

y=2时,(8/3,1)-(3.75,1) (7.5,1)-(8.5,1)

y=3时,(7/3,1)-(4.5,1) (7,1)-(9,1)

y=4时,(2,4)-(5.25,4) (6.5,4)-(9.5,4)

y=5时,(5/3,5)-(10,5) (此时另外两个顶点因为ymaxyj所以被删去)

y=6时,(10.5,6)

y=7时,(1,7)-(11,7)

······

逐步把得到的两个坐标点之间填充,直到把整个边表建立完,多边形的填充也就完成了。

4、算法的优缺点

优点:
对每个像素只访问一次
与设备无关
缺点:
数据结构复杂

CG-多边形扫描线填充算法详解相关推荐

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

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

  2. c++多边形扫描线填充算法_基于3DGIS技术的梯形格网构建及其简化算法设计

    传统矢量地图LOD绘制流程包含简化.剖分与渲染三个步骤.由上述分析可知,传统矢量地图LOD绘制流程中简化与剖分是两个独立的过程,重复的剖分计算导致其渲染效率相对低下.梯形格网方法解决了传统方法中重复剖 ...

  3. c++多边形扫描线填充算法_基于MATLAB的道格拉斯普克算法递归实现

    道格拉斯普克算法 (道格拉斯-普克)Douglas-Peukcer算法由D.Douglas和T.Peueker于1973年提出,是线状要素抽稀的经典算法.用它处理大量冗余的几何数据点,既可以达到数据量 ...

  4. c++多边形扫描线填充算法_python 小乌龟turtle画随机正多边形

    小乌龟turtle最后一篇了 多项随机画正多边形(3-10边) from

  5. 扫描线填充多边形算法详解与代码

    扫描线填充多边形算法详解与代码 首先给出已知信息:多边形结构体里面包含三个信息:顶点个数,顶点和颜色 class MyPolygon {public:int m_VerticeNumber;CPoin ...

  6. 多边形区域填充算法--扫描线填充算法(有序边表法)

    来源:https://blog.csdn.net/u013044116/article/details/49737585 二.扫描线算法(Scan-Line Filling) 扫描线算法适合对矢量图形 ...

  7. Matlab人脸检测算法详解

    这是一个Matlab人脸检测算法详解 前言 人脸检测结果 算法详解 源代码解析 所调用函数解析 bwlabel(BW,n) regionprops rectangle 总结 前言 目前主流的人脸检测与 ...

  8. C++中的STL算法详解

    1.STL算法详解 STL提供能在各种容器中通用的算法(大约有70种),如插入.删除.查找.排序等.算法就是函数模板,算法通过迭代器来操纵容器中的元素.许多算法操作的是容器上的一个区间(也可以是整个容 ...

  9. python画椭圆-python opencv圆、椭圆与任意多边形的绘制实例详解

    圆形的绘制 : OpenCV中使用circle(img,center,radius,color,thickness=None,lineType=None,shift=None)函数来绘制圆形 impo ...

最新文章

  1. 安装varish作为缓存和代理
  2. sql server 性能分析工具
  3. 谷歌浏览器Chrome developer tool详细介绍
  4. 2012我的这一年,2013时不我待
  5. Android接口测试工具Apizza,自定义API请求返回值,自定义请求相对路径
  6. 全球水储量分布图matlab代码,中国水能资源储量及分布特点分析(图)
  7. Java游戏开发中应始终坚持的10项基本原则
  8. tiny210 ubuntu下sd卡分区
  9. javase哪部分最难_JavaSe到底有多重要?
  10. 工业以太网与现场总线技术各自优缺点和应用
  11. 利用python快速视频格式转换 解决 Premiere 导入TS文件只有声音没有视频
  12. 做鼻子测试软件,美鼻小测试,测测你的鼻子有几分?
  13. ubuntu 1204 server xp 硬盘安装
  14. 05 Java 虚拟机.md
  15. 微信小程序——简单饮食推荐(四)
  16. Orphaned pod found - but volume paths are still present on disk的处理
  17. oracle常用errcode
  18. VMWare workstation 和 player区别
  19. 我的世界pc版服务器屏幕显示太大,《我的世界》:mc的自由度太高,服务器老是被破坏,服主一招搞定...
  20. 王者荣耀英雄全皮肤4K高清大图,python爬虫帮你保存下来

热门文章

  1. Linux中的软件 Nginx的部署
  2. 跨专业考计算机哪个专业好考吗,考研常识:跨专业考研好考专业?
  3. 大数据路线,大数据要学习什么知识技能
  4. C#宿舍管理系统(C#课程设计含源码)
  5. Android混淆心得
  6. ExtJs 第二章,Ext.form.Basic表单操作
  7. 配置路由器用SSH登陆
  8. 关闭vscode链接检查,去掉VSCODE 编辑器的链接下划线
  9. 【基础篇】MySQL系列之where条件查询
  10. mysql版本升级手册