【问题标题】:Simple 2d polygon triangulation简单的二维多边形三角剖分
【发布时间】:2011-07-12 00:06:17
【问题描述】:

尝试对一组简单的二维多边形进行三角剖分,我想出了这个算法:

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

我已经对其进行了测试,发现它甚至可以在非常大和复杂的简单二维多边形上工作(它不适用于有孔的多边形或自相交的多边形)。

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

这个算法是已知的吗?

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

非常感谢。

【问题讨论】:

标签: algorithm geometry 2d triangulation


【解决方案1】:

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

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

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

通用的耳朵剪裁方法取决于找到您可以剪掉的没有任何包含顶点的耳朵。

【讨论】:

    【解决方案2】:

    如果我的理解正确,那么您就是从最小内角开始切掉三角形。如果多边形不是凸的,这可能会失败。考虑一个多边形,其顶点(按顺序)位于:(0,0) (10,9) (9,9) (9,10)。最小的角度是原点的角度,但你不能安全地切断那个三角形。

    (如果你的多边形 是凸的,那么你可以选择任何顶点,在那里删除一个三角形,然后重复。所以我猜你希望你的算法即使对于非凸多边形也能工作.)

    【讨论】:

      【解决方案3】:

      简单的凸多边形是 O(n)

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

      为了处理更复杂的多边形,比如 Payne 提供的...

      O(n log n) 中的任意多边形到三角形

      虽然有些算法运行得更快,但更快的算法会变得非常复杂。 Kirkpatrick et al. found an algorithm 在 O(n log log n) 中运行,Chazelle 在 O(n) 中运行。然而,最容易实现的可能是运行时间为 O(n log n) 的Seidel algorithm

      算法是一个 3 步过程

      1. 将多边形分解为梯形
      2. 将梯形分解为monotone polygons
      3. 将单调多边形分解为三角形

      C 源代码

      如果您对 C 源代码感兴趣,可以从 University of North Carolina at Chapel Hill 获得。一般来说,代码质量很好,可以处理漏洞,但可能需要根据您的需要进行调整。

      【讨论】:

      • 请注意,Seidel 算法代码的许可证确实禁止商业使用。
      【解决方案4】:

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

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

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

      见:


      请注意,虽然该算法不明确支持孔洞,但您可以在单独的岛之间使用 keyhole 边,然后将其正确三角化。

      【讨论】:

      • keyhole 链接现已失效。从谷歌来看,似乎只是将多边形从外部顶点“切割”到每个孔的内部顶点,使得拓扑是一个单环。
      猜你喜欢
      • 2020-08-15
      • 1970-01-01
      • 1970-01-01
      • 2012-09-28
      • 2015-03-19
      • 2011-01-14
      • 2011-10-05
      • 1970-01-01
      • 2021-05-29
      相关资源
      最近更新 更多