在封闭区域内找到点

时间:2014-02-01 13:02:10

标签: geometry graph-algorithm topology

我有xy网格,其中点具有整数,正坐标。如果它们的x和y坐标相差小于2,这些点就是“邻居” - 它们只是彼此相邻。

在这个网格中,我找到了包围某个区域的路径。路径中的每个点都与前一个点和下一个点相邻,因此它会像您在封闭区域中走动一样进行排序。它也是封闭区域周围的最短路径,因此没有来回的步骤。封闭区域不需要是凸面,因此当您使用一条线路连接路径上的两个随机点时,该线条可能完全位于该区域之外。

问题是,我需要在封闭区域找到至少一个点,即封闭路径中任意点的邻居。

听起来可能很简单,但我还没有找到可靠的算法来确定它。

*对不起,我说得不够好。封闭区域没有“空白部分”。如果封闭区域中有三个点,则周围的路径是捕获这三个点的最小路径。在这张图片中,红色路径最短,黑色太长,我从不需要检测到它们。

Shortest path around point shown red

1 个答案:

答案 0 :(得分:1)

观察以检查我是否理解了这个问题:

  • 可能没有这样的内部点。
  • 鉴于连续路径点是邻居,连接 角度将是45°的倍数。

基本思路是走在路上,跟踪内部和外部邻居。

要确定哪一侧是内部,请沿着路径行进并跟踪累积转弯角度。最终量将为360°或-360°,这将表示内部位于左侧或右侧,具体取决于您定义正角度和负角度的方式。

在第一次传递期间,还会收集路径上的点的哈希集onPathPoints

  1. 将其他两个哈希集初始化为空:exteriorPointspossibleInteriorPoints
  2. 走路径和每个点:
    • 一个。根据路径上前一点和下一点的相对位置,将8个邻居分为路径,内侧或外侧。
    • 湾对于onPathPoints中的每个点,请忽略它。
    • ℃。对于内侧的任何一点和距离1,请返回该点。
    • d。对于内侧的每个点,距离> 1(对角线邻居),将其添加到possibleInteriorPoints
    • 即对于外侧的每个点和距离1,请将其添加到exteriorPoints
  3. 在步行结束时,从possibleInteriorPoints中移除exteriorPoints(设置减法)。将possibleInteriorPoints中剩余的任何一点作为内部点返回。
  4. 否则,没有内部点。
  5. possibleInteriorPoints表示内部对角相邻的点,除非路径在原点和它之间循环(在这种情况下,它将是新路径部分的外部点。

    例如,在下图中,当访问(2,2)并朝向(3,3)时,内部位于右侧。 (3,1)是一个可能的内部点,但是后来在游览时(4,1),(3,1)被注意到是一个外部点,所以将从{{ {1}}。

    enter image description here

    从技术上讲,在这个例子中,算法在访问(4,3)时停止,并注意(4,2)作为距离1的内部点。