我想对这个示例数据集执行转换。
在一个坐标系[主坐标系]中有四个坐标为x、y、z的已知点,在另一个坐标系[辅助坐标系]中有四个坐标为x、y、h的已知点。
这些点相对应;例如主系统1点和次系统1点是完全相同的点,但我们有两个不同的坐标系中的坐标。
所以我这里有四对调整点,想根据调整把另一个点坐标从一次系统转换到二次系统。
primary_system1 = (3531820.440, 1174966.736, 5162268.086)
primary_system2 = (3531746.800, 1175275.159, 5162241.325)
primary_system3 = (3532510.182, 1174373.785, 5161954.920)
primary_system4 = (3532495.968, 1175507.195, 5161685.049)
secondary_system1 = (6089665.610, 3591595.470, 148.810)
secondary_system2 = (6089633.900, 3591912.090, 143.120)
secondary_system3 = (6089088.170, 3590826.470, 166.350)
secondary_system4 = (6088672.490, 3591914.630, 147.440)
#transform this point
x = 3532412.323
y = 1175511.432
z = 5161677.111<br>
目前,我尝试使用以下四对点中的每一个来平均x、y和z轴的平移:
#x axis
xt1 = secondary_system1[0] - primary_system1[0]
xt2 = secondary_system2[0] - primary_system2[0]
xt3 = secondary_system3[0] - primary_system3[0]
xt4 = secondary_system4[0] - primary_system4[0]
xt = (xt1+xt2+xt3+xt4)/4 #averaging
…等等,y轴和z轴
#y axis
yt1 = secondary_system1[1] - primary_system1[1]
yt2 = secondary_system2[1] - primary_system2[1]
yt3 = secondary_system3[1] - primary_system3[1]
yt4 = secondary_system4[1] - primary_system4[1]
yt = (yt1+yt2+yt3+yt4)/4 #averaging
#z axis
zt1 = secondary_system1[2] - primary_system1[2]
zt2 = secondary_system2[2] - primary_system2[2]
zt3 = secondary_system3[2] - primary_system3[2]
zt4 = secondary_system4[2] - primary_system4[2]
zt = (zt1+zt2+zt3+zt4)/4 #averaging
所以在上面我试图计算每个轴的平均平移向量
您正在寻找的映射似乎是仿射变换。四个不在一个平面上的三维点是恢复仿射变换所需的点的确切数目。后者,粗略地说,是用矩阵相乘并加上一个向量
这个问题现在被简化为找到合适的矩阵A和向量t。我想,这段代码可能会帮助你(对不起,糟糕的代码风格——我是数学家,不是程序员)
此代码演示如何将仿射变换恢复为矩阵+向量,并测试初始点是否映射到它们应该映射的位置。您可以使用Google colab测试此代码,这样就不必安装任何东西。
关于这段代码背后的理论:它基于“Beginner's guide to mapping simplexes affinely”中给出的方程,矩阵恢复在“标准符号的恢复”一节中进行了描述,在“我们需要多少点”一节中讨论了精确仿射变换所需的点数章节。同一作者发表了“Workbook on mapping simplexes affinely”,其中包含许多此类的实际例子。
如果它只是一个平移和旋转,那么这是一个称为affine transformation的变换。
它的基本形式是:
其中
A
是一个3x3矩阵(因为你在3D中),而b
是一个3x1转换。这可以等价地写成
其中
secondary_system_coords2
是载体[secondary_system,1]
primary_system2
是向量[primary_system,1]
,并且A2
是4x4矩阵:(有关详细信息,请参见wiki页面)。
所以基本上,你需要解这个方程:
对于
A2
,其中y
由secondary_system
中的点组成,1卡在末端,x
是primary_system
中的点,1卡在末端,A2
是4x4矩阵。现在,如果
x
是一个正方形矩阵,我们可以这样求解:但是
x
是4x1。但是,您很幸运,有4个x
集合和4个对应的y
集合,因此您可以构造一个x
,即4x4,如下所示:其中
primary_systemi
中的每一个都是4x1列向量。与y
相同。一旦有了
A2
,要将点从system1转换为system 2,只需执行以下操作:您可以这样设置(例如在
numpy
中):然后像这样使用:
注意:这里当然有数值误差,这可能不是解决变换的最佳方法(您可能可以做一些最小二乘法的事情)。
此外,将
primary_systemx
转换为secondary_systemx
的错误(在本例中)为10^(-2)阶。您必须考虑这是否可以接受(它看起来确实很大,但与您的输入点(都是10^6阶)相比,它可能是可以接受的)。
相关问题 更多 >
编程相关推荐