给定凹多边形(没有自交叉),其节点按顺时针顺序排列,我们如何确定其所有内部对角线(多边形内部的那些)?
我对不使用任何触发功能的解决方案感兴趣。
背景和我尝试的内容:
在我的计算几何类中,我们给出了以下算法来测试[pi, pj]
是否是多边形p0, p1, ... pn-1
中的内对角线:
[pi, pj]
是否与多边形的边缘相交。如果是的话,它不是内部对角线。如果没有,请转到步骤2. pi
是凸点(pi-1, pi, pi+1
右转),那么[pi, pj]
是内对角线iff pi, pj, pi+1
和pi, pi-1, pj
左转转。 pi
不是凸点(pi-1, pi, pi+1
左转),那么[pi, pj]
是内对角线iff pj, pj-1, pi
向左转。该算法是针对涉及耳剪的三角测量算法而给出的。我实现了该算法,它似乎在那里工作正常,但问题是耳剪裁算法只使用[pi, pi+2]
形式的对角线。
但是,请考虑选择所有非交叉对角线的强力三角测量算法。使用我描述的用于检查内部对角线的子程序(连同分段交叉方法),我得到以下结果:
很容易检查我发布的算法是否拒绝内部对角[3, 6]
,实际上它不应该:
3不是凸点,6, 5, 3
右转而不是左转,因此被拒绝。
请注意,使用耳剪裁算法时,此多边形会被正确地三角化。
我对如何调整此算法以检测多边形中的所有对角线感兴趣。我没有运气让它上班。
我还发现了这种方法的其他问题,例如绘制外部对角线的多边形。同样,那些使用耳剪裁算法。我们从未被告知这种方法仅适用于特殊形式的对角线,所以我正在寻找澄清。
注意:我无法决定是否在math.stackexchange.com或此处发布此内容,因为计算几何在编程和数学方面的处理方式有所不同,但我觉得程序员可能会比数学家更熟悉这种算法,因为有人可能实际上已经实现了这一点。
答案 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-1
或pi, 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)。)然后你想要的对角线是原始多边形的对角线,不与任何排除的多边形相交。但请注意,排除的多边形可能不是三角形,实际上可能不是凸面,因此线相交测试可能很笨拙。