Algorithm delaunay三角剖分Bowyer-Watson算法的实现

Algorithm delaunay三角剖分Bowyer-Watson算法的实现,algorithm,geometry,time-complexity,computational-geometry,Algorithm,Geometry,Time Complexity,Computational Geometry,我正在尝试实现以下Bowyer-Watson算法来实现Delaunay三角剖分 function BowyerWatson (pointList) // pointList is a set of coordinates defining the points to be triangulated triangulation := empty triangle mesh data structure add super-triangle to triangulation // mus

我正在尝试实现以下Bowyer-Watson算法来实现Delaunay三角剖分

function BowyerWatson (pointList)
  // pointList is a set of coordinates defining the points to be triangulated
  triangulation := empty triangle mesh data structure
  add super-triangle to triangulation // must be large enough to completely contain all the points in pointList
  for each point in pointList do // add all the points one at a time to the triangulation
     badTriangles := empty set
     for each triangle in triangulation do // first find all the triangles that are no longer valid due to the insertion
        if point is inside circumcircle of triangle
           add triangle to badTriangles
     polygon := empty set
     for each triangle in badTriangles do // find the boundary of the polygonal hole
        for each edge in triangle do
           if edge is not shared by any other triangles in badTriangles
              add edge to polygon
     for each triangle in badTriangles do // remove them from the data structure
        remove triangle from triangulation
     for each edge in polygon do // re-triangulate the polygonal hole
        newTri := form a triangle from edge to point
        add newTri to triangulation
  for each triangle in triangulation // done inserting points, now clean up
     if triangle contains a vertex from original super-triangle
        remove triangle from triangulation
  return triangulation

该算法采用O(N logn)运算对N个点进行三角化。但是有没有办法从上面的算法中计算出来呢?我的意思是,上述算法的哪一部分需要logn次,这会导致N个点的(N logn)?如维基百科中所述,存在特殊的退化情况,即达到O(N2)。这种退化情况的含义是什么?

这里描述的算法是一种简单的增量delaunay三角剖分。复杂性显然是O(N^2)。“对于点列表中的每个点,一次将所有点添加到三角剖分中”此主循环为O(N)和“对于三角剖分中的每个三角形,请首先查找由于插入而不再有效的所有三角形”此内部循环为O(N)

这个算法在所有情况下都是O(N^2)。
然而,也有其他算法给出O(N*Log(N))或更高的复杂度。请参见此处的“分而治之”:此处描述的算法是一种简单的增量delaunay三角剖分。复杂性显然是O(N^2)。“对于点列表中的每个点,一次将所有点添加到三角剖分中”此主循环为O(N)和“对于三角剖分中的每个三角形,请首先查找由于插入而不再有效的所有三角形”此内部循环为O(N)

这个算法在所有情况下都是O(N^2)。
然而,也有其他算法给出O(N*Log(N))或更高的复杂度。请参见此处的“分而治之”:算法中有两个主要步骤:

  • 对于三角剖分中的每个三角形,如果点位于外圆内
  • 对于badTriangles中的每个三角形,删除并添加新的tringles
  • 第一步是糟糕的方法。有更好的方法来定位要添加的新点所在的三角形。搜索从旧三角形到新点的“行走”。
    第二步可能涉及退化情况下的所有三角形,其中所有点位于公共大圆中。

    算法中有两个主要步骤:

  • 对于三角剖分中的每个三角形,如果点位于外圆内
  • 对于badTriangles中的每个三角形,删除并添加新的tringles
  • 第一步是糟糕的方法。有更好的方法来定位要添加的新点所在的三角形。搜索从旧三角形到新点的“行走”。
    第二步可能涉及退化情况下的所有三角形,其中所有点位于一个公共的大圆中。

    回答可能有点晚,但可能对其他人有用

    Delaunay三角剖分具有外接圆特性,因此Delaunay三角剖分的任何点都不能位于任何三角形的外接圆内。Bowyer-Watson算法添加一个不验证此属性的点。可以看出,所有外接圆包含新点的三角形都是连续的。

    要获得理论NlogN,必须使用连续事实。(我使用连接表)

    =>您需要在三角剖分中搜索不考虑圆周特性的第一个三角形(复杂性日志(N))

    =>一旦有了它,删除连续三角形(使用连接表)(独立于节点总数)

    =>构建新三角形(并更新表格)(与节点总数无关)

    对于每个节点,您需要执行N次。这导致理论上的Nlog(N)复杂性

    维基百科上给出的算法看起来像一个N大小的循环。因此,它会自动为您提供N^2的复杂性

    如Ripi2所述,如果删除了所有元素且没有可用的连接,这种复杂性应该是最坏的情况。在这种情况下,您将别无选择,只能搜索所有三角形。有关更多信息,请参阅

    ===========================================================================

    您需要在点p所在的位置找到一个初始三角形(因此它是一个要重新绘制的三角形):

    选择三角剖分的一个三角形T(如果可能的话,靠近你的点。详见下文)。 计算G,T的重心。我们表示t1、t2、t3三角形T的边。L1、L2和L3是通过边t1、t2和t3(邻接)连接到T的三角形

    如果[GP]穿过t1、t2或t3,则分别定义T=L1、L2、L3 =>使用新的T循环 如果没有: =>您已找到包含P的三角形

    也可以为T选择“良好的初始猜测”,使用初始粗规则细分,并存储三角形的节点。这类似于下面Jwezorek的想法1,但成本可能更低:

    因为在所有点周围都有一个很好的“框”,所以可以创建第N次多维框。我们假设您的Delaunay三角剖分的所有节点都在该细分框中。搜索新点P附近的T时,请在细分框中插入P,然后在其周围进行局部搜索。使用您找到的第一个节点之一,使用您的connectivy表获得第一个好三角形T

    对于那些想要更多信息、有时间阅读的人,我推荐这本书: “Delaunay三角剖分和网格划分,Paul Louis George,Houman Borouchaki。”
    由于Jwezorek问题而编辑的答案

    回答可能有点晚,但可能对其他人有用

    Delaunay三角剖分具有外接圆特性,因此Delaunay三角剖分的任何点都不能位于任何三角形的外接圆内。Bowyer-Watson算法添加一个不验证此属性的点。可以看出,所有外接圆包含新点的三角形都是连续的。

    要获得理论NlogN,必须使用contiguo