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

文档序号:9433576阅读:1107来源:国知局
一种矢量多边形栅格化的算法及系统的制作方法
【技术领域】
[0001]本发明涉及一种栅格化方法,具体的涉及一种矢量多边形栅格化的算法及系统。
【背景技术】
[0002]多边形栅格化转换应用的主要场景有:一、直接做多边形填充成为栅格化图片存储或者显示;二、需要生成大数据量高精度的栅格化图片集合以用于打印或者显示;三、作为多边形的网格索引生成;四、用作多边形图案填充的模板生成。第一种是对多边形栅格化转换的基础应用方式,即最简单的如何生成让图形设备能够读取并表达多边形形状数据的文件或者直接表达(显示、打印等)。第二种是一种较为高级的应用方式,但很多实际场合会有所应用。例如生成GIS地图瓦片缓存(第三、第四场景也会应用到),用于制作巨幅高分辨率栅格化矢量图形文件等(例如超高清的广告牌)。第三种和第四种是在一些商业软件应用中,应用得很普遍的场景。第三种的应用场景下是生成多边形的网格索引,实际上和栅格化的本质是一样的,多边形的网格索引即生成一定的大小相同的行列网格,每个网格表示的是此网格与多边形的关系(在多边形外,与多边形边界相交,在多边形内部),若存在大量的点、线、面等矢量数据需要判断与多边形的关系时,可以得到优化处理。点在做与多边形关系判断时,只需要判断在多边形内、外和多边形边界上即可,而在GIS应用中,需要使用容限来判断点与多边形的关系,而若不使用容限,则点与多边形的关系只有内外两种判断方法,因为受制于计算机对数值数据表达的限制,很多时候无法精确地表示一个坐标点,位于一条直线上,因为直线的斜率往往是个无限循环小数,所以在这里我们考虑使用容限的情况,假设点P(x,y)与多边形A,容限设置为t,则将点p扩展一个容限范围形成一个矩形1它的四点分别为1-1計17^,7+1在矩形1?的范围内,查询多边形的网格索引的网格与R相交的部分。若此时有k个网格与R相交(若容限非常小则k = 1或者k = 0,p根本不在多边形外界矩形范围内),则对这k个网格进行判读;gk个网格均是在多边形内部或者多边形外部,则点P位于多边形内部或者多边形外部;否则,判断P与与多边形相交的网格里存储的多边形的边的距离,若在t之内,则p在多边形上,否则再使用传统方法(射线法)或者结合本发明讲述的办法来判断P与多边形之间的关系;线和面等矢量数据如果是判断与多边形的相交关系,也是采用这个思路来进行,只不过,扩展范围变成了线或者面的外接矩形R的扩展容限t范围的矩形R’,通过R’来查询多边形的网格索引的网格。第四种则是对多边形的自定义图案填充,而非纯色填充;这种方法的目标在于找出位于多边形内部的栅格填充点,对应的自定义图案的坐标位置;再通过这一位置插值得到这一坐标位置的像素值;将这个像素值来代表多边形内部的栅格填充点的像素,从而实现图案填充;这种应用场景下其实也是要找出位于多边形内部的网格点,也即多边形栅格化的一种应用模式。
[0003]现有的一些算法,例如扫描线算法,种子填充算法等,在遇到大数据量矢量数据,或者需要填充高精度的栅格化图片时,考虑得不是很全面,在这样的应用场景下不太适合;并且扫描线算法在矢量数据特别复杂时,由于每一次都需要遍历维护边表计算出活动边,其实它的效率不是很高;种子填充算法需要选取种子,利用递归的方法进行图案填充;它的好处就是不用计算交点,直接凭图像的栅格值进行判断是否填充;在需要生成的图像特别巨大,此时种子填充算法采用递归的思路可能会导致程序堆栈溢出;若不采用递归,而用自定义的数据结构来模拟栈来实现种子填充算法的话,又会由于速度比采用递归的方法慢而无法接受;同时生成的数据量很巨大的时候,内存里可能都装不下整个图像的空间,则种子填充算法可能就无法使用了 ;还有一个问题就是种子填充算法本身速度不是很快,原因就是它的四连通区域的递归填充实际上会导致非常多的冗余遍历计算,自身也不容易修改为并行执行;另外种子填充算法的种子选取也是一个问题。

【发明内容】

