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

文档序号:9433576阅读:来源:国知局
改为并行算法,而后者需要注意插入每一行数据时的同步问题。若采用一个进程,多线程的算法,很容易实现。而若采用多进程算法(在这里的并行模型中,将单机多进程和局域网多进程均看作是统一的多进程模型,采用统一的机制通信。),不需要注意后者的同步问题,但计算完后需要将数据归一到一起,这时需要单个进程来执行。而对于一般的应用而言,第一步和第二步消耗的时间非常微小,无论是采用哪种方法,都是可以的。
[0073]假设第一步、第二步中我们采用了多线程的方法,计算完边信息和索引集合。在第三步中,需要对每一行计算填充情况数组。这里无论采用什么策略,我们都希望能够尽量得到优化,所以第三步中将行按照顺序来分割,同个计算单元分得的行是连续的,并且我们需要把这些相应的边信息和索引集合分发到各个计算单元(计算单元,指的是一个线程或者一个进程)。由于本算法的模型可以对任意区域,任意格网大小进行处理,因此这里不同的计算单元计算结果都不会受到任何影响,也就是说,我们可以把每个计算单元的处理,当作是独立的任务来进行。这样,其实把整个算法作为一个整体,将计算任务按照行来分割也是可以的,这就是数据并行策略。
[0074]如果是数据并行策略,那么每个计算单元从第一步的时候,就可以独立开来。边信息和索引集合可以只计算计算单元负责的行就可以了。
[0075]由此讨论,我们可以引申出一个道理,那就是这种多边形的填充,每个计算单元,真正关心的部分是与计算单元负责的行集合往左无限延伸的多边形线段集合。而其他的多边形线段集合,则和算法的结果没有关系。
[0076]现在假设有一个非常复杂的多边形,其包含的线段数非常多,即数据量非常大。而现在的需求是需要对其进行高精度的清染,单个计算单元很可能都无法装载下计算一行需要的内存(有些夸张,但为了说明理论上的支持程度,就举这个极端例子)。由本算法的性质可知,从高精度往低精度上转是可以进行的,即选取适当的行列比例,先计算出网格点设置较大时,多边形栅格化的结果。而这个网格点的格网高度,宽度和起点也不是胡乱设置的,选择的格网高度和宽度应该恰好是包含整数倍的高精度格网的高度和宽度(倍数可以不一致),并且每个格网的角点需要和高精度格网的角点重合。这样,这种放缩就会发生边界扩充的情况,但是也不会超过大格网的一行和一列。而大的格网点对应的高精度格网点的计算,则交由一个独立的计算单元来完成。
[0077]现在对这个大的格网进行多边形填充计算。计算完成后,格网值为O和2的大的格网点对应的高精度格网点的格网值无需再进行计算,直接赋值即可。而格网值为I的格网点中存在有多边形的边与之相交,因此需要再进行计算。
[0078]现在再来处理这个高精度的格网点。由本发明的性质可知,需要处理的高精度的格网计算单元,其相交的多边形线段正好是与大的格网点相交的多边形线段是相同的。从要处理的计算单元对应的大的格网点出发向左找到连续的与多边形相交的格网点,与这些格网点相交的线段则是当前计算单元需要的所有的多边形线段,而再往左一个格网点的内外情况则是当前计算单元的初始内外情况,可代入到前面讨论的单个多边形栅格化的算法中去讨论。若往左没有格网点了,则这个初始内外情况就是在多边形的外部。
[0079]将这些细化了的多边形线段再来与每个分别的格网计算单元进行计算,得到最终的结果。这种策略能够大大减少不必要的计算量,主要是有两个方面提升:一是大的格网点判断内外之后,高精度的格网点不用再判断直接得到结果了 ;二是每个需要独立计算的计算单元,不需要再遍历整个很大很复杂的多边形了,直接能够得到影响它的多边形线段和初始内外情况。
[0080]下面再来看看,大数据量多边形需要栅格化,本发明的应对策略情况。
[0081]假设现在有非常多的多边形,个数为N,其范围为Dx,Dy。那么现在要做的是,如何利用多个计算单元来并行处理这一栅格化的任务。在这里,我们假设将行列范围划分为MXN个,那么多个计算单元只需要从MXN的队列中取出相应的计算任务进行计算即可。这MXN个小的范围,本身需要考虑的多边形的数量是有限的,只需要关心与之相交的多边形即可,因此,在最开始进行队列划分时,我们可以先把小范围相交的多边形索引找好。还是采用先生成MXN个链表,最后再把链表变成数组的方式。在这里,我们遍历每个多边形,用它的外接矩形范围来查找与之相交的小的范围,就像前面所讨论的查找与矩形相交的多个格网一样,将所有的相交的小的范围对应的链表加上当前多边形的索引。完成这一过程后,每个小的范围相交的多边形就找出来了。和单个多边形栅格化的第一步类似,这一过程可以用多线程来完成,但是需要注意同步。
[0082]现在再来看,单个计算单元对单个小的范围的处理。此时的问题已经可以化简为,同时栅格化有限多个多边形。提到同时,则可以采用并行的思路(单个计算单元为进程的时候,可以采用多线程)。这里,对一个更小的计算单元而言(如果不采用并行,就是指一个多边形的计算),将多边形的范围与当前要处理的小范围求交得到一个更小的范围,这个更小的范围是当前要处理的小的范围的一个子集,并且网格点的大小和当前要处理的小范围网格点相等,并且网格点全部位于当前要处理的小范围网格点内。对这个更小的范围进行多边形栅格化,则是前面我们所讨论的单个多边形栅格化的思路。
[0083]小范围的多个多边形栅格化完成后,则是在当前的小范围内进行进一步处理的过程。这里因为每个多边形的索引已知,具体采用什么方法来渲染,是多值填充,还是Alpha混合,还是图案填充,都是具体的应用再来考虑了,这里没有必要再做进一步的讨论。
[0084]不管是什么样的场景,本发明提供的算法都能给出有效的解决,所不同的只是策略。在场景中,往往会综合使用不一样的策略,比如遇到大量多边形填充的时候,可能单个多边形也会很复杂还需要进行高精度的填充,这时候就是前面讨论的第一种高精度填充的情况;还比如精度要求非常非常高,则可能需要不断地将网格扩大两次甚至多次,以满足高精度填充的需求。但是无论怎么样,本发明的算法均可以满足,它在理论上,是支持任意分辨率任意长宽任意范围的多边形填充的。具体采用何种策略,还需要看数据如何,需求如何。
[0085]南京大学提供的《基于扫描线法的多边形栅格化并行转换方法》,仅提供了一种具体采用MPI和GDAL进行多边形栅格化并行转换的方案,但它没有考虑到的是:第一、按照行来分块处理多边形栅格化,如果列数非常多,单个计算单元可能都无法装下那么多内存,或者只能分一到两行。这样每一行都需要进行一次真正的求交计算,非常浪费计算性能;第二、每个划分单元是通过空间查询得到与划分单元相交的多边形的,设划分单元数为n,多边形个数为m,则单次查询的算法复杂度为O(1gm),总共是O (n (1gm))(理想情况下)。而本发明提供的方法是0(m),实际上由于做空间查询的时候还需要大量读取硬盘,其效率远不如遍历多边形的外接矩形来得高;三、处理的多边形数据量和栅格精度都是有限的,并且单个划分单元栅格化的时候并没有进行并行处理。即多个多边形进行栅格化的时候仍是串行处理的。从提供的代码里可以看出,每一扫描行处理时均会遍历所有相交的多边形的每一条边,然后计算每一条边与当前扫描行的扫描线的交点。计算完交点之后,再对所有交点进行排序,填充两两交点之间的扫描行。(不知是不是公布的版本的原因,这个代码里有个BUG,就是对于多边形的边端点y值都在当前的行范围内时,就不计算扫描线与边的交点了,而是在当第一个端点X值大于第二个端点X值时,将它跨过的网格范围做标记。这样若恰好出现端点都在该行的情况那么正常来讲的交点之间的网格都不会被填充。)这里存在的问题就是没有针对不同的多边形采用不同的填充,全都是填充成一样的内容,不够通用;并且若多边形之间存在相交的情况,这种填充方法就会产生问题,出来的结果或许就和我们想象的不同(虽然在GIS中,大多数情况下要求同一个数据集下面的多边形是不允许相交的,但是对于一般化的多边形填充,例如二维动画里的多边形填充、2D游戏里的多边形填充,都是允许多边形相交的,因此这是这个算法里的限制之处。)。第四点就是采用的扫描线算法本身相对本文的发明来说是不够优化的,因此整体效率会比本发明要低很多。
[0086]本发明一种高效的矢量多边形高精度栅格化算法,采用逐行栅格化的方式,在每一行栅格化的计算中,都用到了上一行的栅格化结果,由多边形的性质和种子填充算法的思想很容易得知,若相邻的两个网格点均不与多边形相交,则称它们是连通的,连通的网格点都位于多边形内部或者多边形外部,即其内外性质相同;那么在处理某个未标记的网格点时,可以一并找出其左右和上方所有连通的网格点,若上方能找到连通的网格点,则它们的内外性质就可以直接由上方的网格点来决定,而不用再做求交计算,这样,可以把它们这一行连通的网格点全部标记起来,直接跳到下个未标记的网格点做类似的处理;由于连通的网格点和上方也是连通的情况很多,所以这一信息会大大减少求交计算的次数,使得每一行的标记非常容易进行;从本发明的理论上可以得知,对于大多数情况,只需要进行一行的求交计算,便可以利用前一行的内外性质来填充整个多边形,这一点和种子填充的性质很像,充分利用了种子填充的连通区域特性,并且摒弃了种子填充的不足;由于它极大地减少了求交计算量,因此它极大地加快了算法栅格化多边形的速度;而对比单纯的扫描线算法,由于扫描线算法每一行都会重新计算交点并且排序,因此相比较本发明的算法而言,扫描线算法会大大影响效率,使得交点计算,交点排序成为性能瓶颈(若多边形形状复杂,则交点可能很多个),即扫描线算法会做M次交点计算并排序的过程,而本发明算法只做约一次交点计算即可,大大提高了栅格化的速度。
[0087]基于上述一种矢量多边形栅格化的算法,本发明还提供一种矢量多边形栅格化的系统。
[0088]如图2所示,一种矢量多边形栅格化的系统,包括栅格化区域设置模块
当前第4页1 2 3 4 5 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1