我想知道是否有任何库/包提供数字健壮的谓词来测试n点(在我的情况下n = 5)是否位于一个共同的球体上?
我想在Delaunay四面体化的背景下进行这个测试。我见过 CGAL 中的软件包,但找不到任何明确的函数来解决这个问题。
我能想到的一种方法是使用CGAL CGAL::Sphere_d
类使用4个点来初始化球体,对于所有剩余的点,我将使用has_on_boundary()
函数来测试所有点是否位于公共球体上,但我不确定它是否可以正常工作,我的意思是通过这种方式进行常见的球体测试可证明正确。
答案 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(仅需+, - ,*)。
好处是可以避免因谓词不连贯而导致算法失败的风险。