如何确定网格单元格是否在单元格的封闭范围内

How to determine if a grid cell is within an enclosed perimeter of cells

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

我已经看到 an approach to this for polygons 几乎有效。我遍历了相关点右侧的瓷砖,并计算了我进入作为周界一部分的一系列瓷砖的次数。如果是奇数,则在里面(计数为 1 是一种特殊情况)。

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

欢迎任何指点或想法。

为回应第一条评论而编辑:这个例子表明如何寻找 above/below and/or left/right 两边的点来做出决定可能不起作用。

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

算法:

  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. 检测到,用于呈现为绿色的单元格。