尝试对一组简单的2d多边形进行三角测量,我想出了这个算法:
我已经对它进行了测试,并发现即使在非常大而复杂的简单的2d多边形上也能工作(它不适用于带有孔或自相交多边形的多边形)。
是否存在会产生退化结果的极端情况?
这个算法是否已知?
如果没有,我想确定这个算法是坚如磐石的,但我没有数学背景来证明它。
非常感谢。
答案 0 :(得分:8)
您正在进行三角测量的“耳剪裁”方法,请参阅:http://en.wikipedia.org/wiki/Polygon_triangulation
如果另一个多边形顶点(例如从多边形的另一侧)最终在您形成的三角形“耳朵”内,则算法会失败。考虑这个例子:
您的算法将首先选择A,并使用两条相邻边(与虚线连接)形成三角形。但是这个三角形包括另一个顶点(B),显然是不正确的。
广义的耳朵剪切方法取决于找到没有任何包含顶点的剪切耳朵。
答案 1 :(得分:4)
这是您想要处理矩形,五边形,六边形等简单多边形的时候。在这里,您只需要一个起点并将其连接到所有其他顶点。这个算法很简单,我真正想要的是一个更通用的解决方案,可以处理带孔的凹面和多边形。
为了处理像Payne提供的更复杂的多边形......
虽然算法运行速度更快,但更快的算法变得非常复杂。 {(3}}在O(n log log n)中运行,Kirkpatrick et al. found an algorithm在O(n)中运行。但是,最容易实现的可能是在{(n log n)中运行的Chazelle。
该算法分为3个步骤
如果您对C源感兴趣,可以从monotone polygons获取。一般来说,代码质量很好,处理漏洞,但可能需要按摩您的需求。
答案 2 :(得分:2)
如果我正确地理解你,你就会从最小的内角开始切掉三角形。如果多边形不是凸面,则可能会失败。在(0,0)(10,9)(9,9)(9,10)处考虑具有顶点(按顺序)的多边形。最小的角度是原点的角度,但你不能安全地切掉那个三角形。
(如果您的多边形是凸面,那么您可以选择任何顶点,在那里删除一个三角形,然后重复。所以我猜你希望你的算法即使对于非凸多边形也能工作。)
答案 3 :(得分:1)
我之前必须解决类似的问题,结果代码可能对您或其他人有用:
演示:http://cecchi.me/portfolio/triangulation
资料来源:http://cecchi.me/js/point-picking.js.src
源码有点笨拙以允许更容易的动画,但你应该能够看到我如何解决Payne用凸多边形指出的问题(相关代码从第200行开始)。请注意,我的解决方案仍然不允许复杂的多边形。
答案 4 :(得分:1)