15

试图三角化一组简单的 2d 多边形,我想出了这个算法:

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

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

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

这个算法是已知的吗?

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

非常感谢。

4

4 回答 4

9

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

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

在此处输入图像描述

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

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

于 2011-03-09T15:33:17.217 回答
7

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

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

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

复杂的多边形

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

虽然有些算法运行得更快,但更快的算法变得非常复杂。柯克帕特里克等人。找到了一个在 O(n log log n) 中运行的算法,而Chazelle在 O(n) 中完成了它。然而,最容易实现的可能是运行时间为 O(n log n)的Seidel 算法。

该算法是一个 3 步过程

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

C源

如果您对 C 源代码感兴趣,可以从北卡罗来纳大学教堂山分校获得。一般来说,代码质量很好,可以处理漏洞,但可能需要根据您的需要进行调整。

于 2014-10-02T09:45:26.947 回答
4

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

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

于 2011-03-09T15:36:02.567 回答
4

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

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

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

看:


请注意,虽然该算法不明确支持孔,但您可以在单独的岛之间使用钥匙孔边缘,然后将其正确地进行三角剖分。

于 2016-10-02T02:59:00.117 回答