经过一周的搜索和实验,我很清楚我被卡住了。我在太空中有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.5116
,BX
= 43.8125
和CX
= 11.625
。
正如人们已经指出的那样有解决方案来解决X
点与球体的交点,但正如我所说的那样,我的数学并不是那么好,所以一个工作的例子将会受到赞赏。
我认为另一种可能的解决方案是首先找出ABC
三角形所在平面底部与点X
之间的距离。这个距离基本上是三面体ABCX
的高度。然后从那里使用三角法计算出AX
,BX
和CX
顶点的仰角,以计算m
行的y = mx + b
。再次,这是我的数学技能失败的地方。
指示Matlab / Mathematica示例一切都很好但是因为它使用自己的数学函数库并且假定数学工艺的良好工作知识来解决问题它只是简单地帮助我而不是我;我害怕。我正在为C ++(或C)中的这个确切问题寻找一步一步的解决方案。
我看过的任何地方(包括SO)都没有人全面解释这个从绝对开始到绝对完成的三维问题的解决方案。不是每个人都擅长数学,这就是为什么我更喜欢一个有效的例子,所以我可以通过并更好地掌握。
无论如何,谢谢大家过去和未来的各种联系和建议。
答案 0 :(得分:0)
您要问的问题称为Trilateration。基本上,您可以选择三个锚点并使用第四个锚点来消除歧义。这篇Wiki文章试图简化计算,假设这三个点位于z = 0
平面。
一般情况下需要更复杂的计算,因此您需要将三个锚点映射到本文中讨论的案例,然后找到解决方案,然后使用逆转换将它们映射回来。
您可以使用搜索字符串“trilateration C ++”轻松找到该问题的C ++代码。
答案 1 :(得分:0)
首先写出以三个已知点为中心并具有已知半径的三个球体的方程式。
(X-Xi)² + (Y-Yi)² + (Z-Zi)² = Ri²
从其他两个中减去第一个,术语X²
,Y²
和Z²
消失,留下两个平面方程,定义一条直线。
沿此行找到两个不同的点P0
和P1
(例如使用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
,然后使用第四个点来保持最佳匹配距离的解决方案。