我有xy网格,其中点具有整数,正坐标。如果它们的x和y坐标相差小于2,这些点就是“邻居” - 它们只是彼此相邻。
在这个网格中,我找到了包围某个区域的路径。路径中的每个点都与前一个点和下一个点相邻,因此它会像您在封闭区域中走动一样进行排序。它也是封闭区域周围的最短路径,因此没有来回的步骤。封闭区域不需要是凸面,因此当您使用一条线路连接路径上的两个随机点时,该线条可能完全位于该区域之外。
问题是,我需要在封闭区域找到至少一个点,即封闭路径中任意点的邻居。
听起来可能很简单,但我还没有找到可靠的算法来确定它。
*对不起,我说得不够好。封闭区域没有“空白部分”。如果封闭区域中有三个点,则周围的路径是捕获这三个点的最小路径。在这张图片中,红色路径最短,黑色太长,我从不需要检测到它们。
答案 0 :(得分:1)
观察以检查我是否理解了这个问题:
基本思路是走在路上,跟踪内部和外部邻居。
要确定哪一侧是内部,请沿着路径行进并跟踪累积转弯角度。最终量将为360°或-360°,这将表示内部位于左侧或右侧,具体取决于您定义正角度和负角度的方式。
在第一次传递期间,还会收集路径上的点的哈希集onPathPoints
。
exteriorPoints
和possibleInteriorPoints
。onPathPoints
中的每个点,请忽略它。possibleInteriorPoints
。exteriorPoints
。possibleInteriorPoints
中移除exteriorPoints
(设置减法)。将possibleInteriorPoints
中剩余的任何一点作为内部点返回。 possibleInteriorPoints
表示内部对角相邻的点,除非路径在原点和它之间循环(在这种情况下,它将是新路径部分的外部点。
例如,在下图中,当访问(2,2)并朝向(3,3)时,内部位于右侧。 (3,1)是一个可能的内部点,但是后来在游览时(4,1),(3,1)被注意到是一个外部点,所以将从{{ {1}}。
从技术上讲,在这个例子中,算法在访问(4,3)时停止,并注意(4,2)作为距离1的内部点。