计算邻域距离

时间:2014-10-23 13:46:30

标签: delphi geometry computational-geometry

您将使用什么方法来计算表示"跳跃次数的距离"在给定的2D地图中,必须从一个区域到另一个区域?

让我们以下面的地图为例:

Map http://obones.free.fr/distance.png

计算的最终结果将是这样的三角形:

  A B C D E F
A 
B 1
C 2 1
D 2 1 1
E . . . .
F 3 2 2 1 .

这意味着从A到D,需要2次跳跃 然而,从任何地方到E,都是不可能的,因为"差距"太大了,所以价值是"无限",在这里用简化点表示。

正如您在示例中所看到的,多边形可能共享点,但大多数情况下它们只是靠近在一起,因此应允许最大间隙考虑两个多边形相邻。

这显然是一个简化的例子,但在实际情况中,我面对的是大约60000个多边形,我只对最多4个跳跃值感兴趣。

作为输入数据,我将多边形顶点作为坐标数组,我已经知道如何计算质心。

我最初的做法是"画"在白色背景画布上的多边形,每个都有自己的颜色,然后在两个候选多边形质心之间走线。计算我遇到的颜色可以给我跳跃的数量 然而,这并不是真正可靠的,因为它没有考虑凹形布置,其中一个人必须绕着“凹槽”走动。当从A到F时可以看到从一个多边形到另一个多边形。

我曾尝试寻找有关此主题的参考资料,但找不到任何参考资料,因为我很难确定用于描述此类问题的正确术语。

我的目标语言是Delphi XE2,但任何一个例子都是最受欢迎的。

3 个答案:

答案 0 :(得分:2)

您可以尝试单个链接群集或某些voronoi diagrams。您也可以强行或尝试Density-based spatial clustering of applications with noise (DBSCAN)K-means clustering

答案 1 :(得分:2)

您可以为每个初始多边形创建具有小偏移的膨胀多边形,然后检查与相邻(膨胀)多边形的交点。偏移对于补偿多边形之间的小间隙很有用。

Clipper library可以解决充气和交叉问题 潜在邻居问题的解决方案取决于实际条件 - 例如,简单方法 - 将平面划分为方形单元格,并检查在同一单元格和最近单元格中具有顶点的邻居。

每对相交的多边形在(未加权,无向)图形中给出边缘。您希望找到长度为< = 4的所有路径 - 只需从每个顶点(多边形)执行深度限制BFS - 假设图形稀疏

答案 2 :(得分:0)

我会尝试:

1)对所有多边形的所有点进行Delaunay三角剖分

2)从Delaunay图中删除在同一个多边形中具有3个点的所有三角形

如果至少一个三角形在两个多边形中至少有一个点(或者很明显,如果多边形有一个公共点),则两个多边形是逐点的。

如果每个多边形在相同的四边形中具有至少两个相邻点=两个相邻的三角形(或显然是两个共同点和相邻点),则两个多边形是并列的。

一旦用新的多边形(三角形最终组合)填充了间隙,使用Djikistra算法与距离最近点(或多边形质心)的距离进行思考,以计算斑点。