修改 Delaunay 三角剖分的有效方法

Efficient methods of modifying a Delaunay triangulation

MATLAB 在 their website 上声明:

It is more efficient to edit a delaunayTriangulation to make minor modifications as opposed to recreating a new delaunayTriangulation from scratch

这有什么算法吗?

如果我有 1000 个点并将其中 3 个移动到新位置,最好的方法是将它们移除并重新插入,还是有更好的方法?

是的。你可以。例如,您可以在 this article(动态 Voronoi 图)中找到一种算法,以针对每次删除或插入更新 O(n) 中给定的 Delaunay 三角剖分 (DT)。由于构造一个DT的时间复杂度在O(n log(n)),绝对更新当前DT在数量级上要快很多。

有一整套算法可以通过一次插入一个点来构建 Delaunay 三角剖分。 Devillers, O. (2002) 描述了一个非常好的去除点的算法。 “关于 Delaunay 三角剖分中的删除”,国际计算几何杂志 * 应用 12.3。您应该能够在网上找到 Devillers 文章的几个不同版本。

由于您在 MATLAB 中工作,这对您没有太大帮助,但我已经在 Java 中实现了 Devillers 算法,并且效果很好。如果您有一个支持修改现有三角剖分的 API,那么删除 3 个点然后将它们插入网格中的其他位置应该会发生得如此之快,以至于很难测量操作所需的时间。当然,1000个顶点是一个很小的三角剖分,简单重建网格所需的时间应该也很小。因此,除非您执行了那么多次,否则每次需要更改其内容时只需重新构建网格应该是合理的。

如果您想查看增量 Delaunay 三角形实现的基于 Java 的实现,您可以在 https://github.com/gwlucastrig/Tinfour. I've written up some notes on the implementation details and posted them at http://gwlucastrig.github.io/Tinfour/doc/TinfourAlgorithmsAndDataElements.pdf

找到一个