是否有一个简单的算法来计算凸多边形的最大内切圆?

时间:2010-10-17 14:31:53

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

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

4 个答案:

答案 0 :(得分:7)

是。集合C的Chebyshev center,x *是C内最大球的中心。[Boyd,p。当C是凸集时,这个问题就是凸优化问题。

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

假设m面多面体C由一组线性不等式定义:ai ^ T x< = bi,对于i在{1,2,...,m}中。然后问题变成

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

最小化变量为Rx,而||a||a的欧几里德范数。

答案 1 :(得分:6)

摘要:这不是一件轻而易举的事。因此它不太可能不会变得混乱。但是你可能会发现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 Diagrams   作为一种制作方法   过程更有效率。在研究中   Voronoi图,结合   “最大空圈”问题   (同样的问题,不同的名字),我来了   在这篇内容丰富的论文中:

     

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

     

这是由Martin 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/

     

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

     

最后,这是指向的URL   数学与计算科学   国家研究所分部   标准与技术(美国),a   丰富的信息和链接   关于各种数学:

     

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

     

- HTH,

     

Kevin Spencer Microsoft MVP

答案 2 :(得分:6)

也许这些“太乱”的解决方案是你真正想要的,而且没有简单的解决方案?

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

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

在此示例中,球将沿标有绿色的方向之一移动:

http://coldattic.info/pic/522403726925.png

然后,在这些方向中稍微移动你的球(一个好的选择可能是沿着角度的二等分移动),然后重复这个步骤。如果新半径小于你的半径,则撤退并减小移动它的速度。当你必须使你的速度低于1英寸的值时,你就会发现精度为1英寸的中心。(如果你要在屏幕上绘制它,精度为0.5像素我想这会很好。

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

答案 3 :(得分:2)

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

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

这立即暗示了一个相当糟糕的算法:考虑所有n-choose-3面的子集,找到上面所有三角形的激励,并测试每个圆在原始多边形中的包含。在那些合法的人中最大化。但这在n中是立方的,我们可以做得更好。

但是,有可能在前面识别不相关的面孔:如果面部相切 对于某个内切圆,然后有一个由该面和两个角平分线限定在其端点的点区域,其中圆的中心必须位于其中。如果即使其中心位于该三角形区域的最远端的圆是“合法的”(完全包含在多边形中),那么面本身也是无关紧要的,并且可以被移除。接触它的两个面应该延伸到它以外它们相遇。

通过迭代删除在这个意义上无关的面,你应该能够减少 多边形到三角形,或者可能是一个梯形,此时问题很容易解决,其解决方案仍然在原始多边形内。