当前位置: 首页 > 知识库问答 >
问题:

圆连成多边形的算法

程化
2023-03-14

把重叠的圆组合成多边形的最好方法是什么?

给出了一系列直径固定的圆的中心点。

这似乎是一个相当常见的问题(GIS系统、向量等)。这是可能的通过谷歌地图API,但我正在寻找实际的算法。

提前感谢!

共有1个答案

唐恺
2023-03-14

您应该能够使用如下所示的appraoch:

  1. 首先,识别属于同一组重叠圆的圆。显然,如果两个圆的中心的绝对距离小于它们的合并半径,则两个圆重叠。对于每个圆,将它所迭代的圆存储在HashMap/Dictionary中。(您可以使用并查找算法或不相交集将其扩展到整个圆组,但实际上并不需要这样做。)
  2. 创建属于一个圆的点时,记住每个点的左右邻居。只需将它们存储在有序数组中即可免费获得。
  3. 删除“内”点,即那些距离与第一个圆相交的任何圆心半径小于一个半径的点。
  4. 将那些没有被移除的内点的邻居标记为圆圈的“松散端”。
  5. 将未删除的点(包括松动的两端)连接到它们原来的左右邻居。
  6. 对于每个松散endpoint,在同一组中找到不同圆的最接近的松散端并将它们连接起来。

这里有一张图片来说明这种方法。

    null

如果只考虑组中那些实际与松散端相交的圆圈(只将它们存储在HashMap/Dictionary中),甚至可以进一步减少这一点。因此,如果您有n圆,平均与k其他圆相交,那么只有n*k可能的组合。

你也可以利用这样一个事实,即另一个松动端不能比圆上两点之间距离的两倍远。让我们将这个距离称为D,然后您可以创建分辨率D的空间映射(例如,一个hashmap或一个2D数组),并将每个松散端分配给该映射中的单元格,然后另一个松散端必须与第一个松散端的周围单元格相同。

这样,点之间的连接方式就大大减少了(特别是,在最后的图像中它们的连接方式一开始是不允许的):即使使用暴力也可以做到这一点,除非在同一组中有许多重叠的圆圈,并且可以使用更聪明的最近邻搜索算法。

更新:一段时间后再看这个答案,你似乎可以很容易地确定匹配的“松散端”点对:假设你在圆a中有一个“右”松散端,那么匹配的“左”松散端必须属于半径与下一个“内”点和第一个“松散端”重叠的圆。因此,如果您将该关系存储在另一个映射中,您可以立即确定匹配的松散端。(如果一个内点被多个其他圆重叠,则地图应该包含与它重叠最多的圆。)

 类似资料:
  • 问题内容: Libgdx中是否可以验证多边形和圆之间的碰撞? 我看到了课程,但只发现了Circle和Rectangle的碰撞测试。那其他多边形呢? 如果我需要手动进行操作,那么使用Libgdx的最佳方法是什么? 问题答案: 因此,我设法在Circle和Polygon之间创建了碰撞测试方法。至少,它对我有用。 这是代码:

  • 这是我第一次尝试在我的网页上设置

  • 本文向大家介绍Java多边形重心计算,包括了Java多边形重心计算的使用技巧和注意事项,需要的朋友参考一下 多边形重心计算 三角形重心 顶点为a,b,c的三角形重心为x = (xa + xb + xc) / 3,y = (ya + yb + yc) / 3 多边形重心 x = (x1w1 + x2w2 + … + xnwn)/W y = (y1w1 + y2w2 + … + ynwn)/W 总结

  • 返回顶点的输入数组,并且附有一些其他方法,如下面所描述 polygon.area() 返回此多边形的标定区域。如果顶点是逆时针顺序,面积为正,否则为负。 polygon.centroid() 返回一个表示此多边形的质心的两元素数组。 polygon.clip(subject) 对这个多边形剪切主题多边形。换句话说,返回一个多边形表示这个多边形和主题多边形的交集。假定剪切的多边形是逆时针方向以及凸多

  • 我是libGDX的新手,据我所知,Intersector类有矩形/矩形、圆/圆、圆/矩形和多边形/多边形的重叠方法,但由于某种原因,它似乎没有任何检查多边形/矩形或多边形/圆的方法。 有没有推荐的方法来检查多边形和矩形/圆之间的冲突? 另外,为什么这被排除在跨部门类之外,有什么原因吗?(即,我应该避免它吗?如果是这样,推荐的替代方案是什么?

  • 我有一个由125个独特的多边形组成的多边形sf对象(代表分散在美国各州的不同区域)。没有一个多边形共享边界。我还有一个30m的山阴影数字高程模型光栅图像,它覆盖了多边形的区域(以及一些)。我想使用光栅包中的地形函数来计算每个多边形的独特斜率和纵横。我的最终产品将是多边形sf对象有两列新列,斜率和纵横,因此每个多边形都有自己的斜率和纵横。 我在原始的全州范围的光栅图像和仅多边形区域的掩蔽光栅图像上使