从GIS文件(城市地图)中获取一组(2D)点,我需要生成定义该地图的“轮廓”(边界)的多边形。其输入参数将是点集和“最大边长”。 然后它将输出相应的(可能是非凸)多边形。
目前为止我找到的最佳解决方案是生成Delaunay三角形,然后删除外部边缘长度大于最大边长的部分。当所有外部边都小于此长度时,我只需删除内部边即可获得所需的多边形。问题在于,这非常耗时,我想知道是否有更好的方法。
从GIS文件(城市地图)中获取一组(2D)点,我需要生成定义该地图的“轮廓”(边界)的多边形。其输入参数将是点集和“最大边长”。 然后它将输出相应的(可能是非凸)多边形。
目前为止我找到的最佳解决方案是生成Delaunay三角形,然后删除外部边缘长度大于最大边长的部分。当所有外部边都小于此长度时,我只需删除内部边即可获得所需的多边形。问题在于,这非常耗时,我想知道是否有更好的方法。
我们实验室的一位前学生在他的博士论文中使用了一些可行的技术。我相信其中一个被称为“alpha shapes”,并在以下论文中引用:
http://www.cis.rit.edu/people/faculty/kerekes/pdfs/AIPR_2007_Gurram.pdf
该论文提供了一些更进一步的参考资料。
H01 = bearing from P0 to P1
H12 = bearing from P1 to P2
A = fmod( H12-H01+360, 360 )
|P2-P1| <= MaxEdgeLength
然后您设置
P0 <- P1
P1 <- P2
并重复此过程,直到回到起点。
这仍然是O(N^2),因此您需要对点列表进行排序。如果您按照它们相对于城市重心的方位角进行排序,可以在每次迭代时限制需要考虑的点集。
一个快速的近似解决方案(对于凸包也很有用)是找到每个小元素东西方向的南北边界。
根据您需要多少细节,创建一个固定大小的上/下限数组。对于每个点,计算它在哪个东西方向的列中,然后更新该列的上/下限。在处理完所有点之后,您可以插值那些错过的列的上/下限点。
事先进行快速检查非常值得,以确定是将NS还是Ew分组对于非常长而薄的形状。
好问题!我还没有尝试过这个方法,但我的第一步会是使用迭代法:
我认为只要表现足够好,它就可以工作 - 对于您的初始3个点的良好启发式可能会有所帮助。
祝你好运!