maf*_*afu 5 transformation matrix linear-algebra
我正在尝试从结果中扣除 2D 转换参数。
给出了未知 XY 坐标系中的大量样本以及它们在 WGS84(经度、纬度)中的对应样本。由于面积很小,我们也可以假设目标系统是平坦的。
遗憾的是,我不知道使用了哪种缩放、旋转、平移顺序,我什至不确定是否有 1 或 2 个翻译。
我试图创建一个冗长的方程系统,但结果太复杂了,我无法处理。基本几何也让我失望,因为转换的顺序是未知的,我必须检查每个可能的组合顺序。
有没有系统的方法来解决这个问题?
计算缩放因子很容易,只需选择任意两点并找到它们在 XY 空间和 WGS84 空间中的距离,它们的比率就是您的缩放因子。
旋转和平移有点棘手,但当您了解到应用任意数量的旋转或平移(仅在二维中!)的结果可以简化为围绕某个未知点以某个未知角度进行的单次旋转时,就不再那么困难了。
突然间,您有 N 个点来确定 3 个未知数:旋转轴(x 和 y 坐标)和旋转角度。
计算旋转如下所示:
Pr = R*(Pxy - Paxis_xy) + Paxis_xy
Run Code Online (Sandbox Code Playgroud)
Pr是 XY 空间中的旋转点,然后需要将其转换为 WGS84 空间(如果坐标系的轴不同)。
R是熟悉的旋转矩阵,具体取决于您的旋转角度。
Pxy是 XY 空间中未旋转的点。
Paxis_xy是 XY 空间中的旋转轴。
要实际找到 3 个未知数,您需要按找到的缩放因子取消缩放 WGS84 点(或等效缩放 XY 点)并移动点,以便两个坐标系具有相同的原点。
首先,求旋转角度:取两对对应的点P1, P1'和P2, P2'并写出
P1' = R(P1-A) + A
P2' = R(P2-A) + A
Run Code Online (Sandbox Code Playgroud)
我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
Run Code Online (Sandbox Code Playgroud)
你有自己的角度,你也可以快速检查一下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)
Run Code Online (Sandbox Code Playgroud)
其中2x2 矩阵的求逆很容易。
编辑:上面有一个错误,或者更具体地说,有一种情况需要单独处理。
存在一种平移和旋转的组合,它不会简化为单个旋转,而是单个平移。你可以把它想象成固定点(运算后有多少点不变)。
平移没有固定点(所有点都会改变),旋转有 1 个固定点(轴不改变)。事实证明,两次旋转留下 1 个固定点,一次平移和一次旋转留下 1 个固定点,这(有一点证据表明固定点的数量可以告诉您执行的操作)是这些结果的任意组合的原因单次旋转。
这对你来说意味着,如果你的角度是这样的,0那么使用上面的方法也会给你A = 0同样的结果,这可能是不正确的。在这种情况下你必须这样做A = P1' - P1。
| 归档时间: |
|
| 查看次数: |
8411 次 |
| 最近记录: |