找到多边形的对角线

时间:2010-12-07 18:56:02

标签: algorithm computational-geometry

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

我对不使用任何触发功能的解决方案感兴趣。

背景和我尝试的内容

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

  1. 测试[pi, pj]是否与多边形的边缘相交。如果是的话,它不是内部对角线。如果没有,请转到步骤2.
    1. 如果pi是凸点(pi-1, pi, pi+1右转),那么[pi, pj]是内对角线iff pi, pj, pi+1pi, pi-1, pj左转转。
    2. 如果pi不是凸点(pi-1, pi, pi+1左转),那么[pi, pj]是内对角线iff pj, pj-1, pi向左转。
  2. 该算法是针对涉及耳剪的三角测量算法而给出的。我实现了该算法,它似乎在那里工作正常,但问题是耳剪裁算法只使用[pi, pi+2]形式的对角线。

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

    alt text

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

    3不是凸点,6, 5, 3右转而不是左转,因此被拒绝。

    请注意,使用耳剪裁算法时,此多边形会被正确地三角化。

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

    我还发现了这种方法的其他问题,例如绘制外部对角线的多边形。同样,那些使用耳剪裁算法。我们从未被告知这种方法仅适用于特殊形式的对角线,所以我正在寻找澄清。

    注意:我无法决定是否在math.stackexchange.com或此处发布此内容,因为计算几何在编程和数学方面的处理方式有所不同,但我觉得程序员可能会比数学家更熟悉这种算法,因为有人可能实际上已经实现了这一点。

3 个答案:

答案 0 :(得分: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]是一个内部对角线iff pi, pj, pi-1pi, pi+1, pj(或两者)右转。

答案 1 :(得分:0)

几点说明:

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

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

答案 2 :(得分:0)

请注意确保效率有多高,但您可以计算凸包,然后获取凸包中但不在原始多边形中的多边形列表(“排除”多边形)。 (在你的例子中,凸包将有顶点1,2,4,5,7,因此排除的多边形将是(2,3,4),(5,6,7)。)然后你想要的对角线是原始多边形的对角线,不与任何排除的多边形相交。但请注意,排除的多边形可能不是三角形,实际上可能不是凸面,因此线相交测试可能很笨拙。