【问题标题】:Finding the diagonals of a polygon寻找多边形的对角线
【发布时间】:2010-12-07 18:56:02
【问题描述】:

给定一个凹多边形(没有自相交),它的节点按顺时针顺序排列,我们如何确定它的所有内部对角线(多边形内部的对角线)?

我对不使用任何三角函数的解决方案感兴趣。

背景和我的尝试

在我的计算几何课中,我们得到了以下算法来测试[pi, pj] 是否是多边形p0, p1, ... pn-1 中的内对角线:

  1. 测试[pi, pj] 是否与多边形的不相邻的边相交。如果是,则它不是内对角线。如果没有,请转到第 2 步。
    1. 如果pi 是一个凸点(pi-1, pi, pi+1 右转),那么[pi, pj] 是一个内对角线当且仅当pi, pj, pi+1pi, pi-1, pj 左转。
    2. 如果pi 不是凸点(pi-1, pi, pi+1 左转),则[pi, pj] 是内对角线且当且仅当pj, pj-1, pi 左转。

这个算法是为我们提供一个涉及剪耳的三角测量算法。我实现了那个算法,它似乎在那里工作得很好,但问题是剪耳算法只使用[pi, pi+2] 形式的对角线。

但是,请考虑选择所有非相交对角线的蛮力三角剖分算法。使用我描述的检查内部对角线的子程序(连同线段相交方法),我得到以下结果:

很容易检查我发布的算法是否拒绝内部对角线[3, 6],而实际上它不应该:

3 不是凸点,6, 5, 3 是右转而不是左转,所以会被拒绝。

请注意,当使用剪耳算法时,此多边形已正确进行三角剖分。

我对如何调整此算法以检测多边形中的所有对角线感兴趣。我没有让它工作。

我还发现了这种方法的其他问题,例如绘制外部对角线的多边形。同样,这些与剪耳算法一起工作。然而,我们从未被告知此方法仅适用于特殊形式的对角线,因此我正在寻求澄清。

注意:我无法决定是将其发布在 math.stackexchange.com 还是此处,因为计算几何在某种程度上与编程和数学有关,但我觉得程序员可能会比数学家更熟悉这种算法,因为有人可能在某个时候实际实现过。

【问题讨论】:

  • 请检查。看起来和这个很相似stackoverflow.com/questions/693837/…
  • 我怀疑您所描述的算法还有其他条件(即使对于 [p, p+2] 形式的点),因为很容易构建算法说它是内部的反例但多边形与线段相交 - 例如具有单个凹顶点的六边形,测试 [p-1, p+1] 其中 p 距离凹顶点 3 个顶点。
  • @lijie - 并非如此,算法的第 1 步将涵盖这一点。 @belisarius - 我会检查的。
  • 2.1.看起来它正在测试 pj 是否在由 pi-1、pi、pi+1 定义的凸角的“内部”。在那种情况下,不能2.2。进行修改,以便测试 pj 是否在 pi+1, pi, pi-1 定义的凸角的“外部”?
  • 哦.. 如果我按照建议更改 2.2(如果 pi 是凹点,则 [pi, pj] 是内部对角线当且仅当 pi, pj, pi-1 pi, pi+1, pj 右转) 反例是什么? (注意 or 而不是 and

标签: algorithm computational-geometry


【解决方案1】:

算法的第 2.1 节看起来像是在测试 pj 是否在 pi-1, pi, pi+1 定义的凸角的“内部”。

第 2.2 节可以从第 2.1 节派生,因此它测试pj 是否不是在由pi+1, pi, pi-1 定义的凸角的“内部”中。这基本上是NOT (pi, pj, pi-1 and pi, pi+1, pj make a left turn) == pi, pj, pi-1 or pi, pi+1, pj make a right turn

所以整个子句将是“如果pi 是一个凹点,那么[pi, pj] 是一个内对角线且当且仅当pi, pj, pi-1pi, pi+1, pj(或两者)右转。

【讨论】:

    【解决方案2】:

    几个注意事项:

    1) 通过比较角度很容易检查对角线是否在内部(例如,对于对角线 4-6,角度 3-4-5 大于角度 3-4-6,所以它是内部对角线) .我确信它可以通过向量积来简化,但我的数学不太好。

    2) 要检查特定的内对角线是否不与其他边相交,您可以检查多边形的点是否在预期的一侧。例如:如果我们尝试对角线 1-4,点 2 和 3 应该在一侧,而点 5、6 和 7 在另一侧。如果不成立,则对角线与边相交。

    【讨论】:

      【解决方案3】:

      请注意这将是多么有效,但您可以计算凸包,然后获取凸包中但不在原始多边形中的多边形(“排除”多边形)列表。 (在您的示例中,凸包将具有顶点 1,2,4,5,7,因此排除的多边形将是(2,3,4),(5,6,7)。)然后您想要的对角线是原始多边形的对角线不与任何排除的多边形相交。但请注意,排除的多边形可能不是三角形,确实可能不是凸的,因此线相交测试可能会很尴尬。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-02
        • 1970-01-01
        • 2011-02-18
        • 2012-12-28
        相关资源
        最近更新 更多