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

本文介绍了一种基于扫描线的多边形栅格化算法,通过构建特殊表结构存储多边形各边与扫描线的交点信息,进而完成多边形内部的填充。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

李泉 陈玉进(南京跬步科技有限公司http://www.creable.cn

举例说明如下:如图2,根据多边形的坐标信息,生成一个算法需要的表结构。生成此表的原则是:以多边形相邻两点组成的线段为单位,以与该线段相交的y坐标最大的扫描线为依据(其中仅仅有一条线与该线段相交的情况出现时,该线段的相关信息不记录到表中),将相关信息存储到表的Y桶中。例如:与线段S1相交的扫描线的y最大值为5,故S1的相关信息应该写入Y=5的扫描线中(Y桶中包含若干个扫描线)。

       依照上述规则生成的表格如下(线段的信息就是前面设计的Node对象,其格式为(XsYminxx)):

Y=1的扫描线上没有线段信息。

Y=2的扫描线上具有线段S5的信息(219.0)。

Y=3的扫描线上没有线段信息。

Y=4的扫描线上没有线段信息。

Y=5的扫描线上具有线段S1的信息(32-0.33333333)。

Y=6的扫描线上没有线段信息。

Y=7的扫描线上具有线段S3的信息(95-0.5)和线段S4的信息(910.33333333)。

       下面根据上面生成的边表来计算每个扫描线与多边形交点的x坐标。以计算线段S1与扫描线的交点为例来说明计算方法。线段S1在边表中的信息是(32-0.33333333),并且其处于Y=5的扫描线上,所以S1523条扫描线具有交点,分别是Y=5Y=4Y=3这三条扫描线,Y=5扫描线上的交点x坐标就是之前记录下来的线段S1信息的Xs,即是3Y=4扫描线上的交点x坐标=3xx30.333333332.66666667Y=3扫描线上的交点x坐标=2.66666667xx2.666666670.333333332.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必然是偶数),需要将12相连,34相连,依此类推。

具有内部环的多边形处理的方式大致和本文提供的方法一样,先根据多边形的外框线生成包含交点信息的边表,然后将所有内部环计算和扫描线的交点,并加入之前的边表,读者朋友可以自己试试。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值