目录
1、基本思想
对于一个多边形,用一组水平或垂直的扫描线进行扫描,求出每条扫描线与多边形的交点,这些交点将扫描线分割线段,将落在多边形内的所有线段上的每个像素点赋以给定的多边形填充色。简单来说就是用一段水平的扫描线,从下往上扫描一个多边形,将扫描线与多边形的交点记录,并用像素填上。
2、算法步骤
- 确定多边形所占有的最大扫描线数,得到多边形顶点的最小和最大y值(ymin和ymax)。
- 从y=ymin到y=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表;
(2)x递增排序;
(3)实施填充;
(4)删除ymax=yj的边;
(5)修改边记录xi=xi+1/m;
(6)yj+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) (此时另外两个顶点因为ymax=yj所以被删去)
y=6时,(10.5,6)
y=7时,(1,7)-(11,7)
······
逐步把得到的两个坐标点之间填充,直到把整个边表建立完,多边形的填充也就完成了。