有效边表填充算法

填充原理

有效边表填充算法通过维护边表和有效边表,避开了扫描线与多边形所有边求交的复杂运算。填充原理是按照扫描线从小到大的移动顺序,计算当前扫描线与有效边的交点,然后把这些交点按x值递增的顺序进行排序、配对,以确定填充区间,最后用指定颜色填充区间内的所有像素,即完成填充工作。有效边表填充算法已成为目前最为有效的多边形填充算法之一。

边界像素处理原则

填充左下角为(1,1),右上角为(3,3)的正方形时,若将边界上的所有像素全部填充,就得到图示的结果。
这里写图片描述
在多边形填充过程中,常采用“左闭右开”和“下闭上开”的原则对边界像素进行处理。

这里写图片描述
局部最高点P1、P6和P4,共享顶点的两条边落在扫描线的下方;普通连接点P2,共享顶点的两条边分别落在扫描线两侧;局部最低点P0、P3和P5,共享顶点的两条边落在扫描线的上方。常根据共享顶点的两条边的另一端的y值大于扫描线y值的个数来将交点个数取为0、1和2。事实上,有效边表算法能自动处理这三类顶点。

有效边与有效边表

有效边

多边形与当前扫描线相交的边称为有效边(active edge)。在处理一条扫描线时仅对有效边进行求交运算,可以避免与多边形的所有边求交,提高了算法效率。有效边上的扫描线由起点到终点每次加1,即像素点的y坐标为y=y+1,x坐标的变化可以按如下方法推导。
这里写图片描述

有效边表

这里写图片描述

桶表与边表

从有效边表的建立过程可以看出,有效边表给出了扫描线与有效边交点坐标的计算方法,但是并没有给出新边出现的位置坐标。为了确定在哪条扫描线上插入了新边,就需要构造一个边表(edge table,ET),用以存放扫描线上多边形各条边出现的信息。因为水平边的1/k为∞,并且水平边本身就是扫描线,在建立边表时可以不予考虑。

桶表和边表的表示法

桶表是按照扫描线顺序管理边出现情况的一个数据结构。首先,构造一个纵向扫描线链表,链表的长度为多边形所占有的最大扫描线数,链表的每个结点称为桶(bucket),对应多边形覆盖的每一条扫描线。
将每条边的信息链入与该边最小y坐标(ymin)相对应的桶处。也就是说,若某边的较低端点为ymin,则该边就存放在相应的扫描线桶中。
对于每一条扫描线,如果新增多条边,则按x|ymin坐标递增的顺序存放在一个链表中,若x|ymin 相等,则按照1/k由小到大排序,这样就形成边表。
这里写图片描述

桶表与边表示例

这里写图片描述
这里写图片描述

猜你喜欢

转载自blog.csdn.net/jxch____/article/details/80724821