多边形的扫描转换与区域填充

时间:2024-04-04 09:19:12

目录


在正式介绍多边形的扫描转换之前,先介绍点背景知识,不想看的可以直接跳过。

一、背景知识

在计算机图形学中,多边形有两种重要的表示方法。

顶点表示

  • 用多边形的顶点序列来刻画多边形
  • 顶点表示的特点:
    表示方法直观,几何意义强,占内存空间少,但是没指明哪些像素在多边形内,不能直接用于着色
    多边形的扫描转换与区域填充

点阵表示

  • 用位于多边形内部或者边界上的像素集合来刻画多边形
  • 点阵表示特点:
    点阵表示会失去很多重要的几何信息,但是它是光栅显示系统显示面着色时所需的图形表示形式。

二、多边形的填充方式

1.多边形扫描转换

顶点表示不能直接用于显示,必须要进行从多边形顶点表示点阵表示的转换,这种转换就是给多边形包围的区域着色的过程。
即从多边形的给定边界出发,求出位于其内部的各个像素,并将其灰度和颜色值写入帧缓存中相应的单元,主要用来填充多边形区域以及由多边形拟合的其他简单曲线区域。

1.1 逐点判断算法

基本思想

逐个判断绘图窗口内的像素,确定它们是否在多边形区域内部,从而求出位于多边形区域内的像素的集合。实现扫描转换多边形最简单方法就是逐点判断。

实质

进行多边形对平面上的点的包含性检查

常用方法

  • 射线法
    由被测点向某个方向作射线,计算此射线与多边形所有边的交点个数,用交点分布的奇偶性判别多边形与点的关系。判断依据:奇内偶外,
    特殊情况遵循:左闭右开
  • 弧长法(不讲)

1.2 扫描线填充算法

区域特点

  • 一条扫描线上的像素存在着相关性
  • 在多边形边处,像素性质才发生变化
  • 将相邻像素放在一起测试,从而减少测试点的数目
    多边形的扫描转换与区域填充

基本思想

按照扫描线顺序,先计算出扫描线与多边形区域边界的交点,然后判断扫描线上的哪些部分在区域边界之内,再用要求的颜色显示边界内的像素。

实现

依次考察各条扫描线,一条扫描线从左至右与多边形的交点是成对出现的,即A,B点,C,D点之间的像素都位于多边形之内,则A、B为一个区段,C、D为一个区段。对这些区段内的像素用指定的颜色进行填充后,就完成了该扫描线的填充工作,再继续扫描下一跳扫描线。
多边形的扫描转换与区域填充
一般多边形的填充过程,对于一条扫描线,步骤为:
多边形的扫描转换与区域填充

存在问题

交点的个数必须是偶数才能保证填充的正确性。

1.当扫描线与多边形的顶点相交时,会出现异常情况。

多边形的扫描转换与区域填充

这里引入一个概念-奇点
当扫描线与多边形P的交点是P的顶点时,则称该交点是奇点。
如何取舍顶点,保证交点正确配对?即如何保证交点数是偶数呢?
下面的这个具体实现讲解的非常清楚。
多边形的扫描转换与区域填充

2.取整问题
  • 扫描线与多边形边界交点坐标值不为整数

解决方法:当扫描线与多边形边界交点坐标为小数值时,如果多边形在此边界右侧,则将该小数值进1作为边界点,否则舍去小数部分并进行填充,这样可以使多边形不扩大。

3.水平边问题

扫描线与多边形的水平边相交时,交点理论上是无穷多个。
解决方法:

  • 对于多边形的水平边,不计水平边与射线的交点。
4.多边形边界上像素的取舍问题?如何避免填充扩大化?

若将多边形边界看成是多边形内部,并对它们填充,则该多边形会被放大。
解决方法:
采取“左闭右开,下闭上开”的方法,即将左、下边界像素视为多边形内部,需要填充,而右上边界作为多边形外部,不予填充。
多边形的扫描转换与区域填充

求交点的方法

求交点是通过边表和活性边表这两个数据结构来求的,具体参加下列博客。
活性边表
边表

2.区域填充

暂不研究

未完待续