我在带有正方形(即区域)的网格中执行一些地理计算。我使用的是Delphi,但逻辑也可能适用于C ++。我先解释一下我想做什么。
下面的图像是我的网格的一部分,它由二维数组Square
表示,表示每个方格的中心点,以及"通过图层的移动":
绿色方块的X和Y坐标为2,因此为Square[2,2]
。实际坐标存储在Square[2,2].Latitude
和Square[2,2].Longitude
中,以及其中的额外信息。我用于计算的Square[2,2].Info
。
现在的目的是:我需要对周围区域进行一些计算。可以调用多少周围区域"邻居",取决于多少"层"我已经定义了。在上图中,我使用了其中两个"层"。这意味着当从绿色单元格开始时,我绕过它一次(蓝色箭头),然后再绕第二层(红色箭头)。
现在出现问题:如果我在Square[1,1]
(绿色方块)而不是Square[2,2]
开始,如下图所示,第二层(红色)将尝试访问左侧和底部不存在(即在" -1"列和行中)。见下图。当然,所有边界都会出现此问题。
我可能会为每个场景的IF语句制作例外,但我想知道是否有共同的编程"技巧"可以处理您尝试访问数据的情况不存在。
例如,我想如果我可以按照第一张图片中描绘的箭头图案来每次访问所有相邻的正方形,即使存在不存在的正方形,也会非常方便。所以,看看第一张图片,在Square[3,0]
之后你会去Square[3,-1]
之类的东西,然后最终回到"可行的" Square[0,3]
中的区域。
答案 0 :(得分:0)
要访问邻域,您可以使用某种BFS(广度优先搜索)。
但是对于稀疏结构(如上图所示),值得使用一些数据结构以良好的方式组织单元格。也许kd-tree是合适的 - 您可以在树中添加所有现有单元格,并在给定单元格周围进行范围搜索,以获取其附近的其他单元格。
另请参阅其他空间数据结构(请参阅kd-tree页面底部的列表)。