给定一条射线和多边形,计算多边形内最大的圆,其中中心位于射线上,端点位于圆上

Posted

技术标签:

【中文标题】给定一条射线和多边形,计算多边形内最大的圆,其中中心位于射线上,端点位于圆上【英文标题】:Given a ray and polygon, compute largest circle inside polygon, where center lies on ray and endpoint is on circle 【发布时间】:2016-05-01 19:48:02 【问题描述】:

给定一个简单的多边形(不一定是凸的)和一条原点位于多边形内的射线,我想计算多边形中包含的最大圆,但要遵守以下约束:

    圆的中心位于射线的某处。 射线的原点位于圆上。

是否有一种算法可以准确计算?近似值呢?

【问题讨论】:

如果光线的原点在圆上,另外一个点是圆心,则表示该光线的两个点在圆上,即两个点在圆上多边形,这意味着它不再相交,并且射线和多边形在同一个平面中,或者这两个点是同一个点。 @AlexandruBarbarosie 我编辑了这个问题,说光线的原点位于多边形内。这有意义吗? 我觉得图片更有意义。 我添加了一张图片;如果我误解了这个问题,请告诉我。我必须说它看起来像一道数学题,而不是编程题。您将一个点从其原点穿过射线,并计算到多边形所有边的距离,直到最短距离等于到原点的距离。 @m69 的图像完美地说明了事情。谢谢。 【参考方案1】:

C为满足问题条件的圆集合(即圆心在射线上,射线的原点在圆上)。

考虑多边形的边e。然后:

    C 中的圆圈都没有接触到e。在这种情况下,r(e) = ∞。 有一个最小的圆 cCe 相接触(任何一个 e 都与 相切c,或者 e 的端点之一位于 c 上——你可以通过解决这些可能性找到 c)。在这种情况下,r(e) 是 c 的半径。

那么你想要的答案就是 min(r(e))。

更新 显然你不计算C(这个集合中有无限多个圆)。你要做的是找到接触每条边e的最小圆c(如果存在这样的圆)。对于每条边e,你计算三个候选c:一个与e相切,两个接触e,并选择最小的可行候选人。因此,如果有 n 个边,则最多考虑 3n 个圆。

【讨论】:

这两个步骤是有道理的,但我不确定如何计算 $C$。 查看更新:你不计算 C,这只是为了帮助解释。 现在说得通了。计算每条边的三个候选圆的数学似乎相对简单。【参考方案2】:

(此答案适用于凸正多边形;我误解了术语“简单”多边形。)

圆的中心与射线的原点和多边形的一侧的距离相同。与一条线和一个点等距的点的集合是抛物线。

如果将 n 边多边形分成 n 个部分,则圆将接触多边形的边,该边与圆的中心点所在的扇区接壤。

因此,要找到中心点,请对光线通过的每个扇区执行此操作:

绘制由多边形边和射线原点定义的抛物线。 如果抛物线与扇形内的射线相交,则相交处就是圆的中心。

所以这实际上是为射线和抛物线创建方程并找到交点的问题。

(这只是一个速写,使用圆形而不是真正的抛物线;零件显然应该在线段的边缘相遇。)

【讨论】:

我了解第一段和最后一段,但不了解有关部门的部分。这似乎只适用于凸多边形。 哦,抱歉,我应该更清楚一点。我打算从此页面定义简单多边形:en.wikipedia.org/wiki/Simple_polygon. @BmoreDaniel 我不知道“简单”的具体含义。不过,这可能是一种算法的基础,该算法也适用于更复杂的形状。 是的,我认为您提出的算法对于凸多边形当然应该更有效。

以上是关于给定一条射线和多边形,计算多边形内最大的圆,其中中心位于射线上,端点位于圆上的主要内容,如果未能解决你的问题,请参考以下文章

判断一点是否在多边形内/判断是否在围栏内

判断点是不是在多边形内部的方法

射线法

用射线法实现判断点是否在多边形内部

3.2 多边形的交点 [点/多边形 内/外 测试]

判断点与多边形关系