【问题标题】:How to determine if a grid cell is within an enclosed perimeter of cells如何确定网格单元是否在单元的封闭边界内
【发布时间】:2017-03-23 05:47:37
【问题描述】:

我一直在开发一个游戏(在 JavaFX 中),玩家在游戏板上绘制一条路径,当他关闭路径时,内部瓷砖成为他的控制区域。

我见过an approach to this for polygons 几乎可以正常工作。我遍历相关点右侧的图块,并计算我输入了作为周边一部分的一系列图块的次数。如果它是奇怪的,它在里面(计数为 1 是一种特殊情况)。

问题是下图中的点 P1 与 P2。向右计数两者将具有相同的计数,但一个在内部,一个在封闭区域之外。我不知道如何定义这种特殊情况。

欢迎提出任何建议或想法。

针对第一条评论进行了编辑:此示例显示了如何在上方/下方和/或左/右查看两侧的点以做出确定可能不起作用。

【问题讨论】:

  • 你为什么不垂直检查点,即检查瓷砖是否在上方和下方都存在。使用这种方法,您无需担心上方或下方的瓷砖数量。
  • 我编辑了我的问题以添加一个示例,在该示例中向上/向下和/或向左/向右查找也不起作用。不过感谢您的建议。

标签: java javafx tile discrete-mathematics game-development


【解决方案1】:

我不考虑点在边界单元格上。您必须定义这样的点是在该区域内还是在该区域外。

算法:

  1. 确定包围该区域但不与该区域共享单元格的最小矩形R
  2. 将点P标记为unvisited,以确定它是在区域内还是区域外。
  3. 如果没有标记为unvisited 的单元格,则P 在该区域内。
  4. 选择标记为unvisited 的任意单元格C 并将其标记为visited
  5. 如果单元格CR的边界单元格,则P在区域外。
  6. 选取C(上、下、左、右)所有未标记为unvisitedvisited的相邻单元格或该区域的边界单元格,并将它们标记为unvisited
  7. 继续 3。

示例 1:

在此示例中,点 P 位于区域之外。这可以通过绿色单元格算法的步骤5. 检测到。

示例 2:

在此示例中,点 P 位于区域内。如果您继续使用剩余的两个未访问的单元格,则该算法的步骤3. 会检测到这一点。

示例 3:

在此示例中,点 P 位于区域之外。这可以通过绿色单元格算法的步骤5. 检测到。

【讨论】:

  • 这看起来是个不错的方法,感谢您抽出宝贵时间回复。它很简单,应该足以满足我的需求。谢谢,开始编码和测试!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-18
相关资源
最近更新 更多