2

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

谢谢您的帮助。

4

3 回答 3

2

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

  1. 将这些点放入大小为 3x40 的两个数组 A 和 B。
  2. 在每个的底部添加一行 1,因此它们现在的大小为 4x40。
  3. 将 B 转换为 A(包括任何平移)的 4x4 矩阵是 A * pinv(B)。

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

于 2009-12-13T19:36:29.020 回答
1

我不确定我是否理解你问题的第一部分,但如果你想要一个将一组点传递给另一组的转换,这里有一个简单的理解方法(虽然肯定不是最优雅的)。我将使用您提到的点集,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 带到 xz 平面:

(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 带到 xz 平面:

(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。

于 2009-09-03T18:53:20.393 回答
1

如果取定义三角形的三个公共点,则可以通过比较曲面法线之间的角度差来确定将一个转换为另一个的旋转变换。你从大小的差异中得到比例,一旦你有了这两个,翻译就会消失。

通过将 A 和 B 的一个角放在原点来制作 AOrigin 和 BOrigin。您可以通过从 A[0] 到 A[2] 中的每一个定义 Subtracting 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 中取两个点,找到每个点的长度,然后得到这个比率。这就是规模。

看看这是怎么回事?所有这方面的数学都将出现在任何体面的微积分书中。

于 2009-09-03T14:36:05.727 回答