一种游戏地图的区域填充方法和装置与流程

文档序号:14579505发布日期:2018-06-02 03:10阅读:510来源:国知局
一种游戏地图的区域填充方法和装置与流程

本发明涉及计算机图形学领域,特别涉及一种游戏地图的区域填充方法和装置。



背景技术:

平面区域填充是计算机图形学领域的一个重要的课题,区域填充是一种将指定不规则区域内部像素填充为填充色或者图案等的过程,在计算机辅助设计和图像处理领域有广泛应用。作为平面区域填充在游戏领域的一具体应用实例,已知在游戏界对圈地填充应用的需求如下:玩家只要在圈地的过程当中,不被其他玩家碰到或者自己碰到已经走过的轨迹,并回到自己的领地内,就可以将轨迹之中的辖区变成自己的领地。将规则抽象出来的圈地填充方法:即在二维格子坐标下,给定已有任意形状的领地和任意行走轨迹,行走轨迹的起点和终点属于已有领地内,完成其对轨迹相关联的所有封闭区域的填充。这里不同的是填充算法泛指填充颜色,这里圈地指填充领地,其本质是一样的。目前领域一般常见的填充算法主要是种子填充算法,其基本思想是:从多边形区域的一个内点开始,由内向外用给定的颜色画点直到边界为止。如果边界是以一种颜色指定的,则种子填充算法可逐个像素地处理直到遇到边界颜色为止,逐像素一般采用4向连通、8向连通或者扫描线方式遍历。

例如采用4向连通种子填充算法的流程如下:

a)种子像素压入栈中;

b)如果栈为空,则转e);否则转c);

c)弹出一个像素,并将该像素置成填充色;并判断该像素相邻的四连通像素是否为边界色或已经置成多边形的填充色,若不是,则将该像素压入栈;

d)转b);

e)结束。

通过上面的流程可以看出现有方案至少存在以下缺陷:

1种子填充算法只适用于填充一个封闭的区域,而圈地里行走轨迹则可能生成多个封闭的区域。

2种子填充算法需要在多边形区域的一个内点开始,而内点的确定在实际中却非常困难。圈地填充算法里行走轨迹是任意形状,导致获取内点变得非常复杂。

此外,大量的嵌套调用会导致占用的内存扩大,不仅消耗大量的资源,还容易造成内存溢出。



技术实现要素:

为了解决上述提出的一个或多个缺陷,根据本发明的第一个方面,提供了一种游戏地图的区域填充方法,包括以下步骤:A.获取已填充的格子和行走轨迹格子的坐标;B.创建最小包围区域;C.在最小包围区域内标记封闭区域;D.填充封闭区域,其中,最小包围区域覆盖所述已填充的格子和行走轨迹格子的坐标。

进一步地,步骤B还包括以下子步骤:创建临时坐标topLeft和bottomRight;遍历已填充的格子和行走轨迹格子的坐标,并取其中当前格子的坐标为grid,如果grid.x<topLeft.x,则赋值topLeft.x=grid.x;如果grid.y<topLeft.y,则赋值topLeft.y=grid.y;如果grid.x>bottomRight.x,则赋值bottomRight.x=grid.x;如果grid.y>bottomRight.y,则赋值bottomRight.y=grid.y;当遍历所有已填充的格子和行走轨迹格子的坐标后,基于坐标topLeft到坐标bottomRight建立最小包围区域。

进一步地,所述格子为具有8个联通方向的格子。

根据本发明的第二个方面,提供了一种游戏地图的区域填充装置,包括:第一模块,其获取已填充的格子和行走轨迹格子的坐标;第二模块,其创建最小包围区域;第三模块,其在最小包围区域内标记封闭区域;第四模块,其填充封闭区域,其中,最小包围区域覆盖所述已填充的格子和行走轨迹格子的坐标。

