发明内容
本发明的一个目的是提供一种处理简单又效率高的单连通的任意多边形区域填充方法及系统。
本发明的上述技术目的是通过以下技术方案得以实现的:
一种单连通的任意多边形区域填充方法,按如下步骤进行:
步骤S1,将原始多边形的凹角进行填补,形成所述原始多边形的外接凸包络;
步骤S2,对所述外接凸包络进行填色。
作为对本发明的优选,在对步骤S1中的凹角进行填补之前,判断所述原始多边形是否存在自交边,若存在自交边,则将自交点作为新的顶点并将所述原始多边形分裂成若干子原始多边形,然后对子原始多边形分别进行凹角的填补,形成若干与所述子原始多边形相对应的外接凸包络。
作为对本发明的优选,在步骤S2中,填色方法具体为:
步骤S21,使用目标色对所述外接凸包络进行着色;
步骤S22,使用目标色的反色对凹角填补后形成的新多边形进行着色。
作为对本发明的优选,在步骤S22中,填补形成的新多边形的算法如下:
设起点为Pi点(0<=i<n-1),终点为Pj点(i<j<n+i-1),判断线段PiPj在不在即将形成的外接凸包络的内部,判断的方法为:
计算PiPj连线的直线方程,得到直线方程L(x,y)=ax+by+c,依次将Pj+1点开始的后续各点坐标代入直线方程,得到一系列值{Lk},根据{Lk}的取值,计算出填补形成的新多边形。
作为对本发明的优选,步骤S2的填色过程通过若干轮目标色和目标色的反色循环着色完成。
作为对本发明的优选,使用列表A保存需要填补处理的子原始多边形,使用列表B保存填补处理后产生的对应的外接凸包络,使用列表C保存处理后产生的填补形成的新多边形。
作为对本发明的优选,着色使用种子点扫描线算法。
作为对本发明的优选,种子点为外接凸包络的重心。
一种单连通的任意多边形区域填充系统,包括填补单元、填色单元,所述填补单元用于对原始多边形的凹角进行填补并形成外接凸包络,所述填色单元用于对所述外接凸包络进行填色。
作为对本发明的优选,该系统还包括判断单元、计算单元、存储单元。
本发明将复杂多边形转换为凸多边形,而凸多边形的着色方法相对简单,提高算法效率。
具体实施方式
以下具体实施例仅仅是对本发明的解释,其并不是对本发明的限制,本领域技术人员在阅读完本说明书后可以根据需要对本实施例做出没有创造性贡献的修改,但只要在本发明的权利要求范围内都受到专利法的保护。
实施例1
本发明提供一种适用单连通的任意多边形区域填充的方法。
单连通的任意多边形,包括凸多边形和凹多边形。区域填充算法,是计算机图形学上的基本算法。
所谓单连通,即区域内没有空洞。
该方法的总流程如下:
按如下步骤进行:
步骤S1,将原始多边形的凹角进行填补,形成所述原始多边形的外接凸包络;
步骤S2,对所述外接凸包络进行填色。
总的流程图如图1所示。
现有的技术缺点在于:1.扫描线算法处理速度快,但是针对凹多边形的情况,稍微显得复杂;
2.种子点算法效率要低一些,且如果着色区域很大是,压缩堆栈的点数目增长很快,容易导致堆栈溢出。
本发明的思路是将任意多边形的填色转换为若干个凸多边形的填色,也即外接凸包络,外接凸包络可以理解为凸多边形,然后对这些凸多边形进行颜色填充,可以使用种子点扫描线算法进行区域填充。
进一步,在对步骤S1中的凹角进行填补之前,判断所述原始多边形是否存在自交边,若存在自交边,则将自交点作为新的顶点并将所述原始多边形分裂成若干子原始多边形,然后对子原始多边形分别进行凹角的填补,形成若干与所述子原始多边形相对应的外接凸包络。因为原始多边形可能是由很多多边形依次连起来的,需要将他们区分开。
在步骤S2中,填色方法具体为:
步骤S21,使用目标色对所述外接凸包络进行着色;
步骤S22,使用目标色的反色对凹角填补后形成的新多边形进行着色。
这里需要指出的是,新多边形也可能是有凹角的多边形,则这些新的有凹角的多边形也要处理成外接凸包络,所以该填色方案来说,是一个循环填色的方法,也即对于新的填补的多边形,迭代使用多边形填补算法,直到不再增加新的多边形,下面回具体介绍一种循环填色的方法。
而其中,在步骤S22中,填补形成的新多边形的算法如下:
设起点为Pi点(0<=i<n-1),终点为Pj点(i<j<n+i-1),判断线段PiPj在不在即将形成的外接凸包络的内部,判断的方法为:
计算PiPj连线的直线方程,得到直线方程L(x,y)=ax+by+c,依次将Pj+1点开始的后续各点坐标代入直线方程,得到一系列值{Lk},根据{Lk}的取值,计算出填补形成的新多边形。
另外,步骤S2的填色过程通过若干轮目标色和目标色的反色循环着色完成;
使用列表A保存需要填补处理的子原始多边形,使用列表B保存填补处理后产生的对应的外接凸包络,使用列表C保存处理后产生的填补形成的新多边形;
着色使用种子点扫描线算法;
种子点为外接凸包络的重心。
上述为本发明的总体思路和方法,下面结合具体实例进一步展开描述:
首先,设多边形的顶点序列为{Pi|0<=i<n}。
判断是否存在自交边,如果存在自交边,则将自交点作为新的顶点,并将将原始多边形分裂成多个子原始多边形。如图2所示。
使用多边形填补算法,即通过连接多边形合适的顶点,将凹角填补,得到多边形的外接凸包络;
然后按照目标色对外接凸包络多边形着色,使用目标色的反色(XOR)对填补的多边形区域着色,从而完成整个多边形区域的填色。
如图3所示,
原始多边形区域为S0,通过对多边形填补后,得到一个外接凸包络S,也即凸多边形S,以及三个新的多边形S1、S2、S3。
填色区域可以表示为:
S0=S-(S1+S2+S3)
对于新的填补多边形Si来说,也即对于新多边形S1、S2、S3来说,还应该继续进行填补,因为他们也还不一定是凸多边形,迭代使用多边形填补算法,直到不再增加新的多边形。
多边形填补,实质是求多边形的外接凸包络。其算法如下:
第一步:起点为Pi点(0<=i<n-1),终点从Pj点(i<j<n+i-1,约定Pn+k=Pk)。判断线段PiPj在不在外接凸包络内部。
判断线段PiPj在不在外接凸包络内部的算法如下:
计算PiPj连线的直线方程,得到直线方程L(x,y)=ax+by+c,依次将Pj+1点开始的后续各点坐标代入直线方程,得到一系列值{Lk}。
根据{Lk}的取值,有以下几种情况:
1)如果所有的Lk值均为正值或均为负值,表示PiPj为多边形的外接边。表明线段PiPj不在外接凸包络内部。
如果j=i+1,表明边PiPi+1为外接凸包络的边。此时,调整起点为Pi点为Pi+1点,终点从Pi+2点开始计算新的边。如图4所示。
如果j>i+1,如果为非自交边,则多边形SN={Pk|i<=k<=j}为新的填补多边形。如图5所示。
2)如果Lk值有正有负,表明部分顶点位于在PiPj连线的直线的一边,部分顶点位于在PiPj连线的直线的另一边。线段PiPj在外接凸包络内部。如图6所示。
此时,终点调整为Pj+1点。
如果起点Pi点与所有终点连线均在外接凸包络内部,表明起点Pi点在外接凸包络内部。此时调整起点为Pi点为Pi+1点,终点从Pi+2点开始计算新的边。
3)如果Lk值存在零值,而其它值均为一种符号,表明值为零的点均在PiPj连线所在的直线上面,从值为零的点序列Z={Pj|j为使得L值为零的点的下标}中取连接Pi点的线段中长度最大的点,不妨设为Pk点,线段PjPk不在外接凸包络内部。
将Pj插入序列Z的头部。如果序列Z中,某个点Pt与后续点的下标连续,表明PtPt+1落在PiPj连线的直线上。
新的填补多边形为:
SN={Pk|zi<=k<zj,zi,zj均属于序列Z的点相邻两个点下标,且zj≠zi+1},如图7所示。
然后进行填色。
使用列表A保存本轮需要填补处理的多边形,列表B为本轮处理后产生的对应的外接凸包络,也即凸多边形,列表C为本轮处理后产生的需要填补处理的多边形。
第一轮处理后,列表B的多边形成员使用目标色着色。
第二轮处理后,列表B的多边形成员使用目标色的反色着色。
第2n-1(n>=1)轮处理后,列表B的多边形成员使用目标色着色。
第2n轮处理后,列表B的多边形成员使用目标色的反色着色。
其中,列表B中的多边形都是凸多边形了。
着色方法使用种子点扫描线算法。种子点为凸多边形的重心,其必然在多边形内部。扫描线结合活动边表,针对种子点的上下两部分进行扫描着色。
下面再具体举个例子:
如图8所示,其为原始多边形,由两个多边形Y1和Y2自交形成,则进行判断得到多边形Y1和Y2分别为两个子原始多边形,则需要对多边形Y1和Y2均要进行填补;
如图9所示,对于多边形Y1来说,要形成外接凸包络,需要填补Y11和Y12,而对于多边形Y2来说,要形成外接凸包络,需要填补Y21和Y22,
则第一轮进行填补的多变形为Y1、Y2,分别形成外接凸包络X1和X2,对X1和X2用目标色着色。而第二轮需要填补处理的多边形为Y11和Y12,以及Y21和Y22。
如图10所示,其中,Y12、Y21和Y22已经是外接凸包络,所以只要用目标色的反色着色即可,而Y11则不同,其还是有凹角,所以Y11要填补成外接凸包络N1后再着色,而外接凸包络N1中需要填补的多边形为N11。
则第二轮进行填补的多边形为Y12、Y21和Y22,以及N1,并用目标色的反色着色。
如图11所示,第三轮对多边形为N11进行填补,形成外接凸包络M1,对外接凸包络M1使用目标色着色,且填补的多边形为M11,则M11为第四轮需要填补处理的多边形。
而在第四轮中,由于M11已经是外接凸多边形,所以,整个多边形已经没有新的增加的多边形,所以只要对M11使用目标色的反色进行着色即可。
这样通过四个轮次的着色,即可完成整个多边形的着色,着色方法使用种子点扫描线算法。种子点为凸多边形的重心,其必然在多边形内部。扫描线结合活动边表,针对种子点的上下两部分进行扫描着色。
整个过程中,需要对本轮进行填补处理的多边形进行保存,对本轮的需要着色的外接凸包络进行保存,对本轮处理形成的新多边形,也即本轮形成的需要处理的多边形进行保存。
与现有最好技术相比,本发明的优点在于:
将复杂多边形转换为凸多边形,而凸多边形的着色方法相对简单,提高算法效率,也即,1.使用多边形填补方法,将任意多边形的填色转换为凸多边形的填色;2.使用XOR方法填色。
实施例2
系统图如图12所示,一种单连通的任意多边形区域填充系统,包括填补单元、填色单元,所述填补单元用于对原始多边形的凹角进行填补并形成外接凸包络,所述填色单元用于对所述外接凸包络进行填色。
本系统适用于于实施例1的单连通的任意多边形区域填充方法,通过填补单元对有凹角的多边形填补形成凸多边形后再进行着色。
进一步地,该系统还包括判断单元、计算单元、存储单元。其中,
判断单元用于判断各种条件;
计算单元用于各种公式等的计算;
存储单元用于存储各种数据。
判断单元、计算单元和存储单元可设置为隶属于填补单元,更加高效地完成多边形凹角的填补,也更利于填色单元根据填补单元的结果进行更加快捷、方便的填色作业。
本文中所描述的具体实施例仅仅是对本发明精神作举例说明。本发明所属技术领域的技术人员可以对所描述的具体实施例做各种各样的修改或补充或采用类似的方式替代,但并不会偏离本发明的精神或者超越所附权利要求书所定义的范围。