一种矢量多边形栅格化的算法及系统的制作方法_2

文档序号:9433576阅读:来源:国知局
,这样,可以把它们这一行连通的网格点全部标记起来,直接跳到下个未标记的网格点做类似的处理;由于连通的网格点和上方也是连通的情况很多,所以这一信息会大大减少求交计算的次数,使得每一行的标记非常容易进行;从本发明的理论上可以得知,对于大多数情况,只需要进行一行的求交计算,便可以利用前一行的内外性质来填充整个多边形,这一点和种子填充的性质很像,充分利用了种子填充的连通区域特性,并且摒弃了种子填充的不足;由于它极大地减少了求交计算量,因此它极大地加快了算法栅格化多边形的速度;而对比单纯的扫描线算法,由于扫描线算法每一行都会重新计算交点并且排序,因此相比较本发明的算法而言,扫描线算法会大大影响效率,使得交点计算,交点排序成为性能瓶颈(若多边形形状复杂,则交点可能很多个),即扫描线算法会做M次交点计算并排序的过程,而本发明算法只做约一次交点计算即可,大大提高了栅格化的速度。
[0027]进一步,所述被标记的网格点为网格区域中的网格点与多边形的边相交的交点,所述未标记的网格点为网格区域中除被标记的网格点之外的网格点。
[0028]进一步,在S4.3和S4.4中,若与该平行线段相交的多边形的线段的条数为0,则规定穿越的条数为偶数条。
[0029]基于上述一种矢量多边形栅格化的算法,本发明还提供一种矢量多边形栅格化的系统。
[0030]一种矢量多边形栅格化的系统,包括栅格化区域设置模块、线段对象数组生成模块、边信息生成模块、索引集合生成模块和栅格化结果生成模块;
[0031]所述栅格化区域设置模块,其用于将待处理的区域进行网格分割,在网格区域内设置多边形生成多边形的栅格化区域;
[0032]所述线段对象数组生成模块,其用于生成多边形的边的线段对象数组;
[0033]所述边信息生成模块,其用于遍历组成多边形的每一条线段,并利用多边形的边的线段对象数组生成边信息;
[0034]所述索引集合生成模块,其用于根据生成的边信息计算每一行与多边形相交的线段的索引集合;
[0035]所述栅格化结果生成模块,其用于通过线段的索引集合,判断不在多边形上的网格点的内外性质生成栅格化结果。
[0036]在上述技术方案的基础上,本发明还可以做如下改进。
[0037]进一步,所述栅格化结果生成模块生成栅格化结果的具体步骤为,
[0038]S4.1,通过生成的线段的索引集合与网格区域中第i行平行直线相交,使得多边形的边的线段在第i行的网格点进行求交计算,得到一系列连续的未标记网格点和一系列连续的被标记的网格点;
[0039]S4.2,对每个未标记的网格点进行判断,判断预设的未标记的网格点的左边的网格点是不是未标记的网格点,若是,执行S4.3,若不是,执行S4.4 ;
[0040]S4.3,以预设的未标记的网格点的中心为一个端点沿X正轴做平行线段,平行线段的另一个端点为当前要处理的网格点的中心,记录与该平行线段相交的多边形线段的条数,如果是奇数条,则当前要处理的网格点与预设的未标记的网格点的内外性质相反,而若是偶数条,当前要处理的网格点与预设的未标记的网格点的内外性质相同,执行S4.5 ;
[0041]S4.4,继续往左寻找直到找到未标记的网格点或者是找到最左边的网格点,则取位于多边形的左边的任意一个在网格行中线上的未被标记的网格点为端点沿X正轴做平行线段,平行线段的另一个端点为当前要处理的网格点的中心,记录与该平行线段相交的多边形的线段的条数,如果是奇数条,则当前要处理的网格点与多边形的左边的当前行中任意一个未被标记的网格点的内外性质相反,而若是偶数条,则当前要处理的网格点与多边形的左边的当前行中任意一个未被标记的网格点的内外性质相同,执行S4.5 ;
[0042]S4.5,根据每行网格点的内外性质逐行进行数据填充生成栅格化结果。
【附图说明】
[0043]图1为本发明一种矢量多边形栅格化的算法的流程图;
[0044]图2为本发明一种矢量多边形栅格化的系统的框图。
【具体实施方式】
[0045]以下结合附图对本发明的原理和特征进行描述,所举实例只用于解释本发明,并非用于限定本发明的范围。
[0046]如图1所示,一种矢量多边形栅格化的算法,包括以下步骤,
[0047]SI,将待处理的区域进行网格分割,在网格区域内设置多边形,生成多边形的栅格化区域,并生成由多边形的边组成的线段对象数组;生成多边形的边的线段对象数组的方法为,根据多边形的边数建立一个边信息集合,通过为边信息集合分配内存并初始化生成长度为多边形的边数的线段对象数组。
[0048]S2,遍历组成多边形的每一条线段,并利用线段对象数组生成边信息;生成边信息的方法为,首先遍历组成多边形的每一条线段,计算每条线段的起始行索引和终止行索引,计算多边形的跨行数据,计算组成多边形的所有线段从起始行到终止行的方向与栅格行边界第一次相交的交点值X,计算每条线段与栅格行边界相交的相邻两个交点之间的X递增量,计算起始行所对应线段的端点值Xl和终止行所对应线段的端点值X2 ;然后将起始行索弓丨、终止行索引、多边形的跨行数据、X、X递增量、Xl和X2存储在步骤SI中生成的线段对象数组中,生成边信息。
[0049]S3,根据生成的边信息计算网格的每一行与多边形相交的线段的索引集合;计算线段的索引集合的方法为:S3.1,临时生成长度为M且存储有链表指针和链表的链表数组T,其中M代表网格的行数;S3.2,将S2中生成的边信息的起始行和终止行在链表数组T中找到相对应的链表,并在相对应的链表中添加起始行和终止行所对应的多边形线段的索引值;S3.3,生成长度为M的指针数组TP,并将链表数组T中的数据拷贝到指针数组TP指向的数组中;S3.4,删除链表数组T和链表占用的内存,得到每一行与多边形相交的线段的索引集合。
[0050]S4,通过线段的索引集合,判断不在多边形上的网格点的内外性质生成栅格化结果;生成栅格化结果的具体实现为:S4.1,通过S3生成的线段的索引集合与网格区域中第i行平行直线相交,使得多边形的边的线段在第i行的网格点进行求交计算,得到一系列连续的未标记网格点和一系列连续的被标记的网格点;S4.2,对每个未标记的网格点进行判断,判断预设的未标记的网格点的左边的网格点是否为未标记的网格点,若是,执行S4.3,若不是,执行S4.4 ;S4.3,以预设的未标记的网格点的中心为一个端点沿X正轴做平行线段,平行线段的另一个端点为当前要处理的网格点的中心,记录与该平行线段相交的多边形线段的条数,如果是奇数条,则当前要处理的网格点与预设的未标记的网格点的内外性质相反,而若是偶数条,当前要处理的网格点与预设的未标记的网格点的内外性质相同,执行S4.5 ;S4.4,继续往左寻找直到找到未标记的网格点或者是找到最左边的网格点,则取位于多边形的左边的任意一个在网格行中线上的未被标记的网格点为端点沿X正轴做平行线段,平行线段的另一个端点为当前要处理的网格点的中心,记录与该平行线段相交的多边形的线段的条数,如果是奇数条,则当前要处理的网格点与多边形的左边的当前行中任意一个未被标记的网格点的内外性质相反,而若是偶数条,则当前要处理的网格点与多边形的左边的当前行中任意一个未被标记的网格点的内外性质相同,执行S4.5 ;S4.5,根据每行网格点的内外性质逐行进行数据填充生成栅格化结果。
[0051]所述被标记的网格点为网格区域中的网格点与多边形的边相交的交点,所述未标记的网格点为网格区域中除被标记的网格点之外的网格点。在S4.3和S4.4中,若与该平行线段相交的多边形的线段的条数为0,则规定穿越的条数为偶数条。
[0052]在本实施例中,以单个矢量多边形栅格化的算法为例,进行具体的实施例说明。
[0053]算法开始,首先是设置格网范围,以及格网行数和列数。即将待处理的区域进行网格划分,设行数为M,列数为N,然后设置要栅格化的多边形,计算多边形边的数量为L,建立边信息集合并初始化其内存,生成长度为L的线段对象数组。
[0054]下一步是生成边信息。遍历每一条多边形的线段,计算它的起始的行索引、终止的行索引、多边形的跨行数据(即多边形边是否与行边界线相交)、多边形边与网格行边界第一次相交的交点X值(从起始行往终止行的方向)、多边形边与网格行边界相交相邻两个交点之间的X递增量、起始行所对应线段的端点值X1、终止行所对应线段的端点值X2,并将其存储在预先分配好的线段对象数组中,即完成边信息生成工作。
[0055]接着是利用生成的边信息,计算网格的每一行与多边形相交的线段的索引集合。首先临时生成长度为M的链表数组T,链表数组T里存储的是链表头指针,这里可以采取先用链表的方式存储链表数组T,可以在上一步中,利用每次生成的起始行和终止行,在链表数组T里找到相对应的链表,添加本线段的索引值;当整个过程做完后,再生成长度为M的指针数组TP,指针数组TP存储的是每个大小为每个链表大小的数组;将链表数组T里的数据拷贝到指针数组TP指向的数组里,再删除链表数组T和链表占用内存,这样,就完成与多边形相交的线段索引集合的计算。在这一步中,计算与多边形相交的线段索引集合的主要作用是,得到网格中的每一行与多边形相交的线段索引集合,能够最快最直接地查找网格中的每一行与本行相交的多边形的线段,再进行下一步操作;由于这个集合是数组形式,找出来之后会特别节省内存,遍历速度也会非常快,因此这一步并没有消耗多少计算时间和内存空间的行为得到了极大的查找便利。
[0056]最后是得到网格点的内外性质进行数据填充生成栅格化结果。在这一步里,可以采取从上到下或者从下到上的方式逐行生成填充数据。假设现在是处理到了第i行,那么下面要做的事情也会细分为几个小步骤:
[0057]第一步
当前第2页1 2 3 4 5 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1