您的位置:首页 > 其它

矢量数据栅格化——多边形填充(二)

2009-09-26 20:13 225 查看
李泉 陈玉进(南京跬步科技有限公司http://www.creable.cn

举例说明如下:如图2,根据多边形的坐标信息,生成一个算法需要的表结构。生成此表的原则是:以多边形相邻两点组成的线段为单位,以与该线段相交的y坐标最大的扫描线为依据(其中仅仅有一条线与该线段相交的情况出现时,该线段的相关信息不记录到表中),将相关信息存储到表的Y桶中。例如:与线段S1相交的扫描线的y最大值为5,故S1的相关信息应该写入Y=5的扫描线中(Y桶中包含若干个扫描线)。
依照上述规则生成的表格如下(线段的信息就是前面设计的Node对象,其格式为(Xs,Ymin,xx)):
Y=1的扫描线上没有线段信息。
Y=2的扫描线上具有线段S5的信息(2,1,9.0)。
Y=3的扫描线上没有线段信息。
Y=4的扫描线上没有线段信息。
Y=5的扫描线上具有线段S1的信息(3,2,-0.33333333)。
Y=6的扫描线上没有线段信息。
Y=7的扫描线上具有线段S3的信息(9,5,-0.5)和线段S4的信息(9,1,0.33333333)。
下面根据上面生成的边表来计算每个扫描线与多边形交点的x坐标。以计算线段S1与扫描线的交点为例来说明计算方法。线段S1在边表中的信息是(3,2,-0.33333333),并且其处于Y=5的扫描线上,所以S1与5-2=3条扫描线具有交点,分别是Y=5、Y=4、Y=3这三条扫描线,Y=5扫描线上的交点x坐标就是之前记录下来的线段S1信息的Xs,即是3,Y=4扫描线上的交点x坐标=3+xx=3-0.33333333=2.66666667,Y=3扫描线上的交点x坐标=2.66666667+xx=2.66666667-0.33333333=2.33333334。将后二个交点插入到边表的Y桶中(第一个交点已在Y桶中)。经过此次运算之后,边表变成了如下格式(Y桶中的Node对象我们只列出Xs,以后的结果处理阶段只需要Node类的Xs数据成员)。
Y=1 无
Y=2 2
Y=3 2.33333334
Y=4 2.66666667
Y=5 3
Y=6 无
Y=7 9 9
再次采用上述方法,求线段S3与扫描线的交点,并插入边表的Y桶中,过程不在复述,结果如下:
Y=1 无
Y=2 2
Y=3 2.33333334
Y=4 2.66666667
Y=5 3
Y=6 8.5
Y=7 9 9
求线段S4与扫描线的交点,并插入边表的Y桶中,结果如下
Y=1 无
Y=2 2 10.6666665
Y=3 2.33333334 10.33333332
Y=4 2.66666667 9.99999999
Y=5 3 9.66666666
Y=6 8.5 9.33333333
Y=7 9 9
线段S5只与一条扫描线相交,而这个交点已经存在于边表中,故不在添加。至此交点计算完毕,下面进行栅格化工作,按照交点计算结果四舍五入之后,可以将该多边形栅格化为如图3所示的效果。将这些栅格填充之后可以达到填充多边形内部的目的。



凹多边形也是如此处理,需要注意的是边表中扫描线下可能具有n的交点(n必然是偶数),需要将1、2相连,3、4相连,依此类推。
具有内部环的多边形处理的方式大致和本文提供的方法一样,先根据多边形的外框线生成包含交点信息的边表,然后将所有内部环计算和扫描线的交点,并加入之前的边表,读者朋友可以自己试试。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: