【发布时间】:2010-12-07 18:56:02
【问题描述】:
给定一个凹多边形(没有自相交),它的节点按顺时针顺序排列,我们如何确定它的所有内部对角线(多边形内部的对角线)?
我对不使用任何三角函数的解决方案感兴趣。
背景和我的尝试:
在我的计算几何课中,我们得到了以下算法来测试[pi, pj] 是否是多边形p0, p1, ... pn-1 中的内对角线:
- 测试
[pi, pj]是否与多边形的不相邻的边相交。如果是,则它不是内对角线。如果没有,请转到第 2 步。 - 如果
pi是一个凸点(pi-1, pi, pi+1右转),那么[pi, pj]是一个内对角线当且仅当pi, pj, pi+1和pi, pi-1, pj左转。 - 如果
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