我有一组2D点,我想从中生成一个多边形(或多边形集合),勾勒出这些点的“形状”,使用以下概念:
对于集合中的每个点,计算该点半径R内所有点的凸包。在为每个点执行此操作后,将这些凸包的并集生成最终形状。
实际构建所有这些凸包的强力方法类似于O(N ^ 2 + R ^ 2 log R)。是否有一种已知的,更有效的算法来产生相同的结果?或者也许是表达问题的另一种方式?
注意:我知道alpha形状,它们是不同的;我正在寻找一种算法来执行上述描述。
以下解决方案不起作用 - 在MATLAB中通过实验验证。
<击> 更新:我有一个建议的解决方案。
命题:对该组点进行Delaunay三角剖分,删除所有圆周大于R的三角形。然后取剩余三角形的并集。
击>
答案 0 :(得分:1)
sweep line algorithm可以改善对R邻居的搜索。或者,您可以只考虑宽度为R的方格的相邻正方形中的点对。这两个想法都可以摆脱N ^ 2 - 当然只有在点相对稀疏时才会这样。
我相信,即使这些点不稀疏(如Olexiy的例子中),扫掠和凸壳发现猫的聪明组合也可以摆脱N ^ 2,但无法提出具体的算法。
答案 1 :(得分:0)
是的,使用旋转卡尺。我的教授在此写了some stuff,从第19页开始。
答案 2 :(得分:0)
如果我误解了这个问题,请告诉我。
我不知道在最坏的情况下( 1 ),你如何获得N ^ 2时间来强制所有凸包。如果几乎任何2个点都比R更接近 - 在这种情况下你需要至少N ^ 2 * logN来构造凸包,不要单独计算他们的联合。
此外,估算中的R ^ 2 * logR来自哪里?
1 对于一个巨大的N,最糟糕的情况(如我所见) - 取一个半径为R / 2的圆,然后在它的边界上随意放置点,就在它的外面。