【问题标题】:How to convert a polygon to a set on non-overlapping triangles?如何将多边形转换为非重叠三角形上的集合?
【发布时间】:2013-07-21 07:32:55
【问题描述】:

我有一个二维点的坐标集,它们形成一个封闭的多边形。我需要生成一组完全分布多边形的二维三角形。

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

【问题讨论】:

    标签: algorithm graphics topology tesselation


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      如上所述,Delaunay 三角剖分是一个相当复杂的算法来完成这项任务。如果您接受 O(n^2) 运行时间,您可以尝试更容易理解和编码的 Ear Clipping 算法。基本思路如下。每个具有 >= 4 个顶点且没有孔的多边形(即其边界是一条没有自相交和自相切的单折线)至少有一个“耳朵”。耳朵是三个连续的顶点,因此建立在它们上的三角形位于多边形内部,并且不包含多边形内部的其他点。如果你“剪了一个耳朵”(在答案中添加一个三角形并替换删除这三个点的中间点),你将任务减少到一个顶点更少的多边形,依此类推。耳朵可能在 O(n^2) 中很容易(根据定义)找到,从而导致 O(n^3) 三角测量算法。有O(n)的寻耳算法,虽然不是很复杂,但是几句话就比较长了。

      此外,如果您需要更快的算法,您应该了解单调多边形三角剖分和将多边形拆分为单调多边形。甚至还有一种线性时间三角剖分算法,但它和 Delaunay 三角剖分一样复杂。

      您可以考虑Wikipedia article 并查看那里现有方法的简要概述。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-11-11
          • 2020-01-25
          • 1970-01-01
          • 2011-03-29
          • 1970-01-01
          • 2011-04-01
          • 2012-06-11
          相关资源
          最近更新 更多