aar*_*arr 11 algorithm geometry polygon
将重叠圆组合成多边形的最佳方法是什么?
我给出了一个固定直径的圆心点列表.
我需要将任何重叠的圆圈连接在一起,并在结果多边形中输出一个点列表.
这似乎是一个相当普遍的问题(GIS系统,载体等).这可以通过Google Maps API完成,但我正在寻找实际的算法.
但是,点的顺序是该解决方案的问题.每个圆的点都存储在一个数组中.要将它们正确地与2个重叠的圆圈合并,这是相对简单的.但是,当处理多个重叠的圆圈时,它会变得复杂.
希望您有一些想法可以使这个解决方案工作或另一个算法,以实现所需的结果.
提前致谢!
您应该能够使用如下方法:
这是一张图片来说明该方法。
您可以通过区分左松散端和右松散端,并利用一个圆的每个左松散端必须连接到另一个圆的右松散端这一事实,进一步减少可能的组合数量。对于n
一组中的圆,只留下(n-1)!
连接这些圆的方法,而不管每个圆的点数是多少。
如果您只考虑组中与松散端实际相交的那些圆(只需将它们存储在哈希图/字典中),那么甚至可以进一步减少这种情况。因此,如果您的n
圆平均与k
其他圆相交,则只有n*k
可能的组合。
您还可以利用这样一个事实:另一个松散端的距离不能超过圆上两点之间距离的两倍。我们将这个距离称为距离d
,然后您可以创建一个具有分辨率的空间图d
(例如散列图,或只是一个二维数组)并将每个松散端分配给该地图中的单元格,然后另一个松散端必须与其中一个松散端相同第一个松散端的周围细胞。
因此,点相互连接的方式数量大大减少(特别是,它们在最终图像中的连接方式一开始就不允许):即使使用蛮力,这也应该是可行的,除非你在同一组中有很多重叠的圆圈,并且您可以使用更智能的最近邻搜索算法。
更新:一段时间后回顾这个答案,似乎您可以相当容易地确定“松散端”点的匹配对:假设您在圆 A 中有一个“右”松散端,那么匹配的“左”松散端必须属于半径与第一个“松散端”的下一个“内部”点重叠的圆。因此,如果您将该关系存储在另一个映射中,您可以立即确定匹配的松散末端。(如果内部点与多个其他圆重叠,则地图应包含与其重叠最多的圆。)