gpt4 book ai didi

c++ - 检查共面 3D 点时出现浮点错误

转载 作者:搜寻专家 更新时间:2023-10-31 01:05:51 25 4
gpt4 key购买 nike

我正在寻找一种算法来检查一个点是否与由三个顶点定义的给定 3D 平面共面,同时最大限度地减少浮点错误。

我想尽量减少乘法和除法的数量以减少浮点错误。

我的实现使用float,我不能double

我不能使用外部库。


我当前的方法存在以下错误:

我有使用平面方程的一般形式定义平面的代码:

ax + by + cz + d = 0

我使用三个 3D 顶点 v0v1v2 计算这些系数,如下所示:

// Pseudo-code to define a plane (with class Vector3 defining a vector in 3D)
Vector3 A = v1 - v0;
Vector3 B = v2 - v0;
Vector3 N = cross_product(A,B); // Normal vector
N.Normalize(); // Unit normal vector storing coefs. a, b, c
float d = dot_product(N,v0);

要检查另一个顶点 p 是否共面,我将该点代入平面方程并检查结果是否为 0:

// Pseudo-code for coplanar test:
bool is_coplanar()
{
float res = N.x()*p.x() + N.y()*p.y() + N.z()*p.z() - d;
return true if res is "almost" null; // "almost" is: abs(res)<EPSILON
}

在这种情况下我的代码失败了:

v0 = [-8.50001907, 0, 323]
v1 = [8.49998093, 0, 323]
v2 = [-8.50001907, 1.49999976, 322.598083]

则平面系数为:

N = [-0, 0.258814692, 0.965926945]
d = 311.994415

当我插入点 v2 时,我发现结果离 0“很远”(尽管 v2 用于定义平面):

res = -3.05175781e-05

我的 EPSILON 目前是 1e-5

在编译器 qcc 4.4.2(QNX Momentics,类似于 gcc)上测试。没有优化 -O0

最佳答案

此类几何谓词在很多方面都受到浮点错误的影响。唯一的工业强度解决方案是使用 adaptable arithmetic filtering (前提是 coplanar 测试的稳健实现不覆盖您)。

幸好这样implementations (这将需要相当长的时间来编写)已经可用。在前面的链接中,orient3d 谓词可以满足您的需求:给定 3 个平面形成点,确定第 4 个是位于平面上方、下方还是平面上

如果这样的实现有点矫枉过正,请检查简单的实现。它总共提供了 4 个:

orient3dfast() Approximate 3D orientation test. Nonrobust.
orient3dexact() Exact 3D orientation test. Robust.
orient3dslow() Another exact 3D orientation test. Robust.
orient3d() Adaptive exact 3D orientation test. Robust.

免责声明:代码 list 是作为获得稳健解决方案所需的数学概念和编程技术的教程提供的。我既不暗示也不暗示复制粘贴任何内容。

关于c++ - 检查共面 3D 点时出现浮点错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21916606/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com