【问题标题】:Creating graph from PNG map从 PNG 地图创建图形
【发布时间】:2016-11-30 00:50:53
【问题描述】:

我有一张地图,上面有涂有特定颜色的通道,人们只能在这些通道上行走 - 所以任何其他颜色都是障碍。是否有任何工具/库/算法可以从这种地图创建图形?

【问题讨论】:

标签: java algorithm image-processing


【解决方案1】:

不需要任何库或工具来构建它。手头的任务足够简单和独特,足以证明新实施的合理性。

下面我概述了我将为完成此任务而构建的组件,特别强调它们的狭窄职责。

图表 [T]

该图表示节点集合中节点对之间的二元关系。 T 表示与这些节点关联的有效负载——在您的用例中,是图像的像素坐标。我们不对图是有向图还是无环图或类似的东西做任何假设。

节点 [T]

图中的单个节点。它有一个T 类型的通用有效载荷和一个名为GetNeighboringNodes 的方法。

PassageGraphBuilder

这个类负责从Image 中创建一个Graph<PixelCoordinates>。它包含Color 代表给定Image 中的一个段落的配置,以及哪个方向性(只是上/下/左/右或对角线?)允许连接。

它通过为Image 中的每个像素创建一个Node<PixelCoordinates> 来执行此任务。然后,它通过检查Image 中每个相邻像素的颜色来创建这些节点之间的关系。

WorldToGraphMap

该组件负责将世界坐标映射到像素坐标。这允许您的世界的规模独立于用于驱动它的数据。它有GetWorldCoordinatesForNodeCenter(Node<PixelCoordinates>)GetNodeForWorldCoordinates(WorldCoordinates) 等方法。

那么你可以...

最后,您可以执行以下操作:

  • 将玩家所需的新位置(在世界坐标中)作为输入,可能由控制器输入驱动,
  • 调用GetNodeForWorldCoordinates(WorldCoordinates)确定图中新位置对应的节点,
  • 检查玩家当前节点,判断两个节点是否为邻居:
  • 如果新节点是旧节点的邻居,则允许移动;
  • 否则,禁止它。

当然,构建一个真正的导航网格还有很多复杂的地方,但这应该会让你继续这个用例。

【讨论】:

    猜你喜欢
    • 2012-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-30
    • 2013-03-26
    • 2021-09-03
    相关资源
    最近更新 更多