检查点是不是位于球的边界/检查 Delaunay 三角剖分的唯一性

Posted

技术标签:

【中文标题】检查点是不是位于球的边界/检查 Delaunay 三角剖分的唯一性【英文标题】:Check if points lie on boundary of ball / check uniqueness of a Delaunay triangulation检查点是否位于球的边界/检查 Delaunay 三角剖分的唯一性 【发布时间】:2022-01-17 02:03:10 【问题描述】:

Wikipedia article 关于 d 维中的 Delaunay 三角剖分状态是三角剖分唯一性的先决条件:

如果 P 是一般位置的一组点,则已知 P 存在唯一的 Delaunay 三角剖分;也就是说,P 的仿射壳是 d 维的,并且 P 中没有任何 d + 2 个点的集合位于内部不与 P 相交的球的边界上。

现在我已经编写了自己的 Delaunay 库,我希望能够根据点来验证三角剖分的唯一性。通过计算集合的秩可以很容易地检查仿射壳的维数。然而,第二部分要困难得多。

如何检查 d+2 个点是否位于不与集合相交的球的边界上,并且每个点上都没有一些巨大的循环?或者是否有另一种检查唯一性的方法?

我将 Python 与 Numpy 一起使用,但这更多是一个理论问题,因此语言无关紧要。 谢谢!

【问题讨论】:

【参考方案1】:

已经是 Delaunay 三角剖分,即外接球内没有点。现在,例如,对于 2D 情况,只需检查是否可以翻转任何边缘,使其仍然是 Delaunay 三角剖分。如果没有,你有一个独特的解决方案。请注意双精度算术的舍入误差。

【讨论】:

【参考方案2】:

对于三角剖分的最大维度的每个 单纯形,使用 d+1 点,您有 d+1 相邻单纯形。两个相邻单纯形共享d 点(自己形成单纯形)。由于我不知道您是否熟悉维度 d 中的工作,让我们来看看维度 2 和 3...

在维度 2 中,最大维度的单纯形是 三角形(维度 2 的单纯形),两个相邻三角形共享一条 (维度 1 的单纯形)。 在维度 3 中,最大维度的单纯形是 四面体(维度 3 的单纯形),两个相邻的四面体共享一个三角形的面(维度 2 的单纯形)。李>

无论如何,给定维度 d 中的 Delaunay 三角剖分,如果您想检查是否有唯一的三角剖分,请迭代维度 d-1(3D 中的三角形或 2D 中的边)的单纯形,并获取两个事件单纯形(3D 中的两个相邻四面体,或 2D 中的相邻三角形)。这会给你d+2 点。由于三角剖分是 Delaunay,您知道那些 d+2 点的 in_sphere 谓词的结果为正或空。如果在对维度 d 的单纯形进行迭代期间,d+2 点的所有 in_sphere 谓词的结果都是严格正数,那么您的三角剖分是唯一的,否则它是退化的且非唯一的。

看看 Olivier Devlers 和 Sylvain Pion 的论文 Efficient Exact Geometric Predicates for Delaunay Triangulations:引言给出了 Delaunay 三角剖分理论的基础知识,以及 in_sphere 谓词。它还提供了以精确但有效的方式实现orientationin_sphere 谓词的线索。这可能有助于您实施 Delaunay 三角测量。

【讨论】:

感谢您的建议和有趣的论文。最初我希望有一些方法可以在没有三角测量的情况下确定唯一性,但似乎我会实施这个解决方案。谢谢!

以上是关于检查点是不是位于球的边界/检查 Delaunay 三角剖分的唯一性的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server:检查两个地理/几何的边界是不是相互交汇

检查地理位置是不是在边界内

从 Delaunay 三角剖分计算 alpha 形状的边界多边形

在 C++11 及更高版本中,std::string::operator[] 是不是进行边界检查?

检查点是不是位于凸包内

检查点是不是位于(或靠近)凸多边形边缘