原理
如下图所示多边形:
简述
直线y=1,2,3……8顺序扫描多边形,以直线y=3为例,它与多边形的边有4个交点,将这4个交点的x坐标保存下来,两两之间画线,也就是(A,B)(C,D)之间画线。对于每一个y都是两两之间画线。现在考虑直线y=2,它与多边形有3个交点,很显然是F,G之间画线,那么p1怎么处理呢?可以观察到p1是多边形边的一个端点,是两条边的交点,因此,可以选择将p1看作两个点存储,这样(p1,p1)之间画线,就是描一个点。或者不存储p1,只在(F,G)之间画线。我采用的是不存储p1。
活性边表
具体每一条扫描线对应的坐标存储在活性边表Aet中,每一条扫描线对应一个链表,链表中的节点类型为
其中,x为交点的x坐标,dx为相交直线的x方向增量(x2-x1)/(y2-y1),ymax为直线可以到达的最大y值。由于我采用的是当扫描线与边的端点相交时不存储此交点,所以,扫描线y=1的Aet中没有存储坐标,y=2中不存储p1,只存储F,G的x坐标以及F,G所在直线的斜率倒数。
x | dx | ymax | next |
新边表
新边表Net用来记录y为多少时与新的边相交,每一条扫描线也对应一个链表,结点类型和Net中的结点类型相同。
如图中的新边表中,y=1应该记录 (p2,p3),(p4,p3)两条直线的信息;y=2应该记录(p1,p6),(p1,p2)两条直线的信息,y=6记录(p4,p5)一条边的信息,y=7记录(p6,p5)一条边的信息。