【问题标题】:Is there a simple algorithm for calculating the maximum inscribed circle into a convex polygon?是否有一种简单的算法可以将最大内切圆计算为凸多边形?
【发布时间】:2011-04-26 14:24:45
【问题描述】:

我找到了一些解决方案,但它们太乱了。

【问题讨论】:

    标签: algorithm linear-algebra linear-programming convex-optimization convex-polygon


    【解决方案1】:

    总结:这不是小事。所以它不太可能不会变得混乱。但是有some lecture slides,您可能会觉得有用。

    来源: http://www.eggheadcafe.com/software/aspnet/30304481/finding-the-maximum-inscribed-circle-in-c.aspx

    你的问题不是小事,还有 没有 C# 代码可以直接做到这一点 盒子外面。你将不得不写 你自己。我发现了问题 有趣,并做了一些研究,所以 这里有一些线索可能会有所帮助。

    首先,这里有一个简单的答案 英语”来自 mathforum.org:

    http://mathforum.org/library/drmath/view/67030.html

    答案参考 Voronoi 图 作为一种制作方法 过程更高效。在研究中 Voronoi 图,结合 “最大空圆”问题 (同样的问题,不同的名字),我来了 在这篇信息丰富的论文中:

    http://www.cosy.sbg.ac.at/~held/teaching/compgeo/slides/vd_slides.pdf

    它是由 Martin Held 撰写的 计算几何教授 奥地利萨尔茨堡大学。 对 Held 博士的进一步调查 着作产生了一些好的 文章:

    http://www.cosy.sbg.ac.at/~held/projects/vroni/vroni.html http://www.cosy.sbg.ac.at/~held/projects/triang/triang.html

    对 Vornoi 图的进一步研究 产生了以下网站:

    http://www.voronoi.com/

    这个网站有很多信息, 各种语言的代码和链接 到其他资源。

    最后,这里是网址 数学和计算科学 国家研究院分部 标准和技术(美国),一个 丰富的信息和链接 关于各种数学:

    http://math.nist.gov/mcsd/

    -- 高温,

    凯文斯宾塞微软 MVP

    【讨论】:

    • Kevin Spencer 的大部分回复文本提到了涉及凹多边形或凸多边形的问题。在凸的情况下问题可能会容易得多。
    • @Josephine:可能会。我没有详细介绍过,但可能会。也许你有什么想法?
    • 在这里发表评论后,我也发布了一个答案。我的想法就在那里。
    • 当多边形是凸面时,问题肯定更容易。问题变成了一个线性程序。我也发布了答案。
    • 链接已损坏。
    【解决方案2】:

    也许这些“过于杂乱”的解决方案正是您真正想要的,没有更简单的解决方案?

    我可以提出一个简单但可能不精确的解决方案,它使用数值分析。假设你有一个弹性球,你从零半径开始给它充气。如果它的中心不在你要找的中心,那么它会移动,因为墙壁会将它“推”向正确的方向,直到它到达那个点,从那里他不能移动到其他任何地方。我猜,对于凸多边形,球最终会移动到它具有最大半径的点。

    您可以编写一个模拟圆膨胀过程的程序。从任意点开始,然后“膨胀”圆直到它到达墙壁。如果你继续给它充气,它会朝一个方向移动,不会让它更靠近它已经遇到的墙壁。您可以通过绘制与墙壁平行的线穿过您当前所在的中心来确定它可以移动的可能方式。

    在本例中,球将沿绿色标记的方向之一移动:


    (来源:coldattic.info)

    然后,向其中一个方向稍微移动你的球(一个不错的选择可能是沿着角平分线移动) ),然后重复该步骤。如果新的半径小于你所拥有的半径,请撤退并降低你移动它的速度。当你必须让你的步速小于 1 英寸的值时,你会找到精度为 1 英寸的中心。(如果你要在屏幕上绘制它,精度为 0.5 像素我猜就够了)。

    如果一个不精确的解决方案对你来说足够了,我想这很简单。

    【讨论】:

    • 这对我来说效果很好。它很容易实现。我什至用它的一个变体来找到一个(不一定是凸的)带孔的斑点中的最大内切圆。
    【解决方案3】:

    最大的内切圆(我假设它是唯一的)将与某些面相切,并且可能无法与其他面相交。如果最大的内切圆与之相交,我们就称一个面为“相关”,否则为“不相关”。

    如果你的凸多边形实际上是一个三角形,那么这个问题可以通过计算三角形的内心,通过角平分线相交来解决。这似乎是一个微不足道的案例,但即使 您的凸多边形很复杂,内切圆将始终与至少三个面相切(证明?似乎在几何上很明显),因此它的中心可以计算为三个相关面的中心(向外延伸以形成一个三角形,该三角形外接原始多边形)。 这里我们假设没有两个这样的面是平行的。如果两条平行线,我们必须将两条平行线的“角平分线”解释为它们之间的第三条平行线。

    这立即提出了一个相当糟糕的算法:考虑所有 n-choose-3 面子集,如上所述找到所有三角形的中心,并测试每个圆是否包含在原始多边形中。在合法的范围内最大化。但这是 n 的三次方,我们可以做得更好。

    但也可以预先识别不相关的人脸:如果人脸相切 对于某个内切圆,则存在一个由该面及其端点处的两个角平分线界定的点区域,该圆的中心必须位于其中。如果即使中心位于该三角形区域最远尖端的圆是“合法的”(完全包含在多边形中),那么面本身也是无关紧要的,并且可以被删除。接触它的两个面应该延伸到它之外,以便它们相遇。

    通过迭代删除在这个意义上不相关的面,您应该能够减少 将多边形转换为三角形,或者梯形,此时问题将很容易解决,并且其解决方案仍将位于原始多边形内。

    【讨论】:

    • 矩形呢?一个修改过的矩形怎么样?它的小边稍微凸出成三角形的两条边,每个? ...but even when your convex polygon is complicated, the inscribed circle will always be tangent to at least three faces (proof? seems geometrically obvious) 似乎站不住脚。
    • 在你描述的两种情况下,“最大的”内接圆并不是唯一的,但在所有最大的内接圆中,至少有一个与三个边相交。
    • 即使仅针对这种情况,您也需要以某种方式知道最大内切圆是否不唯一。
    • 多边形是凸的,所以最大的内接圆是唯一的。
    • @m88:这不是真的。例如,任何具有不同宽度和高度的矩形都是 (a) 凸的,并且 (b) 具有无限个最大尺寸的内切圆。
    【解决方案4】:

    是的。集合 C 的Chebyshev center, x* 是位于 C 内部的最大球的中心。 [Boyd, p. 416] 当C是一个凸集时,那么这个问题就是一个凸优化问题。

    更好的是,当 C 是多面体时,这个问题就变成了一个线性规划。

    假设 m 边多面体 C 由一组线性不等式定义:ai^T x

    maximize  R
    such that ai^T x + R||a|| <= bi,  i in {1, 2, ..., m}
              R >= 0
    

    其中最小化的变量是R和x,||a||是a的欧几里得范数。

    【讨论】:

    猜你喜欢
    • 2011-05-15
    • 1970-01-01
    • 2011-05-28
    • 2018-04-08
    • 2021-07-26
    • 2012-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多