【问题标题】:Inscribing two circles in convex polygon, with max sum of radiuses在凸多边形中内切两个圆,半径之和最大
【发布时间】:2021-07-26 12:57:14
【问题描述】:

我正在尝试解决问题“在凸多边形中内切两个圆,半径之和最大”。 我可以在最大半径的凸多边形中内接一个圆,但是两个圆呢?有没有什么算法可以解决我的问题。

分析算法优于数值算法。

【问题讨论】:

  • 除了使用所有可能的组合之外,您如何测试结果是否有效?我认为非蛮力算法取决于形状......我会首先使用OBB或PCA来获得大约在中心的最长内切线,然后使用任何approximation search尝试沿着它的所有最大圆圈......但是不知道如何检查结果是否正确(没有蛮力)。圆圈是否必须相互接触?假设它们不相交...
  • 是的,他们必须触摸。我搜索多边形的任意三个边,然后找到它们的交点(必要时扩展它们)。我得到两个角。我用它们建立平分线。平分线的交点将是圆的中心。我找到从中心到任何选定边的距离——这将是半径。然后我检查从中心到所有边的距离是否不小于半径(这检查圆是否在多边形内)。在所有这些圆中,我选择了半径最大的那个。

标签: algorithm geometry


【解决方案1】:

我能想到的唯一可以在约束条件下工作的就是分而治之:

  1. 通过简单的线条将“所有”可能的形状切割成两部分

    我会使用像 approximation search 这样的贪婪 2x 嵌套搜索作为启发式算法,因此蛮力将变成 O(log^2(n)) 的更好复杂性,其中 n = shape_circumference/accuracy

    因此,只需嵌套 2 个循环/搜索,沿着整个圆周进行,并通过它们形成的线切割形状。为了提高速度,您可以添加其他启发式方法,例如:

    无需以相反的顺序测试相同的 2 个点,因此另一个 for 循环可以从第一个点开始。

    无需测试第二个 for 循环的完整圆周,因为正确答案很可能在两个点上都尽可能接近垂直于圆周,因此您可以仅搜索附近的角度,并有一定的误差范围,例如 + /-30度

  2. 计算沿切割线共享同一点的两个形状的内切圆

    这可以是另一个搜索,因此添加另一个 O(n)O(n^2) 会导致 O(log(n)^3)O(log(n)^4) 这还不错。

    我是这样看的:

    并且正确的点很可能在中心附近“略微”偏移切割线之间的角度与切割线两侧的“平均”圆周角之间的比率

但这只是我的直觉,这样的结果将是“最好的”,而不仅仅是一些贪婪的结果,几乎是最好的结果,可能会丢失正确的答案! 几何/数学证明不是我的事.

最重要的是,切割线很可能接近垂直于形状主轴(如果存在最长的中心线),因此计算 OBBPCA最大中心line 直接可以加速点搜索,并且切割线位置将从形状中心偏移“平均”垂直于切割中心线的宽度,可用于再次加速搜索.. .

宽度(棕色)比率从中心偏移(橙色)切割线:

如果您不想实现 OBB、PCA...,也可以使用 O(log(n)^2) 搜索最大中心线,类似于切割线搜索...

【讨论】:

  • 您的想法很有用,它们帮助我意识到第二个圆的中心应该在多边形的平分线上(在扩展意义上)。然后,通过蛮力(选择右平分线)和数值方法解决了问题。就我而言,这种粗鲁的方法就足够了。
猜你喜欢
  • 2011-05-15
  • 1970-01-01
  • 1970-01-01
  • 2011-07-03
  • 2011-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多