给定一组点,我可以计算变换矩阵吗?

时间:2013-06-18 14:24:02

标签: matrix transformation linear-algebra

我正试图从结果中扣除2D变换参数。

给定的是未知X-Y坐标系中的大量样本以及WGS84(经度,纬度)中各自的对应样本。由于面积很小,我们可以假设目标系统也是平坦的。

可悲的是,我不知道使用了哪种缩放,旋转,翻译,我甚至不确定是否有1或2个翻译。

我试图创建一个冗长的方程式系统,但这对我来说太复杂了。基本几何也失败了,因为转换的顺序是未知的,我将不得不检查每个可能的组合顺序。

这个问题有系统的方法吗?

2 个答案:

答案 0 :(得分:2)

确定缩放系数很简单,只需选择任意两个点并找到它们在X-Y空间和WGS84空间之间的距离,它们的比例就是缩放系数。

旋转和平移有点棘手,但当您了解到应用任意数量的旋转或平移(仅在2维中!)的结果可以减少到一个未知点的单个旋转时,并不是那么困难。一些未知的角度。

突然你有N个点来确定3个未知数,旋转轴(x和y坐标)和旋转角度。

计算旋转如下:

    Pr = R*(Pxy - Paxis_xy) + Paxis_xy

Pr是X-Y空间中的旋转点,然后需要转换为WGS84空间(如果坐标系的轴不同)。
R是您熟悉的rotation matrix,具体取决于您的旋转角度 Pxy是X-Y空间中未旋转的点 Paxis_xy是X-Y空间中的旋转轴。

要实际找到3个未知数,您需要通过找到的比例因子取消比例缩放WGS84点(或等效地缩放XY点)并移动点以使两个坐标系具有相同的原点。

首先,找到旋转角度:取两对相应的点P1, P1'P2, P2'并写出

     P1' = R(P1-A) + A
     P2' = R(P2-A) + A

为了简洁,我换了A = Paxis_xy。减去这两个方程得出:

     P2'-P1' = R(P2-P1)
     B = R * C
     Bx = cos(a) * Cx - sin(a) * Cy
     By = cos(a) * Cx + sin(a) * Cy
     By + Bx = 2 * cos(a) * Cx
     (By + Bx) / (2 * Cx) = cos(a)
     ...
     (By - Bx) / (2 * Cy) = sin(a)
     a = atan2(sin(a), cos(a)) <-- to get the right quadrant

你有自己的角度,你也可以快速检查cos(a) * cos(a) + sin(a) * sin(a) == 1以确保你所有的计算都正确或你的系统确实是一个保持方向的等距(仅由翻译和旋转组成) )。

既然我们知道a我们知道R,那么我们就会找到A

    P1` = R(P1-A) + A
    P1' - R*P1 = (I-R)A
    A = (inverse(I-R)) * (P1' - R*P1)

inversion of a 2x2 matrix is easy

编辑:上述内容有误,或者更具体地说是一个需要单独处理的案例。
翻译和旋转的一种组合不会减少到单个旋转,而是单个翻译。您可以根据固定点来考虑它(操作后有多少点不变) 平移没有固定点(所有点都已更改),旋转有1个固定点(轴不会更改)。事实证明,两个旋转留下1个固定点并且平移和旋转留下1个固定点,其中(有一点证明固定点的数量告诉您执行的操作)是这些的任意组合导致的原因一次轮换。

这对您来说意味着如果您的角度为0,那么使用上述方法也会给您A = 0,这可能不正确。在这种情况下,您必须执行A = P1' - P1

答案 1 :(得分:1)

如果我正确理解了这个问题,你有 n 点(X 1 ,Y 1 ),......,(X < sub> n ,Y n ),相应的点,比方说,(x 1 ,y 1 ),... ,(x n ,y n )在另一个坐标系中,前者应该通过旋转,缩放和平移从后者获得。

请注意,此数据不会确定固定的旋转/缩放点,也不会确定应“应”应用的顺序。另一方面,如果您事先知道这些或任意选择它们,您将找到一个旋转,平移和缩放因子,将数据转换为应该。

例如,您可以选择任意一点,例如,p 0 = [X 1 ,Y 1 ] T (列向量)作为旋转的固定点&amp;缩放并从其他两个点中减去其坐标,得到p 2 = [X 2 -X 1 ,Y 2 < / sub> -Y 1 ] T ,p 3 = [X 3 -X 1 ,Y 3 -Y 1 ] T 。同样取列向量q 2 = [x 2 -x 1 ,y 2 -y 1 ] T ,q 3 = [x 3 -x 1 ,y 3 -y <子> 1 ] Ť。现在[p 2 p 3 ] = A * [q 2 q 3 ],其中A是unknwon表示旋转缩放的2x2矩阵。你可以解决它(除非你不幸并选择退化点)为A = [p 2 p 3 ] * [q 2 q < sub> 3 ] -1 其中 -1 表示矩阵逆(2x2矩阵[q 2 q 3] ])。现在,如果坐标系之间的变换确实是旋转 - 缩放 - 平移,则所有点都应满足P k = A *(Q k -q 0 )+ p 0 ,其中P k = [X k ,Y k ] < sup> T ,Q k = [x k ,y k ] T ,q < sub> 0 = [x 1 ,y 1 ] T ,k = 1,..,n。

如果需要,您可以很容易地从A的组件中确定缩放和旋转参数,或者组合b = -A * q 0 + p 0 以获得P k = A * Q k + b。

上述方法对噪声或选择退化点的反应不好。如有必要,可以通过应用例如主成分分析来解决这个问题,如果MATLAB或其他一些线性代数工具可用,它也只是几行代码。