Math 两组三维点

Math 两组三维点,math,3d,geometry,coordinates,Math,3d,Geometry,Coordinates,我有一个关于三维空间中两组点的问题。 我用一个笛卡尔坐标系中的40个坐标定义了一个体积, 在另一个不同(0,0,0)的坐标系中,我有稍微不同的体积,也由40个坐标定义。我知道点集的匹配对,我想测量每个点对的差异(欧几里德距离)。 现在,1)如何将两个坐标系(相同比例)相互引用,2)如何最好地计算变换以注册两个体积 谢谢您的帮助。如果选取定义三角形的三个公共点,可以通过比较曲面法线之间的角度差来确定将一个点转换为另一个点的旋转变换。你们从大小的差异中得到了尺度,一旦你们得到了这两个,平移就不复存在

我有一个关于三维空间中两组点的问题。 我用一个笛卡尔坐标系中的40个坐标定义了一个体积, 在另一个不同(0,0,0)的坐标系中,我有稍微不同的体积,也由40个坐标定义。我知道点集的匹配对,我想测量每个点对的差异(欧几里德距离)。 现在,1)如何将两个坐标系(相同比例)相互引用,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>
然后你会发现它们之间的角度是:

acos(ANormal . BNormal)
问题是旋转的轴是什么?通过取异常和B正常的交叉积,你会发现这一点。现在,您可以围绕单个轴进行单个旋转,从而将a转换为与B相同的旋转方向

下一个技巧是让A和B具有相同的比例,你可以从A和B中取两个点,找到每个点的长度,然后得到这个比例。这就是天平


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

如果取三个定义三角形的公共点,可以通过比较曲面法线之间的角度差来确定将一个点转换为另一个点的旋转变换。你们从大小的差异中得到了尺度,一旦你们得到了这两个,平移就不复存在了

通过将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>
然后你会发现它们之间的角度是:

acos(ANormal . BNormal)
问题是旋转的轴是什么?通过取异常和B正常的交叉积,你会发现这一点。现在,您可以围绕单个轴进行单个旋转,从而将a转换为与B相同的旋转方向

下一个技巧是让A和B具有相同的比例,你可以从A和B中取两个点,找到每个点的长度,然后得到这个比例。这就是天平


看看这是怎么回事?这方面的所有数学都会出现在任何一本像样的微积分书中。

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

我从一本书开始

(87,159,28) (-97,216,15) (60,237,9) (87,159,28) (-97,216,15) (60,237,9) 并将其转换为原点的第1点:

(0,0,0) (-184,57,-13) (-27,78,-19) (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) (0,0,0) (0,0,193.1) (-68.3,0,50.0) (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) (0,0,0) (0,0,193.1) (-15.7,66.5,50.0) 最后,再次绕z轴旋转,将点3带到x-z平面:

(0,0,0) (-192.6,0,-13) (-48.9,66.5,-19) (0,0,0) (0,0,193.1) (-68.3,0,50.0) (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。

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

我从一本书开始

(87,159,28) (-97,216,15) (60,237,9) (87,159,28) (-97,216,15) (60,237,9) 并将其转换为原点的第1点:

(0,0,0) (-184,57,-13) (-27,78,-19) (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) (0,0,0) (0,0,193.1) (-68.3,0,50.0) (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) (0,0,0) (0,0,193.1) (-15.7,66.5,50.0) 最后,再次绕z轴旋转,将点3带到x-z平面:

(0,0,0) (-192.6,0,-13) (-48.9,66.5,-19) (0,0,0) (0,0,193.1) (-68.3,0,50.0) (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。

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

  • 将点放入两个数组中,A& B、 尺寸为3x40
  • 在每行的底部添加一行1,以便 它们现在的尺寸是4x40
  • 将B转换为A的4x4矩阵 (包括任何翻译)是* pinv(B)
    当40个点(大部分)处于一般位置时,这甚至可以处理任意比例、旋转或透视变换。

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

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