- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在寻找一种算法来检查一个点是否与由三个顶点定义的给定 3D 平面共面,同时最大限度地减少浮点错误。
我想尽量减少乘法和除法的数量以减少浮点错误。
我的实现使用float
,我不能double
。
我不能使用外部库。
我当前的方法存在以下错误:
我有使用平面方程的一般形式定义平面的代码:
ax + by + cz + d = 0
我使用三个 3D 顶点 v0
、v1
和 v2
计算这些系数,如下所示:
// 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/
我创建了一个 View (称为 masterView),CGRect 的 x=160、y=186、width=1600、height=380。该 View 包含 5 个 subview ,每个 sub
我是 R 的新手,目前正在处理边缘列表形式的协作数据,该列表具有 32 列和大约 200.000 行。我想根据国家之间的相互作用创建一个(共)现矩阵。但是,我想通过对象的总数来计算交互次数。 期望结果
考虑以下发展: Require Import Relation RelationClasses. Set Implicit Arguments. CoInductive stream (A : Typ
我正在玩弄这种语言来开始学习,我对递归定义的工作原理感到困惑。 例如,让我们采用三角形数的序列(TN n = sum [1..n]) 提供的解决方案是: triangularNumbers = sca
我正在尝试获取“总分钟数”值中的 PHP“DateInterval”值。如何获得?似乎简单格式(“%i 分钟”)不起作用? 示例代码如下: $test = new \DateTime("48 hour
我有这个脚本可以通过电子邮件自动发送负载信息: if(confirm('', 'Are you sure?') == true) { // enviar mails var emails = new
我有一些数据要查询。该表由两列组成 - 一个唯一 ID 和一个值。我想计算每个唯一值出现的次数(这可以通过 COUNT 和 GROUP BY 轻松完成),但我希望能够对其进行计数。所以,我想看看有多少
当我在我的 Java 代码上运行 PMD 时,它显示的错误消息之一是“类 STWeb 具有 20 的圈复杂度”。通常我的java类是这样的 public class STWeb implements
尝试在打印时在页面底部显示第 1 页,共 10 页... 第 1 页,共 0 页 正在显示,因此计数器(页面)似乎无法正常工作。我正在使用 Chrome,所以 @pages { ... 也不起作用。有
我在尝试运行单元测试用例时收到 Executed 0 of 0 ERROR 错误。我遵循了针对此问题提到的几个解决方案,但我仍然遇到相同的错误。 尝试过: 删除 angular-scenario 文件
我们有一个应用程序,可以在运行时生成大约 100 个动画,并将它们全部添加到单个 Storyboard 中然后播放。问题是动画速度非常慢。进行动画处理的对象是形状和样条线,并且在后端完成大量计算以生成
我正在为数学演示编写凯撒加密代码。今天,我一直在为我的演讲编写代码。早上这个代码就开始工作了。但现在在学校,我遇到了一个异常(exception),我认为 for 超出了我的符号表的长度。 异常(ex
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 6 年前。 Improve th
我有一张带有 4 个标签的表格,效果很好。当我使用也能正常工作的搜索栏时,表格只显示两个标签: - (void)viewDidLoad { [super viewDidLoad]; NSS
我正在使用 iText 在我的 Java EE 应用程序中生成 PDF 文档。 PDF 文件的编码驻留在 JSP 中。 我想在每个页脚中实现以下页面格式, REF:XXXXXXX 第 X 页,共第 Y
我试图找出(出于好奇)哪个线程实际调用了单例构造函数。好吧,我完全理解每次执行测试程序时线程都会不同,只是想在实用上检查是否相同。我试过 dumpStack() printStackTrace() g
我在工作时遇到了一些麻烦。这可能真的很简单,但我让它变得比可能的更困难。所以我有一个包含 3 组 UL 的 div。 代码如下: content here content here c
我有一个问题,当网格为空时,为什么它显示 Page 1 of 0 不能是 Page 1 of 1 或更合理的东西吗? 我的代码 var xml=client.responseText;
我想将 Crashlytics 添加到我的项目中,我根据 Fabric Mac 应用程序制作了所有内容,现在我停留在 Step 2 of 2 when verifying installation 我
我正在使用 qt 从 html 代码生成一个 pdf 文件: QTextDocument *document = new QTextDocument(); document->setHtml(html
我是一名优秀的程序员,十分优秀!