【问题标题】:Algorithm to find the largest inscribed chord of a closed polyline找到闭合折线的最大内切弦的算法
【发布时间】:2017-07-26 16:13:10
【问题描述】:

我正在寻找一种算法来找到闭合多段线的最长弦(“直径”)。不幸的是,折线不必是凸的,但弦应该完全位于曲线内。这是一个例子:

我正在寻找的解决方案是红色虚线部分。

您能否为此建议一种有效的算法?到目前为止,我们能够实现的最好结果是尝试所有顶点对的 N² 算法,但即使这样似乎也不正确,因为和弦不一定要通过两个顶点(或者是这样吗?)。

我也对相关问题感兴趣,我们正在寻找连接两个顶点的最大线段(如果线段未完全内接,则该线段位于曲线内的最长部分)。在这种情况下,N² 算法可以工作,但对于大量点来说速度很慢。

【问题讨论】:

  • 你考虑过可见性多边形算法吗? stackoverflow.com/questions/13429856/… 不确定这里是否有用。
  • 如果我是对的,两条线段上的点之间的最长距离必然连接端点(最短距离并非如此)。如果距离被其他多边形边“阻挡”,则阻挡是由顶点完成的。所以在所有情况下,最长的线段都应该经过两个顶点。
  • @YvesDaoust:我同意,这似乎是真的。
  • 令人惊讶的是,这里或Mathematics 都没有提出这个问题,尽管这两个地方都有类似的问题。
  • 只是一个愚蠢的评论,但直径必须穿过曲率中心,这对于像您的示例中那样内切凹多边形是不可能的......所以你想要最大的弦而不是直径。

标签: algorithm geometry computational-geometry mathematical-optimization


【解决方案1】:

我认为解决方案将始终包含至少两个顶点。因此,计算所有顶点之间的所有线段列表,包括延伸到接触另一个多边形线段的线段就可以了。

要计算转换为射线的任何线段是否会与另一条线段相交,请参见答案: How do you check for intersection between a line segment and a line ray emanating from a point at an angle from horizontal?

然后检查我们的线段列表是否完全在多边形内。以下答案将允许您检查,消除那些超出范围的答案。 determine if line segment is inside polygon

现在剩下的最长的应该是答案。

【讨论】:

  • 正确,YvesDaoust 用更少的文字把它四舍五入!
  • 是的,这就是我们最终所做的。还有一个悬而未决的问题是,我们能不能更聪明一点,只检查顶点对的一个子集?避免 O(N²) 复杂度会很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-25
  • 1970-01-01
  • 1970-01-01
  • 2019-09-15
  • 2019-06-11
  • 1970-01-01
相关资源
最近更新 更多