【问题标题】:How to find 3D coordinate of point based on 4 distances from known points如何根据距已知点的 4 个距离找到点的 3D 坐标
【发布时间】:2015-03-09 20:05:18
【问题描述】:

经过一周的搜索和试验,很明显我陷入了困境。我在空间中有 4 个已知点 [A,B,C,D] 以及它们各自到未知点 X 的距离。我的数学知识充其量是基本的,所以在尝试理解一些 3d 数学时遇到了令人沮丧的事情,所以任何人都可以用 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 顶点的仰角,以计算出y = mx + b 线的m。这又是我的数学技能失败的地方。

表明 Matlab/Mathematica 示例一切都很好,但由于它使用自己的数学函数库,并假设对数学工艺有良好的工作知识来解决问题,恐怕它根本对我没有帮助。我正在寻找 C++(或 C)中这个确切问题的分步解决方案。

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

无论过去还是将来,都感谢大家提供的各种链接和建议。

【问题讨论】:

  • 我以前看过这些,但无论如何都感谢建议链接。可悲的是,我的实现需要使用 C++(或者 C,如果涉及到的话)以及处理平面而不是 3D 空间的线性代数,所以再一次不行。
  • 这个stackoverflow.com/q/25850564/2521214 怎么样?只需从每个点投射球体,半径等于到 X 的距离。找到所有球体对组合之间或所有球体组合之间的共同交点。
  • @CodieCodeMonkey - OP 明确表示您声称完全重复的问题对他/她没有帮助。这是有道理的,因为他/她想要 C++ 而不是 Matlab

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


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    首先写出以三个已知点为圆心,半径已知的三个球的方程。

    (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,然后使用第四个点来保持与它的距离最匹配的解。

    【讨论】:

    • 一个后续问题,如果我们与已知点的距离超过 4 个怎么办?像50?如何计算解?
    猜你喜欢
    • 2022-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-29
    • 2017-06-21
    • 2012-06-13
    • 1970-01-01
    相关资源
    最近更新 更多