您将使用什么方法来计算表示"跳跃次数的距离"在给定的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,但任何一个例子都是最受欢迎的。
答案 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算法与距离最近点(或多边形质心)的距离进行思考,以计算斑点。