简单的2d多边形三角剖分

时间:2011-03-09 15:26:39

标签: algorithm geometry 2d triangulation

尝试对一组简单的2d多边形进行三角测量,我想出了这个算法:

  • 1)对于多边形中的每个顶点,计算两个链接边之间的角度
  • 2)通过相对于多边形内部的角度减小来对顶点进行排序
  • 3)如果集合中的顶点少于3个,我们就完成了
  • 4)取出集合中的最后一个顶点并输出由它和它的两个邻居
  • 形成的三角形
  • 5)从集合中删除顶点
  • 6)更新两个邻居的角度
  • 7)跳到2

我已经对它进行了测试,并发现即使在非常大而复杂的简单的2d多边形上也能工作(它不适用于带有孔或自相交多边形的多边形)。

是否存在会产生退化结果的极端情况?

这个算法是否已知?

如果没有,我想确定这个算法是坚如磐石的,但我没有数学背景来证明它。

非常感谢。

5 个答案:

答案 0 :(得分:8)

您正在进行三角测量的“耳剪裁”方法,请参阅:http://en.wikipedia.org/wiki/Polygon_triangulation

如果另一个多边形顶点(例如从多边形的另一侧)最终在您形成的三角形“耳朵”内,则算法会失败。考虑这个例子:

enter image description here

您的算法将首先选择A,并使用两条相邻边(与虚线连接)形成三角形。但是这个三角形包括另一个顶点(B),显然是不正确的。

广义的耳朵剪切方法取决于找到没有任何包含顶点的剪切耳朵。

答案 1 :(得分:4)

简单凸多边形是O(n)

这是您想要处理矩形,五边形,六边形等简单多边形的时候。在这里,您只需要一个起点并将其连接到所有其他顶点。这个算法很简单,我真正想要的是一个更通用的解决方案,可以处理带孔的凹面和多边形。

为了处理像Payne提供的更复杂的多边形......

complex polygons

O(n log n)

中的任意多边形到三角形

虽然算法运行速度更快,但更快的算法变得非常复杂。 {(3}}在O(n log log n)中运行,Kirkpatrick et al. found an algorithm在O(n)中运行。但是,最容易实现的可能是在{(n log n)中运行的Chazelle

该算法分为3个步骤

  1. 将多边形分解为梯形
  2. 将梯形分解为Seidel algorithm
  3. 将单调多边形分解为三角形
  4. C源

    如果您对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)

虽然耳朵剪辑效果相当好,但由于多边形的复杂性增加,简化方法会减慢,因为在折叠每个耳朵时检查整个多边形变得越来越慢。

来自libgdx的耳剪算法是一个很好的起点,因为它非常强大 - 使用FIST (多边形的快速工业强度三角剖分)

我将此作为多边形细分的基础,然后为三角形测试添加了空间优化(O(n log n)而不是O(n^2))。

见:

注意,虽然算法没有明确支持漏洞,但您可以在不同的孤岛之间使用 keyhole 边缘,然后将其正确地进行三角剖分。