如何在SVG文件中找到相邻路径?

时间:2015-07-13 13:53:30

标签: html algorithm dictionary svg path

我正在尝试创建一个可点击的地图游戏(如Risk),其中我有许多类似于此的svg路径:
Example SVG Map

因此,当玩家1点击玩家2的区域以攻击它时,所点击的区域应该与玩家1的区域有边界,否则其他攻击无效。

我认为在多维数组中存储所有路径及其相邻路径,如下所示:

path[0] -> path[0][0] path[0][1] path[0][2]
path[1] -> path[1][0] path[1][1]

但是因为我的地图很大,所以我这样做是非常低效的。关于如何解决这个问题的任何建议?

2 个答案:

答案 0 :(得分:2)

创建国家/地区表

包含邻接信息,每个国家通常最多有7个邻居,除非你有像梵蒂冈,卢森堡这样的小州......所以对于统一的地图细分,你可以使用静态的邻居数量。像这样:

  • int map[countries_max][neighbors_max];

统一地图划分

有更多方法可以获得邻接信息。对于均匀划分的地图,您可以计算通常靠近国家中心的边界路径的平均点。获取每个国家/地区点并找到距离它最近的国家/地区(点)。如果距离较小,则阈值存储邻居列表中的国家/地区索引。阈值可以是国家/地区的大小(对于矩形分割,每个轴需要2个阈值)。

通用地图划分

您需要检查国家/地区边界路径的任何部分是否接近/平行于其他国家/地区边界路径的任何部分。如果是,则将国家索引存储在邻居列表中。只有拥有边界路径时才可以这样做。

通用地图划分(无边框路径)

如果您的地图是栅格或矢量但不是每个国家/地区的封闭多边形/路径形式(例如,您可以使用分割路径),则上述方法无法使用。当你攻击时你知道攻击的开始和结束位置,从头到尾(DDA或Bresenham)投射线并计算你穿过的边界线数(计算颜色边缘)。如果计数为1,则移动有效。如果您多次跨越相同边界进行攻击,则会出现假阴性。

答案 1 :(得分:1)

我认为将数组用于此类事情的想法并不是正确的方法。

你应该尝试创建一个class Map,这个类中的所有函数都代表一个区域,所有玩家都是这个类的对象。这样做,你可以控制情况更简单。

例如:要知道player1是否已经获得了地图的这一部分,您只需要查看函数player1.Brazil(其中Brazil是否是函数内部的函数对象player1的class Map已经有一个flag = True。此标志为boolean,每当您获得该区域时,您应将此标志更改为True。

因此,通过比较玩家1和玩家2的两个函数以及简单的if语句,您可以创建一个尊重游戏规则的相邻路径。