检查点集三角形细分是否为三角剖分

时间:2012-04-14 22:15:38

标签: computational-geometry triangulation kdtree

我一直在研究Delaunay triangulation(不是作业)我想到了以下问题:在平面上给出一组点S(基数为n)和一组三角形T(应该具有n-2的基数) - 如何确定三角形集T是否形成Delaunay三角剖分DT(S)

第一个问题是Delaunay三角剖分并不是唯一的,因此重新设置再次设置的点并与三角形集进行比较将无法给出答案。此外,最优的Delaunay三角剖分算法很难实现(但是,使用像CGAL这样的库本来是可以的)。

假设我们知道如何检查三角形集是否是三角测量(不一定是Delaunay)。然后我们应该使用Delanuay三角剖分的定义:对于三角剖分中的每个三角形tS中的任何一点都不在t的圆周内。这导致我们采用以下方法:

  1. 琐碎的方法。只需迭代T,计算周长并迭代S,检查点是否在圆周内。但是,这需要O(n^2)时间,这不是最佳的。
  2. 迷人的方法。再次,迭代T并计算周长。如果圆周内有任何点s,则表示它到圆周中心的距离小于半径。使用S上的最近邻搜索结构,我们将加快算法速度。例如,简单kd-tree结构导致我们平均O(n log n)算法,最坏情况下O(n sqrt(n))
  3. 有没有人知道更简单的事情?
  4. 现在让我们回到检查T是否完全是三角测量的问题。像S的等式和三角形顶点集的平凡预先要求可以不比O(n log n)快。剩下的 - 检查T中的每两个三角形是否在一个共同面上相交,或者根本不相交。

    1. 同样,我们可以通过迭代T并再次通过T来检查交叉点,但这是O(n^2)算法。
    2. 让我们想一想«三角形t1t2相交»是什么意思?如果它们的边相交或者一个三角形完全位于另一个三角形中,则它们相交使用Bentley-Ottmann algorithm O(n log n)可以在O((n + k) log n)时解决所有边相交的问题(最差情况为k,其中O(n log n)是交叉点的数量,但我们可以停止我们找到第一个交叉点的算法)。我们也没有认识到一个完全包含另一个三角形的三角形的情况,但我相信我们可以修改Bentley-Ottmann算法以保持三角形穿过扫描线而不是段,正如我所说的那样,产生了t算法。但是,实施起来确实很复杂。
    3. 我考虑过迭代算法 - 让我们保持非交叉(或只交叉边缘)三角形的结构(它应该是非常类似于kd-tree的东西)。然后我们尝试添加下一个三角形t:首先检查t的任何顶点是否已经存在于其中一个三角形中 - 然后我们得到了一个交点。否则,将O(log n)添加到结构中。但是,如果我们想要O(sqrt(n))或{{1}}时间进行搜索并添加查询,我们必须平衡此结构的高度,即使对于kd-tree也是如此。
    4. 那么,有没有人知道这个问题的任何简单解决方案?

1 个答案:

答案 0 :(得分:0)

有一个Delaunay引理:“如果S的三角剖分K中的每个边缘都是局部Delaunay,那么K就是S的Delaunay三角剖分”。也许这可以帮助你的问题第1段的情况,你可以肯定K是S. Dunno的一些三角测量,但这种方法的计算复杂性。