进一步地,第二模块包括以下子模块:第一子模块,创建临时坐标topLeft和bottomRight;第二子模块,遍历已填充的格子和行走轨迹格子的坐标,并取其中当前格子的坐标为grid,如果grid.x<topLeft.x,则赋值topLeft.x=grid.x;如果grid.y<topLeft.y,则赋值topLeft.y=grid.y;如果grid.x>bottomRight.x,则赋值bottomRight.x=grid.x;如果grid.y>bottomRight.y,则赋值bottomRight.y=grid.y;第三子模块,当遍历所有已填充的格子和行走轨迹格子的坐标后,基于坐标topLeft到坐标bottomRight建立最小包围区域。

进一步地,格子为具有8个联通方向的格子。

根据本发明的第三个方面,提供了一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现本发明第一个方面的方法。

本发明具有以下有益效果:支持具有多个封闭区域的地图的圈地填充需求,从而提高了圈地填充的准确性和适应性。通过最小包围区域和标记填充,有效地提高了圈地填充的效率。

附图说明

图1是表示根据本发明的第一实施例的流程图;

图2是表示根据本发明的一个或多个实施例的4联通格子和8联通格子的示意图;

图3是表示根据本发明的一个或多个实施例的4联通格子和8联通格子填充多个区域的示意图;

图4是表示根据本发明的一个或多个实施例的填充效果图。

具体实施方式

本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。

所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统、装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。

在本申请所提供的几个实施例中,应该理解到,所揭露的系统、装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接相合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。

所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。

另外,在本发明各个实施例中的各功能单元可以集成在二个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。

所述功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在二个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。

本领域技术人员应当理解,在本申请的说明书中,“首先”、“其次”、“第一”、“第二”、“A”、“B”等用语,如无特别声明并不表示对先后顺序的限制。例如,“步骤三”可以在“步骤一”之前,“D”也可以和“A”同时进行。

本发明针对现有技术的缺陷,对一般圈地系统实现的现状与造成的原因加以深入分析,分析开发对圈地填充的具体需求,总结了一套圈地填充方法,以达到支持多区域封闭的圈地填充需求,通过最小包围区域和标记填充来达到算法填充的高效率。

首先,获取已填充的格子和行走轨迹格子的坐标。游戏地图中示例性地由二维平面坐标系或三维坐标系表示,以二维平面坐标系为例,每个地图的格子具有横坐标x和纵坐标y,即每个格子由唯一的坐标(x,y)表示。以遍历的方式,获取地图上所有的已填充的格子和行走轨迹格子的坐标(x,y),并以二维数值的形式保存在堆栈内,作为领地列表。

其次,创建最小包围区域。创建二维临时坐标topLeft(topLeft.x,topLeft.y)和bottomRight(bottomRight.x,bottomRight.y),取已有领地列表第一个格子赋值到坐标topLeft和bottomRight,遍历下所有已有领地格子列表和行走轨迹格子列表,取其中当前格子为grid(grid.x,grid.y),如果grid.x<topLeft.x,则topLeft.x=grid.x;如果grid.y<topLeft.y,则topLeft.y=grid.y;如果grid.x>bottomRight.x,则bottomRight.x=grid.x;如果grid.y>bottomRight.y,则bottomRight.y=grid.y;直到遍历完所有格子。坐标topLeft到坐标bottomRight所组成的区域就是最小包围区域。能够填充的所有封闭区域都在最小包围区域里面。通过确定最小包围区域不仅可以为后面有效地减少遍历的格子数从而提高效率,同时也圈定了填充的边界范围,即一旦有区域(不包括行走轨迹)是包含最小包围区域的边界,那么该区域并非封闭区域。这样后面在种子填充的时候可以以此作为依据来判定该区域是否是封闭区域。另外,当创建一个最小包围区域后,领地列表中依然具有未经遍历的格子坐标时,任选一新的格子坐标,创建第二最小包围区域,如此反复,将领地列表分割为多个最小包围区域,直到将领地列表内的所有格子包含进各自最小包围区域内。