[0004]本发明所要解决的技术问题是提供一种高效的矢量多边形高精度栅格化算法及系统,可以解决上述【背景技术】算法中,遇见大数据量矢量数据或者需要填充高精度的栅格化图片时,算法在性能上、存储空间上等难以满足某些应用场景的需求的问题,同时在常规应用场景中也能得到性能提升。
[0005]本发明解决上述技术问题的技术方案如下:一种矢量多边形栅格化的算法,包括以下步骤,
[0006]S1,将待处理的区域进行网格分割,在网格区域内设置多边形,生成多边形的栅格化区域,并生成由多边形的边组成的线段对象数组;
[0007]S2,遍历组成多边形的每一条线段,并利用线段对象数组生成边信息;
[0008]S3,根据生成的边信息计算网格的每一行与多边形相交的线段的索引集合;
[0009]S4,通过线段的索引集合,判断不在多边形上的网格点的内外性质生成栅格化结果O
[0010]本发明的有益效果是:本发明一种矢量多边形栅格化算法,支持大数据量、高精度的多边形栅格化图片应用场景,并且由于本发明提供的算法不是针对具体的某个用途,很容易将这些场景扩充到其他需要使用多边形栅格化的应用场景中;同时,本发明的算法性能优异,扩展性好,由于本发明的算法不是直接生成填充后的结果,而是分别给出每一行网格点与多边形的关系,因此具有良好的扩展性;另外,本发明的算法所设计的网格长宽可以不是相等的,并且网格范围也可以是任意区域范围,因此可以根据目的和数据特点来自由调整网格大小和矩形范围来达到最好的性能,这一点对于GIS中出图很重要,对任意区域的填充意味着可以只渲染一小块部分而不用渲染整个多边形,并且可以根据设备分辨率和用户的设置任意选择区域范围和比例尺进行渲染,这样在高的PPI下,例如视网膜屏幕,印刷照排机下可以得到非常优秀的渲染效果。
[0011 ] 在上述技术方案的基础上,本发明还可以做如下改进。
[0012]进一步,在步骤S1中,生成多边形的边的线段对象数组的方法为,根据多边形的边数建立一个边信息集合,通过为边信息集合分配内存并初始化生成长度为多边形的边数的线段对象数组。
[0013]进一步,在步骤S2中,生成边信息的方法为,首先遍历组成多边形的每一条线段,计算每条线段的起始行索引和终止行索引,计算多边形的跨行数据,计算组成多边形的所有线段从起始行到终止行的方向与栅格行边界第一次相交的交点值X,计算每条线段与栅格行边界相交的相邻两个交点之间的X递增量,计算起始行所对应线段的端点值Xl和终止行所对应线段的端点值X2 ;然后将起始行索引、终止行索引、多边形的跨行数据、X、X递增量、Xl和X2存储在步骤SI中生成的线段对象数组中,生成边信息。
[0014]进一步,所述步骤S3的具体实现为:
[0015]S3.1,临时生成长度为M且存储有链表指针和链表的链表数组T,其中M代表网格的行数;
[0016]S3.2,将S2中生成的边信息的起始行和终止行在链表数组T中找到相对应的链表,并在相对应的链表中添加起始行和终止行所对应的多边形线段的索引值;
[0017]S3.3,生成长度为M的指针数组TP,并将链表数组T中的数据拷贝到指针数组TP指向的数组中;
[0018]S3.4,删除链表数组T和链表占用的内存,得到每一行与多边形相交的线段的索引集合。
[0019]采用上述进一步方案的有益效果是:步骤S3中得到每一行与多边形相交的线段索引集合,能够最快最直接地查找每一行与本行相交的多边形的线段,再进行下一步操作,由于这个集合是数组形式,找出来之后会特别节省内存,遍历速度也会非常快,因此第二步并没有消耗多少计算时间和内存空间的行为得到了极大的查找便利。
[0020]进一步,步骤S4的具体实现为:
[0021]S4.1,通过S3生成的线段的索引集合与网格区域中第i行平行直线相交,使得多边形的边的线段在第i行的网格点进行求交计算,得到一系列连续的未标记网格点和一系列连续的被标记的网格点;
[0022]S4.2,对每个未标记的网格点进行判断,判断预设的未标记的网格点的左边的网格点是否为未标记的网格点,若是,执行S4.3,若不是,执行S4.4 ;
[0023]S4.3,以预设的未标记的网格点的中心为一个端点沿X正轴做平行线段,平行线段的另一个端点为当前要处理的网格点的中心,记录与该平行线段相交的多边形线段的条数,如果是奇数条,则当前要处理的网格点与预设的未标记的网格点的内外性质相反,而若是偶数条,当前要处理的网格点与预设的未标记的网格点的内外性质相同,执行S4.5 ;
[0024]S4.4,继续往左寻找直到找到未标记的网格点或者是找到最左边的网格点,则取位于多边形的左边的任意一个在网格行中线上的未被标记的网格点为端点沿X正轴做平行线段,平行线段的另一个端点为当前要处理的网格点的中心,记录与该平行线段相交的多边形的线段的条数,如果是奇数条,则当前要处理的网格点与多边形的左边的当前行中任意一个未被标记的网格点的内外性质相反,而若是偶数条,则当前要处理的网格点与多边形的左边的当前行中任意一个未被标记的网格点的内外性质相同,执行S4.5 ;
[0025]S4.5,根据每行网格点的内外性质逐行进行数据填充生成栅格化结果。
[0026]采用上述进一步方案的有益效果是:本发明一种高效的矢量多边形高精度栅格化算法,采用逐行栅格化的方式,在每一行栅格化的计算中,都用到了上一行的栅格化结果,由多边形的性质和种子填充算法的思想很容易得知,若相邻的两个网格点均不与多边形相交,则称它们是连通的,连通的网格点都位于多边形内部或者多边形外部,即其内外性质相同;那么在处理某个未标记的网格点时,可以一并找出其左右和上方所有连通的网格点,若上方能找到连通的网格点,则它们的内外性质就可以直接由上方的网格点来决定,而不用再做求交计算
当前第1页1 2 3 4 5 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1