CN105184837A - 一种矢量多边形栅格化的算法及系统 - Google Patents

一种矢量多边形栅格化的算法及系统 Download PDF

Info

Publication number
CN105184837A
CN105184837A CN201510551191.5A CN201510551191A CN105184837A CN 105184837 A CN105184837 A CN 105184837A CN 201510551191 A CN201510551191 A CN 201510551191A CN 105184837 A CN105184837 A CN 105184837A
Authority
CN
China
Prior art keywords
net point
line
polygonal
line segment
polygon
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
CN201510551191.5A
Other languages
English (en)
Other versions
CN105184837B (zh
Inventor
程曦
史凤玲
袁红念
曹倩倩
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
HEROLAND SPATIAL INFORMATION TECH Co.,Ltd.
Original Assignee
Wuhan Yunkongjian Geography Information Technology Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Wuhan Yunkongjian Geography Information Technology Co Ltd filed Critical Wuhan Yunkongjian Geography Information Technology Co Ltd
Priority to CN201510551191.5A priority Critical patent/CN105184837B/zh
Publication of CN105184837A publication Critical patent/CN105184837A/zh
Application granted granted Critical
Publication of CN105184837B publication Critical patent/CN105184837B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Landscapes

  • Image Generation (AREA)
  • Image Analysis (AREA)

Abstract

本发明涉及一种矢量多边形栅格化的算法,包括以下步骤,S1,将待处理的区域进行网格分割,在网格区域内设置多边形,生成多边形的栅格化区域,并生成由多边形的边组成的线段对象数组;S2,遍历组成多边形的每一条线段,并利用线段对象数组生成边信息;S3,根据生成的边信息计算网格的每一行与多边形相交的线段的索引集合;S4,通过线段的索引集合,判断不在多边形上的网格点的内外性质生成栅格化结果。本发明一种高效的矢量多边形高精度栅格化算法,支持大数据量、高精度的多边形栅格化图片应用场景,具有良好的扩展性。另外,本发明的算法的网格范围也可以是任意区域范围。

Description

一种矢量多边形栅格化的算法及系统
技术领域
本发明涉及一种栅格化方法,具体的涉及一种矢量多边形栅格化的算法及系统。
背景技术
多边形栅格化转换应用的主要场景有:一、直接做多边形填充成为栅格化图片存储或者显示;二、需要生成大数据量高精度的栅格化图片集合以用于打印或者显示;三、作为多边形的网格索引生成;四、用作多边形图案填充的模板生成。第一种是对多边形栅格化转换的基础应用方式,即最简单的如何生成让图形设备能够读取并表达多边形形状数据的文件或者直接表达(显示、打印等)。第二种是一种较为高级的应用方式,但很多实际场合会有所应用。例如生成GIS地图瓦片缓存(第三、第四场景也会应用到),用于制作巨幅高分辨率栅格化矢量图形文件等(例如超高清的广告牌)。第三种和第四种是在一些商业软件应用中,应用得很普遍的场景。第三种的应用场景下是生成多边形的网格索引,实际上和栅格化的本质是一样的,多边形的网格索引即生成一定的大小相同的行列网格,每个网格表示的是此网格与多边形的关系(在多边形外,与多边形边界相交,在多边形内部),若存在大量的点、线、面等矢量数据需要判断与多边形的关系时,可以得到优化处理。点在做与多边形关系判断时,只需要判断在多边形内、外和多边形边界上即可,而在GIS应用中,需要使用容限来判断点与多边形的关系,而若不使用容限,则点与多边形的关系只有内外两种判断方法,因为受制于计算机对数值数据表达的限制,很多时候无法精确地表示一个坐标点,位于一条直线上,因为直线的斜率往往是个无限循环小数,所以在这里我们考虑使用容限的情况,假设点p(x,y)与多边形A,容限设置为t,则将点p扩展一个容限范围形成一个矩形R,它的四点分别为x-t,x+t,y-t,y+t,在矩形R的范围内,查询多边形的网格索引的网格与R相交的部分。若此时有k个网格与R相交(若容限非常小则k=1或者k=0,p根本不在多边形外界矩形范围内),则对这k个网格进行判读;若k个网格均是在多边形内部或者多边形外部,则点p位于多边形内部或者多边形外部;否则,判断p与与多边形相交的网格里存储的多边形的边的距离,若在t之内,则p在多边形上,否则再使用传统方法(射线法)或者结合本发明讲述的办法来判断p与多边形之间的关系;线和面等矢量数据如果是判断与多边形的相交关系,也是采用这个思路来进行,只不过,扩展范围变成了线或者面的外接矩形R的扩展容限t范围的矩形R’,通过R’来查询多边形的网格索引的网格。第四种则是对多边形的自定义图案填充,而非纯色填充;这种方法的目标在于找出位于多边形内部的栅格填充点,对应的自定义图案的坐标位置;再通过这一位置插值得到这一坐标位置的像素值;将这个像素值来代表多边形内部的栅格填充点的像素,从而实现图案填充;这种应用场景下其实也是要找出位于多边形内部的网格点,也即多边形栅格化的一种应用模式。
现有的一些算法,例如扫描线算法,种子填充算法等,在遇到大数据量矢量数据,或者需要填充高精度的栅格化图片时,考虑得不是很全面,在这样的应用场景下不太适合;并且扫描线算法在矢量数据特别复杂时,由于每一次都需要遍历维护边表计算出活动边,其实它的效率不是很高;种子填充算法需要选取种子,利用递归的方法进行图案填充;它的好处就是不用计算交点,直接凭图像的栅格值进行判断是否填充;在需要生成的图像特别巨大,此时种子填充算法采用递归的思路可能会导致程序堆栈溢出;若不采用递归,而用自定义的数据结构来模拟栈来实现种子填充算法的话,又会由于速度比采用递归的方法慢而无法接受;同时生成的数据量很巨大的时候,内存里可能都装不下整个图像的空间,则种子填充算法可能就无法使用了;还有一个问题就是种子填充算法本身速度不是很快,原因就是它的四连通区域的递归填充实际上会导致非常多的冗余遍历计算,自身也不容易修改为并行执行;另外种子填充算法的种子选取也是一个问题。
发明内容
本发明所要解决的技术问题是提供一种高效的矢量多边形高精度栅格化算法及系统,可以解决上述背景技术算法中,遇见大数据量矢量数据或者需要填充高精度的栅格化图片时,算法在性能上、存储空间上等难以满足某些应用场景的需求的问题,同时在常规应用场景中也能得到性能提升。
本发明解决上述技术问题的技术方案如下:一种矢量多边形栅格化的算法,包括以下步骤,
S1,将待处理的区域进行网格分割,在网格区域内设置多边形,生成多边形的栅格化区域,并生成由多边形的边组成的线段对象数组;
S2,遍历组成多边形的每一条线段,并利用线段对象数组生成边信息;
S3,根据生成的边信息计算网格的每一行与多边形相交的线段的索引集合;
S4,通过线段的索引集合,判断不在多边形上的网格点的内外性质生成栅格化结果。
本发明的有益效果是:本发明一种矢量多边形栅格化算法,支持大数据量、高精度的多边形栅格化图片应用场景,并且由于本发明提供的算法不是针对具体的某个用途,很容易将这些场景扩充到其他需要使用多边形栅格化的应用场景中;同时,本发明的算法性能优异,扩展性好,由于本发明的算法不是直接生成填充后的结果,而是分别给出每一行网格点与多边形的关系,因此具有良好的扩展性;另外,本发明的算法所设计的网格长宽可以不是相等的,并且网格范围也可以是任意区域范围,因此可以根据目的和数据特点来自由调整网格大小和矩形范围来达到最好的性能,这一点对于GIS中出图很重要,对任意区域的填充意味着可以只渲染一小块部分而不用渲染整个多边形,并且可以根据设备分辨率和用户的设置任意选择区域范围和比例尺进行渲染,这样在高的PPI下,例如视网膜屏幕,印刷照排机下可以得到非常优秀的渲染效果。
在上述技术方案的基础上,本发明还可以做如下改进。
进一步,在步骤S1中,生成多边形的边的线段对象数组的方法为,根据多边形的边数建立一个边信息集合,通过为边信息集合分配内存并初始化生成长度为多边形的边数的线段对象数组。
进一步,在步骤S2中,生成边信息的方法为,首先遍历组成多边形的每一条线段,计算每条线段的起始行索引和终止行索引,计算多边形的跨行数据,计算组成多边形的所有线段从起始行到终止行的方向与栅格行边界第一次相交的交点值X,计算每条线段与栅格行边界相交的相邻两个交点之间的X递增量,计算起始行所对应线段的端点值X1和终止行所对应线段的端点值X2;然后将起始行索引、终止行索引、多边形的跨行数据、X、X递增量、X1和X2存储在步骤S1中生成的线段对象数组中,生成边信息。
进一步,所述步骤S3的具体实现为:
S3.1,临时生成长度为M且存储有链表指针和链表的链表数组T,其中M代表网格的行数;
S3.2,将S2中生成的边信息的起始行和终止行在链表数组T中找到相对应的链表,并在相对应的链表中添加起始行和终止行所对应的多边形线段的索引值;
S3.3,生成长度为M的指针数组TP,并将链表数组T中的数据拷贝到指针数组TP指向的数组中;
S3.4,删除链表数组T和链表占用的内存,得到每一行与多边形相交的线段的索引集合。
采用上述进一步方案的有益效果是:步骤S3中得到每一行与多边形相交的线段索引集合,能够最快最直接地查找每一行与本行相交的多边形的线段,再进行下一步操作,由于这个集合是数组形式,找出来之后会特别节省内存,遍历速度也会非常快,因此第二步并没有消耗多少计算时间和内存空间的行为得到了极大的查找便利。
进一步,步骤S4的具体实现为:
S4.1,通过S3生成的线段的索引集合与网格区域中第i行平行直线相交,使得多边形的边的线段在第i行的网格点进行求交计算,得到一系列连续的未标记网格点和一系列连续的被标记的网格点;
S4.2,对每个未标记的网格点进行判断,判断预设的未标记的网格点的左边的网格点是否为未标记的网格点,若是,执行S4.3,若不是,执行S4.4;
S4.3,以预设的未标记的网格点的中心为一个端点沿X正轴做平行线段,平行线段的另一个端点为当前要处理的网格点的中心,记录与该平行线段相交的多边形线段的条数,如果是奇数条,则当前要处理的网格点与预设的未标记的网格点的内外性质相反,而若是偶数条,当前要处理的网格点与预设的未标记的网格点的内外性质相同,执行S4.5;
S4.4,继续往左寻找直到找到未标记的网格点或者是找到最左边的网格点,则取位于多边形的左边的任意一个在网格行中线上的未被标记的网格点为端点沿X正轴做平行线段,平行线段的另一个端点为当前要处理的网格点的中心,记录与该平行线段相交的多边形的线段的条数,如果是奇数条,则当前要处理的网格点与多边形的左边的当前行中任意一个未被标记的网格点的内外性质相反,而若是偶数条,则当前要处理的网格点与多边形的左边的当前行中任意一个未被标记的网格点的内外性质相同,执行S4.5;
S4.5,根据每行网格点的内外性质逐行进行数据填充生成栅格化结果。
采用上述进一步方案的有益效果是:本发明一种高效的矢量多边形高精度栅格化算法,采用逐行栅格化的方式,在每一行栅格化的计算中,都用到了上一行的栅格化结果,由多边形的性质和种子填充算法的思想很容易得知,若相邻的两个网格点均不与多边形相交,则称它们是连通的,连通的网格点都位于多边形内部或者多边形外部,即其内外性质相同;那么在处理某个未标记的网格点时,可以一并找出其左右和上方所有连通的网格点,若上方能找到连通的网格点,则它们的内外性质就可以直接由上方的网格点来决定,而不用再做求交计算,这样,可以把它们这一行连通的网格点全部标记起来,直接跳到下个未标记的网格点做类似的处理;由于连通的网格点和上方也是连通的情况很多,所以这一信息会大大减少求交计算的次数,使得每一行的标记非常容易进行;从本发明的理论上可以得知,对于大多数情况,只需要进行一行的求交计算,便可以利用前一行的内外性质来填充整个多边形,这一点和种子填充的性质很像,充分利用了种子填充的连通区域特性,并且摒弃了种子填充的不足;由于它极大地减少了求交计算量,因此它极大地加快了算法栅格化多边形的速度;而对比单纯的扫描线算法,由于扫描线算法每一行都会重新计算交点并且排序,因此相比较本发明的算法而言,扫描线算法会大大影响效率,使得交点计算,交点排序成为性能瓶颈(若多边形形状复杂,则交点可能很多个),即扫描线算法会做M次交点计算并排序的过程,而本发明算法只做约一次交点计算即可,大大提高了栅格化的速度。
进一步,所述被标记的网格点为网格区域中的网格点与多边形的边相交的交点,所述未标记的网格点为网格区域中除被标记的网格点之外的网格点。
进一步,在S4.3和S4.4中,若与该平行线段相交的多边形的线段的条数为0,则规定穿越的条数为偶数条。
基于上述一种矢量多边形栅格化的算法,本发明还提供一种矢量多边形栅格化的系统。
一种矢量多边形栅格化的系统,包括栅格化区域设置模块、线段对象数组生成模块、边信息生成模块、索引集合生成模块和栅格化结果生成模块;
所述栅格化区域设置模块,其用于将待处理的区域进行网格分割,在网格区域内设置多边形生成多边形的栅格化区域;
所述线段对象数组生成模块,其用于生成多边形的边的线段对象数组;
所述边信息生成模块,其用于遍历组成多边形的每一条线段,并利用多边形的边的线段对象数组生成边信息;
所述索引集合生成模块,其用于根据生成的边信息计算每一行与多边形相交的线段的索引集合;
所述栅格化结果生成模块,其用于通过线段的索引集合,判断不在多边形上的网格点的内外性质生成栅格化结果。
在上述技术方案的基础上,本发明还可以做如下改进。
进一步,所述栅格化结果生成模块生成栅格化结果的具体步骤为,
S4.1,通过生成的线段的索引集合与网格区域中第i行平行直线相交,使得多边形的边的线段在第i行的网格点进行求交计算,得到一系列连续的未标记网格点和一系列连续的被标记的网格点;
S4.2,对每个未标记的网格点进行判断,判断预设的未标记的网格点的左边的网格点是不是未标记的网格点,若是,执行S4.3,若不是,执行S4.4;
S4.3,以预设的未标记的网格点的中心为一个端点沿X正轴做平行线段,平行线段的另一个端点为当前要处理的网格点的中心,记录与该平行线段相交的多边形线段的条数,如果是奇数条,则当前要处理的网格点与预设的未标记的网格点的内外性质相反,而若是偶数条,当前要处理的网格点与预设的未标记的网格点的内外性质相同,执行S4.5;
S4.4,继续往左寻找直到找到未标记的网格点或者是找到最左边的网格点,则取位于多边形的左边的任意一个在网格行中线上的未被标记的网格点为端点沿X正轴做平行线段,平行线段的另一个端点为当前要处理的网格点的中心,记录与该平行线段相交的多边形的线段的条数,如果是奇数条,则当前要处理的网格点与多边形的左边的当前行中任意一个未被标记的网格点的内外性质相反,而若是偶数条,则当前要处理的网格点与多边形的左边的当前行中任意一个未被标记的网格点的内外性质相同,执行S4.5;
S4.5,根据每行网格点的内外性质逐行进行数据填充生成栅格化结果。
附图说明
图1为本发明一种矢量多边形栅格化的算法的流程图;
图2为本发明一种矢量多边形栅格化的系统的框图。
具体实施方式
以下结合附图对本发明的原理和特征进行描述,所举实例只用于解释本发明,并非用于限定本发明的范围。
如图1所示,一种矢量多边形栅格化的算法,包括以下步骤,
S1,将待处理的区域进行网格分割,在网格区域内设置多边形,生成多边形的栅格化区域,并生成由多边形的边组成的线段对象数组;生成多边形的边的线段对象数组的方法为,根据多边形的边数建立一个边信息集合,通过为边信息集合分配内存并初始化生成长度为多边形的边数的线段对象数组。
S2,遍历组成多边形的每一条线段,并利用线段对象数组生成边信息;生成边信息的方法为,首先遍历组成多边形的每一条线段,计算每条线段的起始行索引和终止行索引,计算多边形的跨行数据,计算组成多边形的所有线段从起始行到终止行的方向与栅格行边界第一次相交的交点值X,计算每条线段与栅格行边界相交的相邻两个交点之间的X递增量,计算起始行所对应线段的端点值X1和终止行所对应线段的端点值X2;然后将起始行索引、终止行索引、多边形的跨行数据、X、X递增量、X1和X2存储在步骤S1中生成的线段对象数组中,生成边信息。
S3,根据生成的边信息计算网格的每一行与多边形相交的线段的索引集合;计算线段的索引集合的方法为:S3.1,临时生成长度为M且存储有链表指针和链表的链表数组T,其中M代表网格的行数;S3.2,将S2中生成的边信息的起始行和终止行在链表数组T中找到相对应的链表,并在相对应的链表中添加起始行和终止行所对应的多边形线段的索引值;S3.3,生成长度为M的指针数组TP,并将链表数组T中的数据拷贝到指针数组TP指向的数组中;S3.4,删除链表数组T和链表占用的内存,得到每一行与多边形相交的线段的索引集合。
S4,通过线段的索引集合,判断不在多边形上的网格点的内外性质生成栅格化结果;生成栅格化结果的具体实现为:S4.1,通过S3生成的线段的索引集合与网格区域中第i行平行直线相交,使得多边形的边的线段在第i行的网格点进行求交计算,得到一系列连续的未标记网格点和一系列连续的被标记的网格点;S4.2,对每个未标记的网格点进行判断,判断预设的未标记的网格点的左边的网格点是否为未标记的网格点,若是,执行S4.3,若不是,执行S4.4;S4.3,以预设的未标记的网格点的中心为一个端点沿X正轴做平行线段,平行线段的另一个端点为当前要处理的网格点的中心,记录与该平行线段相交的多边形线段的条数,如果是奇数条,则当前要处理的网格点与预设的未标记的网格点的内外性质相反,而若是偶数条,当前要处理的网格点与预设的未标记的网格点的内外性质相同,执行S4.5;S4.4,继续往左寻找直到找到未标记的网格点或者是找到最左边的网格点,则取位于多边形的左边的任意一个在网格行中线上的未被标记的网格点为端点沿X正轴做平行线段,平行线段的另一个端点为当前要处理的网格点的中心,记录与该平行线段相交的多边形的线段的条数,如果是奇数条,则当前要处理的网格点与多边形的左边的当前行中任意一个未被标记的网格点的内外性质相反,而若是偶数条,则当前要处理的网格点与多边形的左边的当前行中任意一个未被标记的网格点的内外性质相同,执行S4.5;S4.5,根据每行网格点的内外性质逐行进行数据填充生成栅格化结果。
所述被标记的网格点为网格区域中的网格点与多边形的边相交的交点,所述未标记的网格点为网格区域中除被标记的网格点之外的网格点。在S4.3和S4.4中,若与该平行线段相交的多边形的线段的条数为0,则规定穿越的条数为偶数条。
在本实施例中,以单个矢量多边形栅格化的算法为例,进行具体的实施例说明。
算法开始,首先是设置格网范围,以及格网行数和列数。即将待处理的区域进行网格划分,设行数为M,列数为N,然后设置要栅格化的多边形,计算多边形边的数量为L,建立边信息集合并初始化其内存,生成长度为L的线段对象数组。
下一步是生成边信息。遍历每一条多边形的线段,计算它的起始的行索引、终止的行索引、多边形的跨行数据(即多边形边是否与行边界线相交)、多边形边与网格行边界第一次相交的交点X值(从起始行往终止行的方向)、多边形边与网格行边界相交相邻两个交点之间的X递增量、起始行所对应线段的端点值X1、终止行所对应线段的端点值X2,并将其存储在预先分配好的线段对象数组中,即完成边信息生成工作。
接着是利用生成的边信息,计算网格的每一行与多边形相交的线段的索引集合。首先临时生成长度为M的链表数组T,链表数组T里存储的是链表头指针,这里可以采取先用链表的方式存储链表数组T,可以在上一步中,利用每次生成的起始行和终止行,在链表数组T里找到相对应的链表,添加本线段的索引值;当整个过程做完后,再生成长度为M的指针数组TP,指针数组TP存储的是每个大小为每个链表大小的数组;将链表数组T里的数据拷贝到指针数组TP指向的数组里,再删除链表数组T和链表占用内存,这样,就完成与多边形相交的线段索引集合的计算。在这一步中,计算与多边形相交的线段索引集合的主要作用是,得到网格中的每一行与多边形相交的线段索引集合,能够最快最直接地查找网格中的每一行与本行相交的多边形的线段,再进行下一步操作;由于这个集合是数组形式,找出来之后会特别节省内存,遍历速度也会非常快,因此这一步并没有消耗多少计算时间和内存空间的行为得到了极大的查找便利。
最后是得到网格点的内外性质进行数据填充生成栅格化结果。在这一步里,可以采取从上到下或者从下到上的方式逐行生成填充数据。假设现在是处理到了第i行,那么下面要做的事情也会细分为几个小步骤:
第一步,首先是标记当前要处理的网格行里的每一列的网格点。在这里,会新建两个数组:第一个数组,是当前行处理结果数组,用byte类型存储,大小为N+1,记为A1;第二个数组,是以与之前生成的每一行相交的多边形线段索引个数为行,以格网列数(N+1)为列的byte类型二维数组,记为A2。实际上,A2是中间计算占用的内存数组,而由于只需要标记格网点是否与多边形边相交的关系就可以了,所以实际上这个标识只需要占用一个bit位,即A2的大小实际上可以是可以缩小八倍的。这里将数组A2缩小八倍的解决方案有两个,第一个就是将这个数组的行减少,即每8个索引占用一个行数;这种方式实现起来简单,即按位来取某一行的某一个格网上的值即可,每个值代表的是同一列的8个索引的情况,但是这种方案占用的额外空间可能要多一行,即多N+1个字节;第二个方案就是把二维数组A2看作是一维,再除以8,得到一个数组,原来的每个索引和格网点现在需要将它们的原位置除以8,得到的新的位置上,再取这个byte上原位置与8的余数的位,得到相应的标记值;这种方法就是计算量会大一点,但是最多能节省N+1个字节空间。
标记当前要处理的网格行里的每一列的网格点的方法是这样的:遍历第i行相交的多边形线段索引数组,即在上面生成的与多边形相交的线段索引集合中取第i行记录的索引数组,得到多边形的一条线段,这条线段与第i行一定是相交的;此时,若线段的两个端点X不与栅格化范围相交,且比栅格化范围的右坐标要大,则不处理;否则,计算线段与第i行的行边界相交的两个交点v1、v2(若不相交,则直接取线段的两个端点),计算v1、v2所在的网格列号idx1、idx2(可以超出栅格化范围),并且调整到idx1<=idx2,设置数组A1和A2的最后一个存储字节flag为false(初始化),flag代表的是线段有没有到栅格化范围以左的范围。若网格列号idx2超出最大的网格列号,则令idx2为网格列号最大值,若网格列号idx1或者idx2小于0,则令idx1或idx2为0,设置flag标志为true。计算完后,从idx1到idx2的格网点都需要进行标记,即数组A1,A2都需要被标记。若flag标志为true,则标记A1的最后一个存储字节,表示有线段延伸到了左边。同时标记A2的当前线段对应行的最后一个存储字节(若按照bit位压缩则设置到对应的bit位),表示当前线段延伸到了左边,至此标记结束。
然后,就是循环处理第i行每一个网格点的过程。新建一个长度为第i行相交多边形线段数目的数组A3,初始化所有值为0(这是个临时标记数组,可以和前面的考虑一样,采用bit位进行标记),因为前面一步已经做了边界的标记,也就是栅格化后代表多边形的边的标记,所以,这里我们只需要对数组A1中没有做标记的对应格网点做处理即可。现在,对于第j个网格点,先往左查找。若j=0,并且A1的第N+1个值没有被标记,则当前标记的值为0,进入下次循环,此时索引ifrom为-1。若j≠0,且A1的第N+1个值没有被标记,此时,若第j个网格点左边的未标记的网格点的标记值不为1,则将左边的未标记的网格点的标记值赋给当前要处理的网格点的标记,若第j个网格点左边的未标记的网格点的标记值为1,则一直寻找直到左边标记值不为1,设此时找到的索引为ifrom,等待下一步操作;
下一步,新建一个长度为与第i行相交的多边形的线段数目的数组A3,初始化所有值为0,将数组A2每一列中最后一个索引位置上的每一条相交的多边形的线段对应位的标记相与到A3数组的相应位置中,并设置此时的网格点的起始索引值ifrom=0;再遍历数组A2中的网格点的起始索引值ifrom到当前,将数组A2里每一条相交的线段对应的位标记相与到A3数组相应位置,得到被标记的数组A3;这样做的目的,是找出当前网格点到上一个不为边界的网格点之间,到底有多少个多边形的线段。这样做的目的,是找出当前网格点到上一个不为边界的网格点之间,到底有多少多边形的线段。
接下来,则是使用测试射线来测试射线穿越了多少条这样的线段。在这一步中,使用的测试点test为当前网格点的中点,选这样的点事方便计算。现在遍历每一条在上一步A3数组里标记的线段,不妨设其端点为v1,v2。判断的方法是这样的:若v1,v2的y值同时大于test的y值,或者v1,v2的y值同时小于test的y值,或者v1,v2的y值相等,则不认为射线穿越;否则,认为射线穿越。
最后,判断穿越线段的条数。若ifrom<0,并且穿越条数为偶数条,则当前网格点标记为0;若ifrom≥0,并且穿越条数为偶数条,则当前网格点标记为ifrom索引对应的网格点的标记值;若ifrom<0,并且穿越条数为奇数条,则当前网格点标记为2;若ifrom≥0,并且穿越条数为奇数条,则分两种情况:第一,ifrom索引对应的网格点标记值为0,则当前网格点的标记为2;第二,ifrom索引对应的网格点标记值为2,则当前网格点的标记为0(0代表在多边形外部,1代表在多边形边上,2代表在多边形内部)。
根据最后一步中网格点的标记值,进行数据填充,生成栅格化结果。
至此,本算法完成了,此时栅格化的结果,已经可以满足第一和第四个场景的需要,可以直接利用栅格化的结果来做个性化的渲染了。
而对于第三个场景的需要,因为已经可以利用大量栅格化的点来加速判断矢量要素与当前多边形的关系,对于一般的应用场景来说,这种加速已经够用了,此时生成的计算结果也可以算作是索引;但是实际上,在第三个场景遇到点判断不在线上,但又在容限范围内与含有多边形边界的网格相交时,需要判断点与多边形的关系时,还有进一步优化的余地,并且这种优化会将这种单次计算的算法复杂度降低几个数量级。在这里,若要满足进一步的需要,在前面的计算中,我们需要将每个栅格化的网格点,具体是与哪些多边形的线段相交这一信息记录下来,即需要额外计算并存储网格点与多边形线段相交的线段的索引集合。对于某个需要判断的点p,若p落在未被标记的网格点范围内,则不需要进一步处理,直接返回该网格点栅格值即可;否则,找到p点落在的栅格化网格点左右连续的被标记的网格点集合。即一个找到一个连续的集合,所有被标记的网格点,并且包含p点所在的网格点。统计这样的每个网格点里相交的线段总数,这样,就能决定p点是向左做射线测试还是向右做射线测试,以减少计算量。这里假设是向右做射线测试,在我们需要把位于p所在网格点右边的所有网格点,和p所在网格点,与它们相交的所有的线段与p做求交测试。在这里,若为了计算简便,可以直接使用直线方程与p向正x轴做的射线求交得到交点,统计交点的个数。若交点的个数为奇数,则p点的内外关系与右边相邻的未被标记的网格点内外关系相反,反之,则相同。
而若为了进一步的极致性能,可以在这一步进一步优化。我们可以观察到,由于多边形的线段都是连续的,并且多边形的边是不相交的,所以,在这一个连续的栅格集合中,所有相交的多边形线段,构成了一系列两两不相交的多段线。在这里,对这些多段线进行排序。排序的比较字段是这些多段线起始端点和终止端点中的较小值,或者较大值也可以。得到排序后的索引值。这样排序之后,可以得到一个性质,就是任意一条沿X轴的射线与这些多段线的交点的顺序与这些排序后的索引值顺序是一致的,利用数学方法可以证明,因为他们的端点较小值和端点较大值都遵循这个索引值顺序,而中间值则是由两个端点值的一定比例得到的,所以也是一致的。这样,对于这些多段线两两间隔成的区间,是可以得到其内外性质的,这个内外性质在前面第三步时都能算出来。
这样,若要得到p点的内外性质,只需要知道p点所在的区间即可。
先假设这些多段线中不含两个端点在同一根行线上的情况。这样,若点p落在某个区间内,向右做射线的话,除了p点所在的区间的左边界多段线之外的话,必定会与p点所在的区间的右边界多段线最先相交。这样,我们考虑p点与多段线的范围相交,和p点不与任何多段线的范围相交两种情况即可。若p点不与任何多段线的范围相交,则只需要找出位于p点右边的多段线的范围,这些范围里的最左边的多段线,即是p点所在区间的右多段线。这个判断只需要范围的x坐标比p的x坐标大即可。若p点与多段线的范围相交,则需要先找出与p点相交的多段线的范围,从p点向x正轴方向做射线与这些多段线求交,得到的交点再进行排序。若产生的第一个交点对应的多段线与p点向x正轴方向做的射线的交点个数为偶数个,则该多段线为p点所在区间的左边界;若为奇数个,则该多段线为p点所在区间的右边界;若没有产生任何交点,则这些多段线的最右边的多段线,为p点所在区间的左边界。至此,两个端点跨行线的情况讨论完了。
下面讨论存在两个端点在同一根行线上的情况,即形成了一个回环的情况。这里也有两种情况:第一是回环的范围不与p点相交,这样回环的存在与否与p点的判断没有关系,就和多段线中不含两个端点在同一根行线上的情况一样,可以放在上面讨论;第二是回环的范围与p点相交,这样向x正轴方向做射线,与这些回环进行求交,若产生的交点数总数为偶数个(只计算总数,不关心交点是分布在同一回环还是不同回环上),则p点内外关系和忽略回环时的内外关系相同,这时再到前面的情况讨论。若交点总数为奇数个,则p点内外关系与忽略回环时的内外关系相反。
至此,对于前面背景技术中的第一、第三、第四个场景本发明的算法都有了很好的解决。
下面再来看看,本发明的算法对于并行、海量数据方面的支持情况。
由于本算法的性质,将本算法改造成并行执行还是比较容易的,这是一个并行策略的问题。首先在第一步和第二步,计算边信息和计算每一行与多边形相交的线段的索引集合都是可以并行执行的。前者是互不影响的,可以直接修改为并行算法,而后者需要注意插入每一行数据时的同步问题。若采用一个进程,多线程的算法,很容易实现。而若采用多进程算法(在这里的并行模型中,将单机多进程和局域网多进程均看作是统一的多进程模型,采用统一的机制通信。),不需要注意后者的同步问题,但计算完后需要将数据归一到一起,这时需要单个进程来执行。而对于一般的应用而言,第一步和第二步消耗的时间非常微小,无论是采用哪种方法,都是可以的。
假设第一步、第二步中我们采用了多线程的方法,计算完边信息和索引集合。在第三步中,需要对每一行计算填充情况数组。这里无论采用什么策略,我们都希望能够尽量得到优化,所以第三步中将行按照顺序来分割,同个计算单元分得的行是连续的,并且我们需要把这些相应的边信息和索引集合分发到各个计算单元(计算单元,指的是一个线程或者一个进程)。由于本算法的模型可以对任意区域,任意格网大小进行处理,因此这里不同的计算单元计算结果都不会受到任何影响,也就是说,我们可以把每个计算单元的处理,当作是独立的任务来进行。这样,其实把整个算法作为一个整体,将计算任务按照行来分割也是可以的,这就是数据并行策略。
如果是数据并行策略,那么每个计算单元从第一步的时候,就可以独立开来。边信息和索引集合可以只计算计算单元负责的行就可以了。
由此讨论,我们可以引申出一个道理,那就是这种多边形的填充,每个计算单元,真正关心的部分是与计算单元负责的行集合往左无限延伸的多边形线段集合。而其他的多边形线段集合,则和算法的结果没有关系。
现在假设有一个非常复杂的多边形,其包含的线段数非常多,即数据量非常大。而现在的需求是需要对其进行高精度的渲染,单个计算单元很可能都无法装载下计算一行需要的内存(有些夸张,但为了说明理论上的支持程度,就举这个极端例子)。由本算法的性质可知,从高精度往低精度上转是可以进行的,即选取适当的行列比例,先计算出网格点设置较大时,多边形栅格化的结果。而这个网格点的格网高度,宽度和起点也不是胡乱设置的,选择的格网高度和宽度应该恰好是包含整数倍的高精度格网的高度和宽度(倍数可以不一致),并且每个格网的角点需要和高精度格网的角点重合。这样,这种放缩就会发生边界扩充的情况,但是也不会超过大格网的一行和一列。而大的格网点对应的高精度格网点的计算,则交由一个独立的计算单元来完成。
现在对这个大的格网进行多边形填充计算。计算完成后,格网值为0和2的大的格网点对应的高精度格网点的格网值无需再进行计算,直接赋值即可。而格网值为1的格网点中存在有多边形的边与之相交,因此需要再进行计算。
现在再来处理这个高精度的格网点。由本发明的性质可知,需要处理的高精度的格网计算单元,其相交的多边形线段正好是与大的格网点相交的多边形线段是相同的。从要处理的计算单元对应的大的格网点出发向左找到连续的与多边形相交的格网点,与这些格网点相交的线段则是当前计算单元需要的所有的多边形线段,而再往左一个格网点的内外情况则是当前计算单元的初始内外情况,可代入到前面讨论的单个多边形栅格化的算法中去讨论。若往左没有格网点了,则这个初始内外情况就是在多边形的外部。
将这些细化了的多边形线段再来与每个分别的格网计算单元进行计算,得到最终的结果。这种策略能够大大减少不必要的计算量,主要是有两个方面提升:一是大的格网点判断内外之后,高精度的格网点不用再判断直接得到结果了;二是每个需要独立计算的计算单元,不需要再遍历整个很大很复杂的多边形了,直接能够得到影响它的多边形线段和初始内外情况。
下面再来看看,大数据量多边形需要栅格化,本发明的应对策略情况。
假设现在有非常多的多边形,个数为N,其范围为Dx,Dy。那么现在要做的是,如何利用多个计算单元来并行处理这一栅格化的任务。在这里,我们假设将行列范围划分为M×N个,那么多个计算单元只需要从M×N的队列中取出相应的计算任务进行计算即可。这M×N个小的范围,本身需要考虑的多边形的数量是有限的,只需要关心与之相交的多边形即可,因此,在最开始进行队列划分时,我们可以先把小范围相交的多边形索引找好。还是采用先生成M×N个链表,最后再把链表变成数组的方式。在这里,我们遍历每个多边形,用它的外接矩形范围来查找与之相交的小的范围,就像前面所讨论的查找与矩形相交的多个格网一样,将所有的相交的小的范围对应的链表加上当前多边形的索引。完成这一过程后,每个小的范围相交的多边形就找出来了。和单个多边形栅格化的第一步类似,这一过程可以用多线程来完成,但是需要注意同步。
现在再来看,单个计算单元对单个小的范围的处理。此时的问题已经可以化简为,同时栅格化有限多个多边形。提到同时,则可以采用并行的思路(单个计算单元为进程的时候,可以采用多线程)。这里,对一个更小的计算单元而言(如果不采用并行,就是指一个多边形的计算),将多边形的范围与当前要处理的小范围求交得到一个更小的范围,这个更小的范围是当前要处理的小的范围的一个子集,并且网格点的大小和当前要处理的小范围网格点相等,并且网格点全部位于当前要处理的小范围网格点内。对这个更小的范围进行多边形栅格化,则是前面我们所讨论的单个多边形栅格化的思路。
小范围的多个多边形栅格化完成后,则是在当前的小范围内进行进一步处理的过程。这里因为每个多边形的索引已知,具体采用什么方法来渲染,是多值填充,还是Alpha混合,还是图案填充,都是具体的应用再来考虑了,这里没有必要再做进一步的讨论。
不管是什么样的场景,本发明提供的算法都能给出有效的解决,所不同的只是策略。在场景中,往往会综合使用不一样的策略,比如遇到大量多边形填充的时候,可能单个多边形也会很复杂还需要进行高精度的填充,这时候就是前面讨论的第一种高精度填充的情况;还比如精度要求非常非常高,则可能需要不断地将网格扩大两次甚至多次,以满足高精度填充的需求。但是无论怎么样,本发明的算法均可以满足,它在理论上,是支持任意分辨率任意长宽任意范围的多边形填充的。具体采用何种策略,还需要看数据如何,需求如何。
南京大学提供的《基于扫描线法的多边形栅格化并行转换方法》,仅提供了一种具体采用MPI和GDAL进行多边形栅格化并行转换的方案,但它没有考虑到的是:第一、按照行来分块处理多边形栅格化,如果列数非常多,单个计算单元可能都无法装下那么多内存,或者只能分一到两行。这样每一行都需要进行一次真正的求交计算,非常浪费计算性能;第二、每个划分单元是通过空间查询得到与划分单元相交的多边形的,设划分单元数为n,多边形个数为m,则单次查询的算法复杂度为O(logm),总共是O(n(logm))(理想情况下)。而本发明提供的方法是O(m),实际上由于做空间查询的时候还需要大量读取硬盘,其效率远不如遍历多边形的外接矩形来得高;三、处理的多边形数据量和栅格精度都是有限的,并且单个划分单元栅格化的时候并没有进行并行处理。即多个多边形进行栅格化的时候仍是串行处理的。从提供的代码里可以看出,每一扫描行处理时均会遍历所有相交的多边形的每一条边,然后计算每一条边与当前扫描行的扫描线的交点。计算完交点之后,再对所有交点进行排序,填充两两交点之间的扫描行。(不知是不是公布的版本的原因,这个代码里有个BUG,就是对于多边形的边端点y值都在当前的行范围内时,就不计算扫描线与边的交点了,而是在当第一个端点x值大于第二个端点x值时,将它跨过的网格范围做标记。这样若恰好出现端点都在该行的情况那么正常来讲的交点之间的网格都不会被填充。)这里存在的问题就是没有针对不同的多边形采用不同的填充,全都是填充成一样的内容,不够通用;并且若多边形之间存在相交的情况,这种填充方法就会产生问题,出来的结果或许就和我们想象的不同(虽然在GIS中,大多数情况下要求同一个数据集下面的多边形是不允许相交的,但是对于一般化的多边形填充,例如二维动画里的多边形填充、2D游戏里的多边形填充,都是允许多边形相交的,因此这是这个算法里的限制之处。)。第四点就是采用的扫描线算法本身相对本文的发明来说是不够优化的,因此整体效率会比本发明要低很多。
本发明一种高效的矢量多边形高精度栅格化算法,采用逐行栅格化的方式,在每一行栅格化的计算中,都用到了上一行的栅格化结果,由多边形的性质和种子填充算法的思想很容易得知,若相邻的两个网格点均不与多边形相交,则称它们是连通的,连通的网格点都位于多边形内部或者多边形外部,即其内外性质相同;那么在处理某个未标记的网格点时,可以一并找出其左右和上方所有连通的网格点,若上方能找到连通的网格点,则它们的内外性质就可以直接由上方的网格点来决定,而不用再做求交计算,这样,可以把它们这一行连通的网格点全部标记起来,直接跳到下个未标记的网格点做类似的处理;由于连通的网格点和上方也是连通的情况很多,所以这一信息会大大减少求交计算的次数,使得每一行的标记非常容易进行;从本发明的理论上可以得知,对于大多数情况,只需要进行一行的求交计算,便可以利用前一行的内外性质来填充整个多边形,这一点和种子填充的性质很像,充分利用了种子填充的连通区域特性,并且摒弃了种子填充的不足;由于它极大地减少了求交计算量,因此它极大地加快了算法栅格化多边形的速度;而对比单纯的扫描线算法,由于扫描线算法每一行都会重新计算交点并且排序,因此相比较本发明的算法而言,扫描线算法会大大影响效率,使得交点计算,交点排序成为性能瓶颈(若多边形形状复杂,则交点可能很多个),即扫描线算法会做M次交点计算并排序的过程,而本发明算法只做约一次交点计算即可,大大提高了栅格化的速度。
基于上述一种矢量多边形栅格化的算法,本发明还提供一种矢量多边形栅格化的系统。
如图2所示,一种矢量多边形栅格化的系统,包括栅格化区域设置模块、线段对象数组生成模块、边信息生成模块、索引集合生成模块和栅格化结果生成模块;
所述栅格化区域设置模块,其用于将待处理的区域进行网格分割,在网格区域内设置多边形生成多边形的栅格化区域;
所述线段对象数组生成模块,其用于生成多边形的边的线段对象数组;
所述边信息生成模块,其用于遍历组成多边形的每一条线段,并利用多边形的边的线段对象数组生成边信息;
所述索引集合生成模块,其用于根据生成的边信息计算每一行与多边形相交的线段的索引集合;
所述栅格化结果生成模块,其用于通过线段的索引集合,判断不在多边形上的网格点的内外性质生成栅格化结果。
在上述技术方案的基础上,本发明还可以做如下改进。
进一步,所述栅格化结果生成模块生成栅格化结果的具体步骤为,
S4.1,通过生成的线段的索引集合与网格区域中第i行平行直线相交,使得多边形的边的线段在第i行的网格点进行求交计算,得到一系列连续的未标记网格点和一系列连续的被标记的网格点;
S4.2,对每个未标记的网格点进行判断,判断预设的未标记的网格点的左边的网格点是不是未标记的网格点,若是,执行S4.3,若不是,执行S4.4;
S4.3,以预设的未标记的网格点的中心为一个端点沿X正轴做平行线段,平行线段的另一个端点为当前要处理的网格点的中心,记录与该平行线段相交的多边形线段的条数,如果是奇数条,则当前要处理的网格点与预设的未标记的网格点的内外性质相反,而若是偶数条,当前要处理的网格点与预设的未标记的网格点的内外性质相同,执行S4.5;
S4.4,继续往左寻找直到找到未标记的网格点或者是找到最左边的网格点,则取位于多边形的左边的任意一个在网格行中线上的未被标记的网格点为端点沿X正轴做平行线段,平行线段的另一个端点为当前要处理的网格点的中心,记录与该平行线段相交的多边形的线段的条数,如果是奇数条,则当前要处理的网格点与多边形的左边的当前行中任意一个未被标记的网格点的内外性质相反,而若是偶数条,则当前要处理的网格点与多边形的左边的当前行中任意一个未被标记的网格点的内外性质相同,执行S4.5;
S4.5,根据每行网格点的内外性质逐行进行数据填充生成栅格化结果。
以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

Claims (9)

1.一种矢量多边形栅格化的算法,其特征在于:包括以下步骤,
S1,将待处理的区域进行网格分割,在网格区域内设置多边形,生成多边形的栅格化区域,并生成由多边形的边组成的线段对象数组;
S2,遍历组成多边形的每一条线段,并利用线段对象数组生成边信息;
S3,根据生成的边信息计算网格的每一行与多边形相交的线段的索引集合;
S4,通过线段的索引集合,判断不在多边形上的网格点的内外性质生成栅格化结果。
2.根据权利要求1所述的一种矢量多边形栅格化的算法,其特征在于:在步骤S1中,生成多边形的边的线段对象数组的方法为,根据多边形的边数建立一个边信息集合,通过为边信息集合分配内存并初始化生成长度为多边形的边数的线段对象数组。
3.根据权利要求1所述的一种矢量多边形栅格化的算法,其特征在于:在步骤S2中,生成边信息的方法为,首先遍历组成多边形的每一条线段,计算每条线段的起始行索引和终止行索引,计算多边形的跨行数据,计算组成多边形的所有线段从起始行到终止行的方向与栅格行边界第一次相交的交点值X,计算每条线段与栅格行边界相交的相邻两个交点之间的X递增量,计算起始行所对应线段的端点值X1和终止行所对应线段的端点值X2;然后将起始行索引、终止行索引、多边形的跨行数据、X、X递增量、X1和X2存储在步骤S1中生成的线段对象数组中,生成边信息。
4.根据权利要求1所述的一种矢量多边形栅格化的算法,其特征在于:所述步骤S3的具体实现为:
S3.1,临时生成长度为M且存储有链表指针和链表的链表数组T,其中M代表网格的行数;
S3.2,将S2中生成的边信息的起始行和终止行在链表数组T中找到相对应的链表,并在相对应的链表中添加起始行和终止行所对应的多边形线段的索引值;
S3.3,生成长度为M的指针数组TP,并将链表数组T中的数据拷贝到指针数组TP指向的数组中;
S3.4,删除链表数组T和链表占用的内存,得到每一行与多边形相交的线段的索引集合。
5.根据权利要求1至4任一项所述的一种矢量多边形栅格化的算法,其特征在于:步骤S4的具体实现为:
S4.1,通过S3生成的线段的索引集合与网格区域中第i行平行直线相交,使得多边形的边的线段在第i行的网格点进行求交计算,得到一系列连续的未标记网格点和一系列连续的被标记的网格点;
S4.2,对每个未标记的网格点进行判断,判断预设的未标记的网格点的左边的网格点是否为未标记的网格点,若是,执行S4.3,若不是,执行S4.4;
S4.3,以预设的未标记的网格点的中心为一个端点沿X正轴做平行线段,平行线段的另一个端点为当前要处理的网格点的中心,记录与该平行线段相交的多边形线段的条数,如果是奇数条,则当前要处理的网格点与预设的未标记的网格点的内外性质相反,而若是偶数条,当前要处理的网格点与预设的未标记的网格点的内外性质相同,执行S4.5;
S4.4,继续往左寻找直到找到未标记的网格点或者是找到最左边的网格点,则取位于多边形的左边的任意一个在网格行中线上的未被标记的网格点为端点沿X正轴做平行线段,平行线段的另一个端点为当前要处理的网格点的中心,记录与该平行线段相交的多边形的线段的条数,如果是奇数条,则当前要处理的网格点与多边形的左边的当前行中任意一个未被标记的网格点的内外性质相反,而若是偶数条,则当前要处理的网格点与多边形的左边的当前行中任意一个未被标记的网格点的内外性质相同,执行S4.5;
S4.5,根据每行网格点的内外性质逐行进行数据填充生成栅格化结果。
6.根据权利要求5所述的一种矢量多边形栅格化的算法,其特征在于:所述被标记的网格点为网格区域中的网格点与多边形的边相交的交点,所述未标记的网格点为网格区域中除被标记的网格点之外的网格点。
7.根据权利要求5所述的一种矢量多边形栅格化的算法,其特征在于:在S4.3和S4.4中,若与该平行线段相交的多边形的线段的条数为0,则规定穿越的条数为偶数条。
8.一种矢量多边形栅格化的系统,其特征在于:包括栅格化区域设置模块、线段对象数组生成模块、边信息生成模块、索引集合生成模块和栅格化结果生成模块;
所述栅格化区域设置模块,其用于将待处理的区域进行网格分割,在网格区域内设置多边形生成多边形的栅格化区域;
所述线段对象数组生成模块,其用于生成多边形的边的线段对象数组;
所述边信息生成模块,其用于遍历组成多边形的每一条线段,并利用多边形的边的线段对象数组生成边信息;
所述索引集合生成模块,其用于根据生成的边信息计算每一行与多边形相交的线段的索引集合;
所述栅格化结果生成模块,其用于通过线段的索引集合,判断不在多边形上的网格点的内外性质生成栅格化结果。
9.根据权利要求8所述的一种矢量多边形栅格化的系统,其特征在于:所述栅格化结果生成模块生成栅格化结果的具体步骤为,
S4.1,通过生成的线段的索引集合与网格区域中第i行平行直线相交,使得多边形的边的线段在第i行的网格点进行求交计算,得到一系列连续的未标记网格点和一系列连续的被标记的网格点;
S4.2,对每个未标记的网格点进行判断,判断预设的未标记的网格点的左边的网格点是不是未标记的网格点,若是,执行S4.3,若不是,执行S4.4;
S4.3,以预设的未标记的网格点的中心为一个端点沿X正轴做平行线段,平行线段的另一个端点为当前要处理的网格点的中心,记录与该平行线段相交的多边形线段的条数,如果是奇数条,则当前要处理的网格点与预设的未标记的网格点的内外性质相反,而若是偶数条,当前要处理的网格点与预设的未标记的网格点的内外性质相同,执行S4.5;
S4.4,继续往左寻找直到找到未标记的网格点或者是找到最左边的网格点,则取位于多边形的左边的任意一个在网格行中线上的未被标记的网格点为端点沿X正轴做平行线段,平行线段的另一个端点为当前要处理的网格点的中心,记录与该平行线段相交的多边形的线段的条数,如果是奇数条,则当前要处理的网格点与多边形的左边的当前行中任意一个未被标记的网格点的内外性质相反,而若是偶数条,则当前要处理的网格点与多边形的左边的当前行中任意一个未被标记的网格点的内外性质相同,执行S4.5;
S4.5,根据每行网格点的内外性质逐行进行数据填充生成栅格化结果。
CN201510551191.5A 2015-08-31 2015-08-31 一种矢量多边形栅格化的方法及系统 Active CN105184837B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201510551191.5A CN105184837B (zh) 2015-08-31 2015-08-31 一种矢量多边形栅格化的方法及系统

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201510551191.5A CN105184837B (zh) 2015-08-31 2015-08-31 一种矢量多边形栅格化的方法及系统

Publications (2)

Publication Number Publication Date
CN105184837A true CN105184837A (zh) 2015-12-23
CN105184837B CN105184837B (zh) 2018-02-02

Family

ID=54906889

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201510551191.5A Active CN105184837B (zh) 2015-08-31 2015-08-31 一种矢量多边形栅格化的方法及系统

Country Status (1)

Country Link
CN (1) CN105184837B (zh)

Cited By (19)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN106227781A (zh) * 2016-07-18 2016-12-14 中国农业大学 大数据下空间单点数据的快速检索方法
CN106780290A (zh) * 2016-12-14 2017-05-31 江苏维普光电科技有限公司 一种快速计算从矢量图形提取网栅图形及填充的方法
CN106910219A (zh) * 2017-04-11 2017-06-30 南京嘉谷初成通信科技有限公司 一种基于几何方式统计农机工作面积的方法
CN106952324A (zh) * 2017-04-07 2017-07-14 山东理工大学 矢量多边形栅格化并行叠加处理装置及方法
CN106971043A (zh) * 2017-03-31 2017-07-21 中国商用飞机有限责任公司北京民用飞机技术研究中心 一种嵌套网格的建立方法及装置
CN107146268A (zh) * 2016-03-01 2017-09-08 北大方正集团有限公司 矢量图形的填充方法和矢量图形的填充装置
CN107958112A (zh) * 2017-11-23 2018-04-24 上海华力微电子有限公司 一种模拟内部版图图形的边缘冗余图形生成方法
CN108182717A (zh) * 2017-12-15 2018-06-19 北京金风科创风电设备有限公司 地理信息图像生成方法及设备
CN110019984A (zh) * 2017-12-27 2019-07-16 北京小度信息科技有限公司 空间索引建立方法、装置、电子设备及可读存储介质
CN110533739A (zh) * 2019-08-15 2019-12-03 深圳供电局有限公司 一种地图网格的成图方法
CN111260780A (zh) * 2020-01-13 2020-06-09 陕西心像信息科技有限公司 基于高度图高程的实时地形修改方法
CN111915665A (zh) * 2020-07-21 2020-11-10 中国科学院软件研究所 一种计算机上使用简化求交计算的点在多边形内判定方法
CN112465930A (zh) * 2020-11-10 2021-03-09 深圳市益欣网络科技有限公司 扫描线种子填充方法
CN113204607A (zh) * 2021-05-11 2021-08-03 南京大学 一种平衡面积、拓扑和形状特征的矢量多边形栅格化方法
CN113632034A (zh) * 2019-03-25 2021-11-09 万德兰工业有限公司 用于产品的物流内运输的系统和方法
CN113868362A (zh) * 2021-11-30 2021-12-31 亿海蓝(北京)数据技术股份公司 航路轨迹构建方法、系统、船舶和船舶管理系统
WO2022161185A1 (zh) * 2021-01-28 2022-08-04 北京字跳网络技术有限公司 一种有向距离场图像的生成方法、装置、设备及存储介质
CN116502318A (zh) * 2023-06-27 2023-07-28 中南大学 一种提取铁路站场相交设备空间信息的方法
CN117407552A (zh) * 2023-12-15 2024-01-16 南京气象科技创新研究院 一种栅格信息精准赋值矢量线的信息表达方法

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20070018988A1 (en) * 2005-07-20 2007-01-25 Michael Guthe Method and applications for rasterization of non-simple polygons and curved boundary representations
CN101719154A (zh) * 2009-12-24 2010-06-02 中国科学院计算技术研究所 一种基于栅格结构的空间索引建立方法和系统
CN101739696A (zh) * 2008-11-10 2010-06-16 富士通株式会社 用于对凸多边形进行栅格化的系统及方法
CN102542035A (zh) * 2011-12-20 2012-07-04 南京大学 基于扫描线法的多边形栅格化并行转换方法

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20070018988A1 (en) * 2005-07-20 2007-01-25 Michael Guthe Method and applications for rasterization of non-simple polygons and curved boundary representations
CN101739696A (zh) * 2008-11-10 2010-06-16 富士通株式会社 用于对凸多边形进行栅格化的系统及方法
CN101719154A (zh) * 2009-12-24 2010-06-02 中国科学院计算技术研究所 一种基于栅格结构的空间索引建立方法和系统
CN102542035A (zh) * 2011-12-20 2012-07-04 南京大学 基于扫描线法的多边形栅格化并行转换方法

Non-Patent Citations (3)

* Cited by examiner, † Cited by third party
Title
WIM G.M VAN DER KNAAP: "《The vector to raster conversion: (mis)use in geographical information systems》", 《GEOGRAPHICAL INFORMATION SYSTEMS》 *
李璐: "《一种矢量数据栅格化的方法及其应用》", 《农业网络信息》 *
陈振杰等: "《矢量多边形栅格化算法快速并行化方法研究》", 《遥感信息》 *

Cited By (30)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN107146268A (zh) * 2016-03-01 2017-09-08 北大方正集团有限公司 矢量图形的填充方法和矢量图形的填充装置
CN107146268B (zh) * 2016-03-01 2019-12-31 北大方正集团有限公司 矢量图形的填充方法和矢量图形的填充装置
CN106227781B (zh) * 2016-07-18 2019-08-23 中国农业大学 大数据下空间单点数据的快速检索方法
CN106227781A (zh) * 2016-07-18 2016-12-14 中国农业大学 大数据下空间单点数据的快速检索方法
CN106780290A (zh) * 2016-12-14 2017-05-31 江苏维普光电科技有限公司 一种快速计算从矢量图形提取网栅图形及填充的方法
CN106971043A (zh) * 2017-03-31 2017-07-21 中国商用飞机有限责任公司北京民用飞机技术研究中心 一种嵌套网格的建立方法及装置
CN106952324A (zh) * 2017-04-07 2017-07-14 山东理工大学 矢量多边形栅格化并行叠加处理装置及方法
CN106910219A (zh) * 2017-04-11 2017-06-30 南京嘉谷初成通信科技有限公司 一种基于几何方式统计农机工作面积的方法
CN107958112B (zh) * 2017-11-23 2021-05-21 上海华力微电子有限公司 一种模拟内部版图图形的边缘冗余图形生成方法
CN107958112A (zh) * 2017-11-23 2018-04-24 上海华力微电子有限公司 一种模拟内部版图图形的边缘冗余图形生成方法
CN108182717A (zh) * 2017-12-15 2018-06-19 北京金风科创风电设备有限公司 地理信息图像生成方法及设备
CN108182717B (zh) * 2017-12-15 2021-10-29 北京金风科创风电设备有限公司 地理信息图像生成方法及设备
CN110019984A (zh) * 2017-12-27 2019-07-16 北京小度信息科技有限公司 空间索引建立方法、装置、电子设备及可读存储介质
CN113632034B (zh) * 2019-03-25 2024-01-16 万德兰工业有限公司 用于产品的物流内运输的系统和方法
CN113632034A (zh) * 2019-03-25 2021-11-09 万德兰工业有限公司 用于产品的物流内运输的系统和方法
CN110533739B (zh) * 2019-08-15 2024-02-23 深圳供电局有限公司 一种地图网格的成图方法
CN110533739A (zh) * 2019-08-15 2019-12-03 深圳供电局有限公司 一种地图网格的成图方法
CN111260780B (zh) * 2020-01-13 2021-04-16 陕西心像信息科技有限公司 基于高度图高程的实时地形修改方法
CN111260780A (zh) * 2020-01-13 2020-06-09 陕西心像信息科技有限公司 基于高度图高程的实时地形修改方法
CN111915665B (zh) * 2020-07-21 2022-05-31 中国科学院软件研究所 一种计算机上使用简化求交计算的点在多边形内判定方法
CN111915665A (zh) * 2020-07-21 2020-11-10 中国科学院软件研究所 一种计算机上使用简化求交计算的点在多边形内判定方法
CN112465930A (zh) * 2020-11-10 2021-03-09 深圳市益欣网络科技有限公司 扫描线种子填充方法
WO2022161185A1 (zh) * 2021-01-28 2022-08-04 北京字跳网络技术有限公司 一种有向距离场图像的生成方法、装置、设备及存储介质
CN113204607A (zh) * 2021-05-11 2021-08-03 南京大学 一种平衡面积、拓扑和形状特征的矢量多边形栅格化方法
CN113204607B (zh) * 2021-05-11 2023-07-25 南京大学 一种平衡面积、拓扑和形状特征的矢量多边形栅格化方法
CN113868362A (zh) * 2021-11-30 2021-12-31 亿海蓝(北京)数据技术股份公司 航路轨迹构建方法、系统、船舶和船舶管理系统
CN116502318A (zh) * 2023-06-27 2023-07-28 中南大学 一种提取铁路站场相交设备空间信息的方法
CN116502318B (zh) * 2023-06-27 2023-09-05 中南大学 一种提取铁路站场相交设备空间信息的方法
CN117407552A (zh) * 2023-12-15 2024-01-16 南京气象科技创新研究院 一种栅格信息精准赋值矢量线的信息表达方法
CN117407552B (zh) * 2023-12-15 2024-02-09 南京气象科技创新研究院 一种栅格信息精准赋值矢量线的信息表达方法

Also Published As

Publication number Publication date
CN105184837B (zh) 2018-02-02

Similar Documents

Publication Publication Date Title
CN105184837A (zh) 一种矢量多边形栅格化的算法及系统
CN104050626B (zh) 用于将基元光栅化的方法、系统和存储介质
US11983794B2 (en) Parallelized pipeline for vector graphics and image processing
CN101091175B (zh) 负载均衡
US8570322B2 (en) Method, system, and computer program product for efficient ray tracing of micropolygon geometry
CN104036537A (zh) 多分辨率一致光栅化
US8773422B1 (en) System, method, and computer program product for grouping linearly ordered primitives
CN102096907B (zh) 图像处理技术
CN117280387A (zh) 用于光线和路径追踪的位移微网格
DE102013020613A1 (de) Umgehung der Pixel-Schattierung für die grafische Bilderzeugung mit geringer Leistung
CN104050704A (zh) 用于可变分辨率渲染的一致性顶点捕捉
DE102013021046A1 (de) Erzeugung fehlerbefreiter Voxel-Daten
CN106204712A (zh) 分段线性不规则光栅化
CN1926558A (zh) 对任意成三角形的表面应用精确三维体纹理的系统和方法
KR20210066727A (ko) 그래픽 처리 시스템
CN103871019B (zh) 用于处理路径图像以促进光栅化的方法和设备
CN105122310A (zh) 用于基于瓦片的渲染的帧内时戳
CN101751682A (zh) 一种通用地图的制备方法
DE102013222685A1 (de) System, Verfahren und Computer-Programm-Produkt zum Abtasten einer hierarchischen Tiefe-Karte
KR20150093518A (ko) 그래픽 처리 장치
US20160307294A1 (en) Systems and Methods for Displaying Patterns of Recurring Graphics on Digital Maps
CN109712225B (zh) 一种面对象的渲染方法、装置、设备及存储介质
TW201447813A (zh) 產生防鋸齒體素資料
Thöny et al. Deferred vector map visualization
CN105741335B (zh) 一种基于分块组织的多层次兵棋地图快速绘制方法

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant
TR01 Transfer of patent right
TR01 Transfer of patent right

Effective date of registration: 20200810

Address after: 430000 408, room 4, 5 building, Yang Yuan science and Technology Pioneer Park, 1004 Heping Road, Wuchang District, Wuhan, Hubei.

Patentee after: HEROLAND SPATIAL INFORMATION TECH Co.,Ltd.

Address before: 430000 Hubei Province, Wuhan city Hongshan District East Lake New Technology Development Zone, Optics Valley Lu Tong Jian Tiancheng Meiya 5 unit 1002 Optics Valley Road

Patentee before: WUHAN YUNKONGJIAN GEOGRAPHY INFORMATION TECHNOLOGY Co.,Ltd.

PE01 Entry into force of the registration of the contract for pledge of patent right
PE01 Entry into force of the registration of the contract for pledge of patent right

Denomination of invention: A method and system of vector polygon gridding

Effective date of registration: 20210624

Granted publication date: 20180202

Pledgee: Guanggu Branch of Wuhan Rural Commercial Bank Co.,Ltd.

Pledgor: HEROLAND SPATIAL INFORMATION TECH Co.,Ltd.

Registration number: Y2021420000047

PC01 Cancellation of the registration of the contract for pledge of patent right
PC01 Cancellation of the registration of the contract for pledge of patent right

Date of cancellation: 20230831

Granted publication date: 20180202

Pledgee: Guanggu Branch of Wuhan Rural Commercial Bank Co.,Ltd.

Pledgor: HEROLAND SPATIAL INFORMATION TECH CO.,LTD.

Registration number: Y2021420000047