再次,要确定后续要填充遍历的种子。由于行走的轨迹千变万化,且可以形成多个封闭区域,同时封闭区域还需要和行走轨迹相关联,导致没有办法直接给定形成的多个封闭区域里的种子。即给定一个最小包围区域里的任意一个格子,没有办法得知该格子是否在轨迹相关联的封闭区域里。不过此时已经知道了所有封闭区域都在最小包围区域里,这里只需要将每个行走的轨迹格子所对应的上、下、左、右、左上、左下、右上、右下这八个连通的格子flag标记为1,作为后续要填充遍历的种子即可。这样就获得了种子列表,种子列表对应格子的flag都是1。种子列表里虽然包含了一些非封闭区域的种子,但是所有可能和轨迹相关联的封闭区域的种子也都在种子列表中,这样后续填充标记过程中只需要识别非封闭区域的种子不做填充标记,而对封闭区域里的种子全都做填充标记即可。每个轨迹格子对应的4个连通格子和8个连通格子如图2所示。

图2是表示根据本发明的一个或多个实施例的4联通和8联通格子的示意图;其中图2的A表示4联通的格子,图2的B表示8联通的格子,实心圆形表示作为基点的格子,空心圆形表示作为与基点格子相邻的格子,连接线基点格子与相邻的格子的联通关系。从基点出发,如果只是通过上、下、左、右四个方向搜索到达区域内的任意相邻的格子,则用这种方法填充的区域就称为四连通域,这种填充格子就称为“4联通格子”。如果从基点出发,通过上、下、左、右、左上、左下、右上和右下全部八个方向到达区域内的任意相邻的格子,则这种方法填充的区域就称为八连通域,这种填充格子就称为“8联通格子”。另外,对格子本身的形状不做特别的限定,格子可以是圆形、矩形、正六边形、正八边形等。由图2可知,8联通的格子比4联通的格子具有更高的连通自由度,当游戏角色的行走路径交叉,形成了两个闭合的区间,当采用4联通格子时,无法经由未填充格子之间的联通关系连接两个封闭区域,当采用8联通格子时则不存在这个问题。

在本例中采用8连通格子而非采用4连通格子做种子标记,是因为存在轨迹格子斜方向上也有封闭区域的情况,而采用4连通格子则可能导致遗漏了轨迹相关联的封闭区域的种子,那么后续填充标记会遗漏了该封闭区域。例如参照图3,图3是表示根据本发明的一个或多个实施例的4联通格子和8联通格子填充多个区域的示意图。其中图3的C表示4联通格子填充的多个区域,图1的D表示根据本发明的8联通格子的填充多个区域,实心圆形表示作为起始点的基点的格子,空心实线圆形表示游戏角色的行走路径,空心虚线圆形表示经过四向连通种子填充算法填充的区域,可以看到当采用4向连通种子填充算法进行区域填充时,仅填充了左下闭合区域的6个空心虚线圆形格子,而漏掉了右上方的闭合区域,填充的范围有误。当采用本发明的实施例的方法的8向连通方法进行区域填充时,填充了左下闭合区域的6个空心虚线圆形格子和右上方的闭合区域的6个空心虚线圆形格子都得到了正确的填充,提高了填充的准确率。

接下来填充封闭区域,填充标记流程阐述如下:

a.将当前标记变量CurrentSeedFlag设置初始为2(格子的标记为1已经表示是需要遍历的种子),新建一个存放可以填充的标记封闭列表SeedColsedFlags(即格子的标记数在标记封闭列表中则表示该格子是在封闭区域里可以被填充),从左上到右下遍历最小范围区域里的格子,算法开始;

b.取最小范围区域里的下一个格子为当前格子,如果当前格子标记为1(即是种子),就可以对当前格子递归进行标记流程,转c。如果不存在下一个格子,转f;

