【问题标题】:How to find adjacent paths in SVG file?如何在 SVG 文件中查找相邻路径?
【发布时间】:2015-10-01 19:57:03
【问题描述】:

我正在尝试制作一个可点击的地图游戏(例如 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]

但是由于我的地图很大,这样我真的效率低下。有关如何解决此问题的任何建议?

【问题讨论】:

  • 到底是什么问题?您想保留这些路径 - 从哪里到哪里?
  • i.imgur.com/hNpThyB.jpg 所以在这张地图中。拥有绿色区域的玩家 1 应该能够攻击黄色区域 2 但不能攻击黄色区域 3,因为玩家 1 与区域 3 没有任何边界。我的问题是我需要找到一种方法来阻止他攻击区域 3。
  • 那么你只需要一个邻接图。您只需要知道即将被攻击的领土是否有属于攻击者的邻居......
  • 谢谢,但问题是创建邻接图。我的地图很大,存储所有路径的相邻路径对我来说似乎效率很低。
  • 您只需要存储每个区域的邻接关系。为什么要使用路径?每个领土都有一个邻居列表。即使对于一张大地图,也不应该有那么多数据(我认为它甚至是O(n)...)

标签: html algorithm dictionary svg path


【解决方案1】:

创建国家/地区表

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

  • int map[countries_max][neighbors_max];

统一地图划分

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

通用地图划分

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

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

如果您的地图是栅格或矢量,但不是每个国家/地区的封闭多边形/路径(例如,您可以使用分割路径),则上述方法不可用。当您攻击时,您知道攻击的开始和结束位置,因此从头到尾投射线(DDA 或 Bresenham)并计算您越过多少边界线(计算颜色边缘)。如果计数为 1,则移动有效。如果您多次施放跨越同一边界的攻击,这将产生误报。

【讨论】:

  • 谢谢!我会试试的。
【解决方案2】:

我认为对这种事情使用数组的想法不是正确的方法。

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

例如:要知道player1是否已经拿到了那部分地图,你只需要看看函数player1.Brazil(其中Brazilclass Map里面的函数)对象 player1) 已经带有标志 = True。该标志将是boolean,并且每当您获得该区域时,都应将此标志更改为True。

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

【讨论】:

  • 感谢您的评论。但是如果有两个以上的玩家呢?我们不会再找到相邻的路径。
  • @UlaşAnılAÇIKEL 欢迎我的朋友。每个玩家都是一个对象,每个人都有他们已经获得的领土的信息,所以不管你有多少玩家,如果你想知道你是否可以攻击地图的特定部分,你只需要调用每个玩家的地图部分的功能,并使用 if 语句与游戏的逻辑进行比较。当然,如果你不断增加玩家数量,这将变得越来越困难。但这对我来说似乎是一个很棒的算法。
猜你喜欢
  • 2015-06-08
  • 2017-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多