CG-多边形扫描线填充算法详解

目录

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、算法的优缺点

优点:
对每个像素只访问一次
与设备无关
缺点:
数据结构复杂
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值