2D坐标系旋转平移总结

案例

已知 红点在蓝色坐标系的位置(x_b, y_b),也知道蓝色坐标系相较于黑色坐标系 旋转的角度θ, 其中 蓝色坐标系的原点在黑色坐标系中的位置为(\delta x, \delta y).

求解: 红点在黑色坐标系同的位置(x_a, y_a)?

分析推导

黑色坐标系分析

在黑色坐标系中,我们为这个坐标系取名为A坐标系,红点为P,坐标系的原点取名为O_a

我们要求解的是P点在A坐标系中的位置(x_a,y_a)。

其实P点在A坐标系中的位置(x_a,y_a),就是向量\vec {O_aP},表示为:

\vec {O_aP} = (x_a, y_a)

根据向量的特点,我们可以将\vec {O_aP} 分解为水平和垂直方向的两个向量\vec X\vec Y:

\vec {O_aP} = \vec X + \vec Y

进一步,我们根据向量缩放的特点,可以定义水平和垂直方向的单位向量\vec {i_a}\vec {j_a}, 那么:

\vec X = x_a \cdot \vec {i_a}
\vec Y = y_a \cdot \vec {j_a}

Note

x_a是x方向的数量,其实本质就是P点在A坐标系中的x坐标位置

y_a是y方向的数量,其实本质就是P点在A坐标系中的y坐标位置

总结以上,我们可以得到:

\vec {O_aP} = x_a \cdot \vec {i_a} + y_a \cdot \vec {j_a}

蓝色坐标系分析

在黑色坐标系中,我们为这个坐标系取名为B坐标系,坐标系的原点取名为O_b

已知的是O_b在A坐标系中的坐标位置为(\delta x, \delta y)。

其实O_b在A坐标系中的坐标位置(\delta x, \delta y) ,就是向量\vec {O_aO_b},表示为:

\vec {O_aO_b} = (\delta x, \delta y)

根据向量的三角形法则,我们可以知道:

\vec {O_aP} = \vec {O_aO_b} + \vec {O_bO_P}

向量\vec {O_aO_b} 和 向量\vec {O_aP}的坐标表示我们都是知道的,现在的问题是 如何表示向量\vec {O_bP}的坐标值

在此处有个误区,大家可能会觉得\vec {O_bP} = (x_b, y_b)

其实不是这样的,(x_b, y_b)坐标表示的是点P在B坐标系中的位置,视角是站在B坐标系上的,此时我们的视角应该是在A坐标系,或者是和A坐标系平行的。

那么,我们可以将B坐标系进行旋转,保证和A坐标系平行。

根据前面旋转部分的推导,我们可以得到:

\vec {O_bP} = \left[ \begin{matrix} cos(θ) & -sin(θ) \\ sin(θ) & cos(θ) \\ \end{matrix} \right] \cdot \left[ \begin{matrix} x_b \\ y_b \end{matrix} \right]

综合分析

已知:

(1)

\vec {O_aP} = \vec {O_aO_b} + \vec {O_bO_P}

(2)

\vec {O_aP} = (x_a, y_a)

(3)

\vec {O_aO_b} = (\delta x, \delta y)

(4)

\vec {O_bP} = \left[ \begin{matrix} cos(θ) & -sin(θ) \\ sin(θ) & cos(θ) \\ \end{matrix} \right] \cdot \left[ \begin{matrix} x_b \\ y_b \end{matrix} \right]

那么:

(x_a, y_a) = (\delta x, \delta y) + \left[ \begin{matrix} cos(θ) & -sin(θ) \\ sin(θ) & cos(θ) \\ \end{matrix} \right] \cdot \left[ \begin{matrix} x_b \\ y_b \end{matrix} \right]

正确的格式应该为:

\left[ \begin{matrix} x_a \\ y_a \end{matrix} \right] = \left[ \begin{matrix} \delta x \\ \delta y \end{matrix} \right] + \left[ \begin{matrix} cos(θ) & -sin(θ) \\ sin(θ) & cos(θ) \\ \end{matrix} \right] \cdot \left[ \begin{matrix} x_b \\ y_b \end{matrix} \right]
\left[ \begin{matrix} x_a \\ y_a \end{matrix} \right] = \left[ \begin{matrix} \delta x \\ \delta y \end{matrix} \right] + \left[ \begin{matrix} cos(θ)*x_b - sin(θ)*y_b \\ sin(θ)*x_b + cos(θ)*y_b \end{matrix} \right]
\left[ \begin{matrix} x_a \\ y_a \end{matrix} \right] = \left[ \begin{matrix} cos(θ)*x_b - sin(θ)*y_b + \delta x\\ sin(θ)*x_b + cos(θ)*y_b + \delta y \end{matrix} \right]

转换成变换矩阵为:

\left[ \begin{matrix} x_a \\ y_a \\ 1 \end{matrix} \right] = \left[ \begin{matrix} cos(θ) & - sin(θ) & \delta x \\ sin(θ) & cos(θ) & \delta y \\ 0 & 0 & 1 \end{matrix} \right] \cdot \left[ \begin{matrix} x_b \\ y_b \\ 1 \end{matrix} \right]

总结

观察平移

前面我们总结过平移转换的矩阵:

其实我们将重点部分圈起来看:

观察旋转

总结过的旋转矩阵为:

我们看看圈起来的部分:

观察旋转和平移

总结的旋转和平移矩阵为:

我们看看圈起来的部分:

综合总结

在二维空间中,如果我们希望求解一个点在不同坐标间的转换,我们可以采用变换矩阵进行求解:

^A_BT = \left[ \begin{matrix} cos(θ) & - sin(θ) & \delta x \\ sin(θ) & cos(θ) & \delta y \\ 0 & 0 & 1 \end{matrix} \right]

Note

T表示transform,变换的意思。

^A_BT 表示的是 由B坐标系变换为A坐标系的意思。

大致上我们可以得到以下:

P_a = \ ^A_BT \cdot P_b
P_b = ^A_BT^{-1} \cdot P_a