【问题标题】:Extracting polygons from a polygon with collinear edges从具有共线边的多边形中提取多边形
【发布时间】:2011-01-10 06:21:37
【问题描述】:

如何从包含共线边的多边形中提取简单多边形? 对于下面非常简单的情况,边 2-3 和 6-0 是共线的。我想将其分隔为 0、1、2 和 3、4、5、6。

我可以比较每条边与其他每条边的共线性,但这是一种缓慢的 O(n^2) 方法。有更快的方法吗?

【问题讨论】:

    标签: algorithm geometry polygon computational-geometry


    【解决方案1】:

    找到一个边界圆。计算边界圆与每条边所在的线之间的上/右交点。这是 O(n)。现在通过它的角度元组和它与边界圆相交的角度位置对每条边进行排序。这是 O(nlogn),并且会将共线的边分组到您的排序列表中。

    如果您不太可能有很多平行但不共线的边,那么您可以跳过边界圆的事情,只按角度排序。如果有很多平行的非共线角度,那么仅使用角度仍然“有效”,只是不会为您带来几乎一样多的效率提升。

    【讨论】:

    • 您可以通过将每条线转换为斜率相交形式来做同样的事情。请注意,无论哪种方式,您都可以使用哈希集而不是排序。
    • 我很难理解这一点。如果我想做边界圆,我应该看哪些角度?
    • @Chris 是的,我最初的想法是使用斜率截距形式,但是你需要特殊情况下的垂直边缘。边界圈的事情是为了避免这种情况。散列使​​得处理不精确性变得困难。排序将真正相似的事物放在一起,因此您可以选择如何处理微小的差异。您可以尝试“散列”小的差异,但您会在散列边界附近遇到麻烦。如果你真的想散列,你可以有重叠的散列桶,并将每条边放在多个桶中。
    • @hyn 如果您在多边形周围放置一个边界圆,则每条边都将位于与边界圆相交两次的线上。找到与边界圆的上/右交点的位置,并计算出围绕该点的边界圆的角度。例如:如果 th 点是边界圆上最右边的点,那么它是 0 弧度,最上面是 pi/2 弧度,等等。然后你需要这个角度和边缘本身角度的元组。跨度>
    【解决方案2】:

    你能找到 1-2 和 6-0 的交集吗?如果是这样,您可以生成边和顶点的图。然后,找到所有不重叠的多边形就很简单了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-06
      • 1970-01-01
      • 2013-10-16
      • 1970-01-01
      • 1970-01-01
      • 2017-04-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多