Algorithm 是否有一个有效的算法来生成二维凹面船体?

Algorithm 是否有一个有效的算法来生成二维凹面船体?,algorithm,geometry,2d,gis,concave-hull,Algorithm,Geometry,2d,Gis,Concave Hull,从GIS文件(城市地图)中获得一组(2D)点,我需要生成定义该地图(其边界)的“轮廓”的多边形。其输入参数为点集和“最大边长度”。然后它将输出相应的(可能是非凸的)多边形 到目前为止,我找到的最佳解决方案是生成Delaunay三角形,然后删除比最大边长的外部边。在所有的外部边都比这个短之后,我只需删除内部边,得到我想要的多边形。问题是,这非常耗时,我想知道是否有更好的方法。我们实验室的一位前学生在他的博士论文中使用了一些适用的技术。我相信其中一个被称为“阿尔法形状”,并在以下文件中引用: 这篇

从GIS文件(城市地图)中获得一组(2D)点,我需要生成定义该地图(其边界)的“轮廓”的多边形。其输入参数为点集和“最大边长度”。然后它将输出相应的(可能是非凸的)多边形


到目前为止,我找到的最佳解决方案是生成Delaunay三角形,然后删除比最大边长的外部边。在所有的外部边都比这个短之后,我只需删除内部边,得到我想要的多边形。问题是,这非常耗时,我想知道是否有更好的方法。

我们实验室的一位前学生在他的博士论文中使用了一些适用的技术。我相信其中一个被称为“阿尔法形状”,并在以下文件中引用:


这篇论文提供了一些您可以遵循的进一步参考。

一个快速近似解决方案(对凸包也很有用)是找到每个小元素东西向的南北边界

根据所需的详细程度,创建一个大小固定的上/下限数组。 对于每个点,计算其所在的E-W列,然后更新该列的上限/下限。处理完所有点后,可以为遗漏的列内插上/下点


对于非常长的薄的形状,事先做一个快速检查,并决定是使用NS还是Ew也是值得的。

好问题!我根本没有尝试过,但我的第一个尝试是这种迭代方法:

  • 创建一个集合N(“未包含”),并将集合中的所有点添加到N
  • 从N中随机选取3个点,形成初始多边形P。将它们从N中移除
  • 使用并查看N中的点。对于N中的每个点,如果它现在包含在P中,请将其从N中删除。一旦您在N中找到一个仍不包含在P中的点,请继续执行步骤4。如果N变为空,则完成
  • 调用A. Find点,找到最靠近A的p的一行,并在中间加上一个。
  • 返回步骤3
  • 我认为只要它的表现足够好,它就会起作用——对于你最初的3点来说,一个好的启发可能会有所帮助

    祝你好运

    这些家伙声称已经开发出一种k近邻方法来确定一组点的凹壳,其行为“几乎与点的数量成线性关系”。可悲的是,他们的文件似乎得到了很好的保护,你必须要它


    下面是一个包含上述内容的示例,它可能会引导您找到更好的方法。

    一个简单的解决方案是围绕多边形的边缘行走。给定边界连接点P0和P1的当前边,边界P2上的下一个点将是具有最小可能a的点,其中

    H01 = bearing from P0 to P1
    H12 = bearing from P1 to P2
    A = fmod( H12-H01+360, 360 )
    |P2-P1| <= MaxEdgeLength
    
    H01=从P0到P1的轴承
    H12=从P1到P2的轴承
    A=fmod(H12-H01+360,360)
    
    |P2-P1 |其他人可能仍然对答案感兴趣:可以应用行进平方算法的变体,应用于(1)凹壳内,以及(2)然后应用(例如3)不同的尺度,取决于点的平均密度。刻度需要是彼此的整数倍,这样您就可以构建一个网格,用于高效采样。这样可以快速找到空样本=正方形、完全位于点“簇/云”内的样本以及介于两者之间的样本。然后,后一类可用于轻松确定表示凹面船体一部分的多边形线


    在这种方法中,一切都是线性的,不需要三角测量,它不使用alpha形状,并且与此处所述的商业/专利产品不同()本文讨论了在平面上刻画一组点的形状的简单多边形的高效生成,并给出了算法。还有一个Java小程序使用相同的算法。

    您可以使用此插件在QGIS中执行此操作;


    根据您需要它与数据交互的方式,可能值得在此查看它是如何完成的。

    作为一个广泛采用的参考,PostGIS从一个凸凹处开始,然后将其嵌入,您可以在此处看到它


    Bing Maps V8 interactive SDK在高级形状操作中有一个凹面外壳选项

    在ArcGIS 10.5.1中,3D Analyst扩展有一个最小边界体积工具,具有凹面外壳、球体、封套或凸面外壳的几何类型。它可以在任何许可级别上使用


    这里有一个凹壳算法:

    事实上,我认为ArcGIS没有一个内置的算法来做他想做的事情。ArcGIS有能力制作凸面外壳,但凹面外壳要复杂得多。您能更精确地定义您的问题吗?:)有5个点:正方形的4个角及其中心。你的边界是什么?如果你的最大边长度允许中心,那么你将“弯曲”正方形的4条边中的哪一条来包含中点是完全任意的。是的,我这样做了,就像我在问题中提到的那样(使用Delaunay三角形)。后来,我对下面NSANDER提出的alpha形状概念做了一些工作,但在我开始工作之前,问题的优先级降低了,我转到了另一个问题。Delaunay具有正确的复杂性(O(n log n))。“我怀疑你能渐进地做得更好。”弗兰克,这不是手动的,它是GPS导航应用程序处理地图的自动工具的一部分。在我的具体案例中,这确实是任意的——点是街角,由此产生的多边形将是城市的轮廓。我使用了一个任意的值,它会给我一个足够详细的多边形,不会太重而无法渲染。我认为它必须是这样的,你必须根据你的应用程序的需要来确定最大长度-我不知道你怎么能自动计算它
    P0 <- P1
    P1 <- P2