如何根据已知点的4个距离找到点的3D坐标

时间:2015-03-09 20:05:18

标签: c++ algorithm 3d geometry coordinate-systems

经过一周的搜索和实验,我很清楚我被卡住了。我在太空中有4个已知点[A,B,C,D],它们各自到未知点X的距离。我的数学知识是最基本的,所以在尝试理解一些三维数学时遇到了令人沮丧的时间,所以任何人都可以用c ++ 中的分步示例来解释所需的算法。点X? 感谢。

例如:点A {-39, 24.9062, -0.65625},点B {-13.5, 25.2812, -4}和点C {-11.5625, 43.8125, 11.625 }。距离AX = 21.5116BX = 43.8125CX = 11.625

正如人们已经指出的那样有解决方案来解决X点与球体的交点,但正如我所说的那样,我的数学并不是那么好,所以一个工作的例子将会受到赞赏。

我认为另一种可能的解决方案是首先找出ABC三角形所在平面底部与点X之间的距离。这个距离基本上是三面体ABCX的高度。然后从那里使用三角法计算出AXBXCX顶点的仰角,以计算m行的y = mx + b。再次,这是我的数学技能失败的地方。

指示Matlab / Mathematica示例一切都很好但是因为它使用自己的数学函数库并且假定数学工艺的良好工作知识来解决问题它只是简单地帮助我而不是我;我害怕。我正在为C ++(或C)中的这个确切问题寻找一步一步的解决方案。

我看过的任何地方(包括SO)都没有人全面解释这个从绝对开始到绝对完成的三维问题的解决方案。不是每个人都擅长数学,这就是为什么我更喜欢一个有效的例子,所以我可以通过并更好地掌握。

无论如何,谢谢大家过去和未来的各种联系和建议。

2 个答案:

答案 0 :(得分:0)

您要问的问题称为Trilateration。基本上,您可以选择三个锚点并使用第四个锚点来消除歧义。这篇Wiki文章试图简化计算,假设这三个点位于z = 0平面。

一般情况下需要更复杂的计算,因此您需要将三个锚点映射到本文中讨论的案例,然后找到解决方案,然后使用逆转换将它们映射回来。

您可以使用搜索字符串“trilateration C ++”轻松找到该问题的C ++代码。

答案 1 :(得分:0)

首先写出以三个已知点为中心并具有已知半径的三个球体的方程式。

(X-Xi)² + (Y-Yi)² + (Z-Zi)² = Ri²

从其他两个中减去第一个,术语消失,留下两个平面方程,定义一条直线。

沿此行找到两个不同的点P0P1(例如使用Line of intersection between two planes),并形成该行的参数方程

P = P0 + t (P1 - P0).

将其插入到第一个球体的等式中会得到一个二次方程,它应该在t中给出两个解。

[(P0 - C0) + t (P1 - P0)]² = (P0 - C0)² - 2 (P0 - C0).(P1 - P0) t + (P1 - P0)²t² = R0²

计算两个P,然后使用第四个点来保持最佳匹配距离的解决方案。