【问题标题】:two sets of 3d points两组 3d 点
【发布时间】:2009-09-03 14:05:28
【问题描述】:

我有一个关于 3d 空间中的两组点的问题。 我在一个笛卡尔坐标系中用 40 个坐标定义了一个体积, 在另一个具有不同 (0,0,0) 的坐标系中,我的体积略有不同,也由 40 个坐标定义。我知道点集的匹配对,我想测量每个点对的差异(欧几里得距离)。 现在 1) 我如何相互引用两个坐标系(相同比例)和 2) 我如何最好地计算转换以注册两个体积?

感谢您的帮助。

【问题讨论】:

    标签: math 3d geometry coordinates


    【解决方案1】:

    如果您知道匹配对,那么可以使用伪逆(Matlab 或 numpy 中的 pinv())非常简洁地解决这个问题。

    1. 将点放入两个数组中,A & B,尺寸为 3x40。
    2. 在每个的底部添加一行 1,所以 它们现在的尺寸为 4x40。
    3. 将 B 转换为 A 的 4x4 矩阵 (包括任何翻译)是 A * 引脚(B)。

    在(大部分)一般位置有 40 个点,这甚至可以处理任意比例、旋转或透视变换。

    【讨论】:

      【解决方案2】:

      如果你取三个共同点来定义一个三角形,你可以通过比较表面法线之间的角度差来确定将一个点变成另一个点的旋转变换。你从量级的差异中得到比例,一旦你有了这两个,翻译就没有了。

      通过将 A 和 B 的一个角放在原点来制作 AOrigin 和 BOrigin。您可以通过从 A[0] 到 A[2] 中的每一个中定义减去 A[0] 来执行此操作,并对 B 执行相同操作,即:

      AOrigin[1] = A[1] - A[0] // this is vector math - you have to subtract each coordinate individually
      AOrigin[2] = A[2] - A[0]
      AOrigin[0] = <0 0 0>
      
      BOrigin[1] = B[1] - B[0]
      BOrigin[2] = B[2] - B[0]
      BOrigin[0] = <0 0 0>
      

      然后你得到单位法线,ANormal 和 BNormal

      ANormal = AOrigin[1] x AOrigin[2]
      ANormal = ANormal / |ANormal|
      BNormal = BOrigin[1] x BOrigin[2]
      BNormal = BNormal / |BNormal|
      

      那么你发现它们之间的夹角是:

      acos(ANormal . BNormal)
      

      问题是围绕哪个轴旋转?您可以通过取 ANormal 和 BNormal 的叉积来发现这一点。现在,您可以围绕单个轴进行一次旋转,将 A 转换为与 B 相同的旋转方向。

      下一个技巧是让 A 和 B 具有相同的比例,您可以通过从 A 和 B 中取两个点,找到每个点的长度,然后得到该比率来做到这一点。这就是规模。

      看看这是怎么回事?任何一本像样的微积分书都会包含这方面的所有数学知识。

      【讨论】:

      • 你能举例说明如何计算吗?例如。例如点集 A 1(87,159,28) 2(-97,216,15) 3(60,237,9) 和点集 B 1´(96,6,35) 2´(-86,62,23) 3`( 71,82,14)。这些是来自两个系统的对应坐标对。
      【解决方案3】:

      我不确定我是否理解你问题的第一部分,但如果你想要一个将一组点传递给另一组的转换,这里有一个简单的理解方法(虽然肯定不是最优雅的)。我将使用您提到的点集,A {1(87,159,28) 2(-97,216,15) 3(60,237,9)} 和 B {1´(96,6,35) 2´(-86,62 ,23) 3`(71,82,14)}。

      我从 A 开始

      (87,159,28) (-97,216,15) (60,237,9)

      并翻译它以将点 1 带到原点:

      (0,0,0) (-184,57,-13) (-27,78,-19)

      然后我绕 z 轴旋转,将点 2 带到 x-z 平面:

      (0,0,0) (-192.6,0,-13) (-48.9,66.5,-19)

      然后绕 y 轴将点 2 带到 z 轴:

      (0,0,0) (0,0,193.1) (-15.7,66.5,50.0)

      最后再次绕 z 轴将点 3 带到 x-z 平面:

      (0,0,0) (0,0,193.1) (-68.3,0,50.0)

      这些步骤按顺序执行,将事物从空间 A 带到一个新空间,称为 C。将此转换称为 Tca。这些步骤是可逆的——称为逆变换 Tac。现在对 B 做同样的事情来得到 Tcb 和 Tbc。当这两组点都在 C 中时,它们将匹配。现在将集合 A 带到集合 B,只需应用 Tca,然后应用 Tbc。要从集合 B 转到集合 A,请先应用 Tcb,然后再应用 Tac。

      【讨论】:

        猜你喜欢
        • 2016-09-16
        • 1970-01-01
        • 1970-01-01
        • 2013-02-12
        • 1970-01-01
        • 2021-04-07
        • 2020-11-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多