用于确定共同球体的数字稳健谓词

时间:2014-05-13 06:47:27

标签: package computational-geometry cgal delaunay

我想知道是否有任何库/包提供数字健壮的谓词来测试n点(在我的情况下n = 5)是否位于一个共同的球体上?

我想在Delaunay四面体化的背景下进行这个测试。我见过 CGAL 中的软件包,但找不到任何明确的函数来解决这个问题。

我能想到的一种方法是使用CGAL CGAL::Sphere_d类使用4个点来初始化球体,对于所有剩余的点,我将使用has_on_boundary()函数来测试所有点是否位于公共球体上,但我不确定它是否可以正常工作,我的意思是通过这种方式进行常见的球体测试可证明正确。

3 个答案:

答案 0 :(得分:3)

您可以将CGAL::side_of_bounded_sphere()CGAL::side_of_oriented_sphere()与具有CGAL::Exact_predicates_inexact_constructions_kernel等确切谓词的内核一起使用。

你可以像这样使用它:

#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
typedef K::Point_3 Point_3;

int main()
{
   Point_3 p1(XX,XX,XX), p2(XX,XX,XX), p3(XX,XX,XX), p4(XX,XX,XX), p5(XX,XX,XX);
   if (CGAL::side_of_bounded_sphere(p1,p2,p3,p4,p5) == CGAL::ON_BOUNDARY)
     //the points are co-spherical
}

答案 1 :(得分:2)

There are robust 2D and 3D primitives在J. Schewchuk的Triangle三角测量包中进行“内置检查”

答案 2 :(得分:2)

如何使用合适的缩放比例将所有点转换为整数坐标。

InSphere测试是坐标的第五度的表达式。粗略地说,使用64位算术可以测试直径达到6,000左右的球体。扩展精度为128位,最多可覆盖44,000,000(仅需+, - ,*)。

好处是可以避免因谓词不连贯而导致算法失败的风险。