c.标记流程开始:如果格子的标记为CurrentSeedFlag(表明已经遍历标记过),则直接返回true;如果格子的标记为-1(表明已经是识别标记过的非封闭区域),则直接返回失败;如果格子是在最小包围区域边界上或者边界外(表明在非封闭区域里),将格子标记为-1,并返回失败;否则格子标记为CurrentSeedFlag;获取当前格子的四连通方向上的格子,如果存在格子既不是已有领地格子也不是轨迹格子,那么则递归对每个格子进行标记流程。如果递归中存在某个格子标记流程返回失败,则将格子标记为-1,并返回失败,从而最终退出最外层的标记流程,此时转d;如果不存在某个格子标记流程返回失败,表明最初的当前格子是在封闭区域里,封闭区域里的格子已经都标记为CurrentSeedFlag,最终退出最外层的标记流程,此时转e;

d.当前格子标记流程失败,对当前标记变量CurrentSeedFlag加1,然后继续转b;

e.将当前标记变量CurrentSeedFlag加入到标记封闭列表SeedColsedFlags中,并对当前标记变量CurrentSeedFlag加1,然后继续转b;

至此,结束填充标记流程。

填充标记流程结束后输出了可以填充的标记列表SeedClosedFlags。最后的步骤是遍历最小包围区域里的每个格子,取下个格子为当前格子,如果标记列表SeedClosedFlags包含当前格子的标记或者当前格子属于行走轨迹的格子,那么则当前格子就属于封闭区域内的格子,这时将其填充成自己的格子,直到遍历完所有的格子。结束流程后就可以将行走轨迹内相关联的所有封闭区域填充成自己的领地。

图4是表示根据本发明的一个或多个实施例的实机效果填充效果图。在图4的E中,深色的带状区域表示游戏角色的行走轨迹,由图上可知,紧邻的行走轨迹区段将地图划分为了两个封闭区域和一个半封闭区域。图4的F表示在图4的E的基础上,使用本发明的实施例的方法,对游戏地图中的区域进行填充的结果。实心部分为玩家填充的自己的领地。

该公开的实施例具有以下有益效果:

1.支持具有多个封闭区域的地图的圈地填充需求;

一般的种子填充方法和其他填充方法只对一个区域填充,采用本实施例中的圈地填充方法可以满足对多区域封闭的情况下进行填充,提高了圈地填充的准确性。

2.通过最小包围区域和标记填充来达到方法填充的高效率;

本实施例中的圈地填充方法首先确定了需要填充的最小包围区域来缩小遍历的范围,在填充过程中又对格子做些标记避免重复的判断处理,有效地提高了圈地填充的效率。

根据本发明的第二实施例,提供了一种游戏地图的区域填充装置,包括:第一模块,其获取已填充的格子和行走轨迹格子的坐标;第二模块,其创建最小包围区域;第三模块,其在最小包围区域内标记封闭区域;第四模块,其填充封闭区域,其中,最小包围区域覆盖所述已填充的格子和行走轨迹格子的坐标。

进一步地,第二模块包括以下子模块:第一子模块,创建临时坐标topLeft和bottomRight;第二子模块,遍历已填充的格子和行走轨迹格子的坐标,并取其中当前格子的坐标为grid,如果grid.x<topLeft.x,则赋值topLeft.x=grid.x;如果grid.y<topLeft.y,则赋值topLeft.y=grid.y;如果grid.x>bottomRight.x,则赋值bottomRight.x=grid.x;如果grid.y>bottomRight.y,则赋值bottomRight.y=grid.y;第三子模块,当遍历所有已填充的格子和行走轨迹格子的坐标后,基于坐标topLeft到坐标bottomRight建立最小包围区域。

进一步地,格子为具有8个联通方向的格子。

根据本发明的第三个实施例,提供了一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现本发明第一个方面的方法。

以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应所述以权利要求的保护范围为准。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1