我一直在研究Delaunay triangulation(不是作业)我想到了以下问题:在平面上给出一组点S
(基数为n
)和一组三角形T
(应该具有n-2
的基数) - 如何确定三角形集T
是否形成Delaunay三角剖分DT(S)
?
第一个问题是Delaunay三角剖分并不是唯一的,因此重新设置再次设置的点并与三角形集进行比较将无法给出答案。此外,最优的Delaunay三角剖分算法很难实现(但是,使用像CGAL这样的库本来是可以的)。
假设我们知道如何检查三角形集是否是三角测量(不一定是Delaunay)。然后我们应该使用Delanuay三角剖分的定义:对于三角剖分中的每个三角形t
,S
中的任何一点都不在t
的圆周内。这导致我们采用以下方法:
T
,计算周长并迭代S
,检查点是否在圆周内。但是,这需要O(n^2)
时间,这不是最佳的。T
并计算周长。如果圆周内有任何点s
,则表示它到圆周中心的距离小于半径。使用S
上的最近邻搜索结构,我们将加快算法速度。例如,简单kd-tree结构导致我们平均O(n log n)
算法,最坏情况下O(n sqrt(n))
。 现在让我们回到检查T
是否完全是三角测量的问题。像S
的等式和三角形顶点集的平凡预先要求可以不比O(n log n)
快。剩下的 - 检查T
中的每两个三角形是否在一个共同面上相交,或者根本不相交。
T
并再次通过T
来检查交叉点,但这是O(n^2)
算法。t1
和t2
相交»是什么意思?如果它们的边相交或者一个三角形完全位于另一个三角形中,则它们相交使用Bentley-Ottmann algorithm O(n log n)
可以在O((n + k) log n)
时解决所有边相交的问题(最差情况为k
,其中O(n log n)
是交叉点的数量,但我们可以停止我们找到第一个交叉点的算法)。我们也没有认识到一个完全包含另一个三角形的三角形的情况,但我相信我们可以修改Bentley-Ottmann算法以保持三角形穿过扫描线而不是段,正如我所说的那样,产生了t
算法。但是,实施起来确实很复杂。t
:首先检查t
的任何顶点是否已经存在于其中一个三角形中 - 然后我们得到了一个交点。否则,将O(log n)
添加到结构中。但是,如果我们想要O(sqrt(n))
或{{1}}时间进行搜索并添加查询,我们必须平衡此结构的高度,即使对于kd-tree也是如此。那么,有没有人知道这个问题的任何简单解决方案?
答案 0 :(得分:0)
有一个Delaunay引理:“如果S的三角剖分K中的每个边缘都是局部Delaunay,那么K就是S的Delaunay三角剖分”。也许这可以帮助你的问题第1段的情况,你可以肯定K是S. Dunno的一些三角测量,但这种方法的计算复杂性。