一是当扫描线与顶点相交时,交点的取舍。当与那个顶点关联的边在扫描线同侧时,交点自然算两次,当与那个顶点关联的边在扫描线两侧时,交点只能算一次。我们使用“下闭上开”的办法。
二是多边形边界上的像素取舍,我们采用“左闭右开”的办法。
三是如何减少计算量。在绘制直线时,有一种DDA算法,它是利用(x,y)直接求出下一个点位于(x+1,y+m)或者(x+1/m, y+1)。在这里可以利用这一点。当已经得到y = e和多边形所有边的交点时,对于下一条扫描线y=e+1,如果没有新边与y=e+1相交,就可以推出y = e+1 和多边形所有边的交点。
四是如何计算第一条扫描线与多边形各个边的交点以及扫描线与新的边相交时的交点。可以把多边形所有边放入一个表中,对于每一条扫描线,就遍历这个表,求得交点。但是很多情况下,一条扫描线仅与少数几条边有交点,如果每次都遍历所有边,效率就会很低。所以我们仅对与该扫描线相交的边进行求交。这些与当前扫描线相交的边我们称之为“活性边”,把它们放入一个“活性边表”AEL中,这样每次遍历AEL就可以了。AEL中每一个结点都是一个边,它保存对应边的信息,比如扫描线与该边的交点,该边的两个顶点坐标(未必是四个坐标值,有可能是其他唯一确定一条边的等价信息)。
五是如何构造这个AEL表。上面说AEL中存放与当前扫描线相交的各个边,但是怎么知道所有边中哪一些和当前扫描线相交呢?显然,当前扫描线位于某条边最小y值和最大y值之间时,扫描线和那条边有交点。所以可以这样解决:建立一个边的分类表ET,将所有边按照其最小y值分类,放在表中对应位置,然后每一条边又包含有自己的最大y值,这样就可以知道是不是与扫描线有交点了。对于每一条扫描线,都先判断是否有新的边需要加入到AEL中,是不是有旧的边需要从AEL中删除。然后再遍历AEL求交点。
总结一下,求扫描线算法步骤如下: