如何将多边形转换为非重叠三角形上的集合?

时间:2013-07-22 14:08:14

标签: algorithm graphics topology tesselation

我有一组2D点,形成一个闭合的多边形。我需要生成一组完全分布多边形的2D三角形。

除了三角形应完全填充多边形区域外,没有约束。如果它是我可以实现的标准算法,那将更有帮助。

3 个答案:

答案 0 :(得分:4)

对一般多边形进行三角测量的最佳方法是计算约束Delaunay triangulation - 这是多边形顶点的标准Delaunay三角剖分,并施加额外的约束以确保多边形边缘明确地出现在三角剖分中。这种方法可以处理任何类型的多边形 - 凸面,凹面,带孔的多边形等。

Delaunay三角剖分是最大化网格中最小角度的三角剖分,这意味着这种三角剖分在元素形状质量方面是最佳的。

编码受约束的Delaunay三角剖分算法是一项棘手的任务,但存在许多好的库,特别是CGALTriangle。这两个库都实现了(最佳)高效O(n*log(n))算法。

答案 1 :(得分:2)

如上所述,Delaunay三角剖分是一项相当复杂的算法。如果您接受O(n ^ 2)运行时间,您可以尝试使用更容易理解和编码的Ear Clipping算法。基本思路如下。具有> = 4个顶点且没有孔的每个多边形(即,其边界是没有自交叉和自切线的单个折线)具有至少一个“耳朵”。耳朵是三个连续的顶点,使得构建在它们上面的三角形位于多边形内部,并且内部不包含多边形的其他点。如果您“剪耳朵”(在答案中添加三角形并替换删除这三个点的中间点),则将任务缩减为具有较少顶点的多边形,依此类推。耳朵可以在O(n ^ 2)中找到(通过定义),导致O(n ^ 3)三角测量算法。有O(n)耳朵发现算法,虽然它不是很复杂,但在几个短语中描述的时间相当长。

此外,如果您需要更快的算法,您应该查看单调多边形三角剖分并将多边形分割为单调多边形。甚至存在线性时间三角剖分算法,但它与Delaunay三角剖分一样复杂。

您可以考虑Wikipedia article并查看现有方法的一个小概述。

答案 2 :(得分:1)

如果您不要求三角形的顶点是多边形的顶点,请尝试基于梯形分解的三角剖分,如Fast Polygon Triangulation based on Seidel's Algorithm中所示。