如何确定网格单元格是否在单元格的封闭范围内
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 两边的点来做出决定可能不起作用。
我不考虑 坐在 边界单元格上的点。您必须定义这样的点是在区域内还是区域外。
算法:
- 确定包围该区域但不与该区域共享单元格的最小矩形
R
。
- 标记点
P
,判断是在区域内还是在区域外,如unvisited
。
- 如果没有标记为
unvisited
的单元格,则 P
在区域内。
- 选择一个标记为
unvisited
的任意单元格 C
并将其标记为 visited
.
- 如果单元格
C
是R
的边界单元格,P
在区域之外。
- 选取
C
(顶部、底部、左侧、右侧)的所有未标记为unvisited
或visited
的相邻单元格,或者是该区域的边界单元格,并且将它们标记为 unvisited
.
- 继续 3。
示例 1:
在此示例中,点 P
位于该区域之外。这由算法的步骤 5.
检测到,用于呈现为绿色的单元格。
示例 2:
在此示例中,点 P
位于区域内。如果您继续使用剩余的两个未访问单元格,算法的步骤 3.
会检测到这一点。
示例 3:
在此示例中,点 P
位于该区域之外。这由算法的步骤 5.
检测到,用于呈现为绿色的单元格。
我一直在开发一款游戏(在 JavaFX 中),玩家在棋盘上绘制一条路径,当他关闭路径时,内部瓷砖成为他的控制区域。
我已经看到 an approach to this for polygons 几乎有效。我遍历了相关点右侧的瓷砖,并计算了我进入作为周界一部分的一系列瓷砖的次数。如果是奇数,则在里面(计数为 1 是一种特殊情况)。
问题是下图中的点P1 vs P2。向右计数两者的计数相同,但一个在封闭区域内部,一个在封闭区域外部。我不知道如何定义这种特殊情况。
欢迎任何指点或想法。
为回应第一条评论而编辑:这个例子表明如何寻找 above/below and/or left/right 两边的点来做出决定可能不起作用。
我不考虑 坐在 边界单元格上的点。您必须定义这样的点是在区域内还是区域外。
算法:
- 确定包围该区域但不与该区域共享单元格的最小矩形
R
。 - 标记点
P
,判断是在区域内还是在区域外,如unvisited
。 - 如果没有标记为
unvisited
的单元格,则P
在区域内。 - 选择一个标记为
unvisited
的任意单元格C
并将其标记为visited
. - 如果单元格
C
是R
的边界单元格,P
在区域之外。 - 选取
C
(顶部、底部、左侧、右侧)的所有未标记为unvisited
或visited
的相邻单元格,或者是该区域的边界单元格,并且将它们标记为unvisited
. - 继续 3。
示例 1:
在此示例中,点 P
位于该区域之外。这由算法的步骤 5.
检测到,用于呈现为绿色的单元格。
示例 2:
在此示例中,点 P
位于区域内。如果您继续使用剩余的两个未访问单元格,算法的步骤 3.
会检测到这一点。
示例 3:
在此示例中,点 P
位于该区域之外。这由算法的步骤 5.
检测到,用于呈现为绿色的单元格。