坐标变换

[!important]
本文内容默认以左手笛卡尔坐标系为基础
虽然右手坐标系更为常见

多维坐标变换 Link to heading

考虑三维空间中的一点 P
$x'_{i}$ 和 $x_{j}$轴的关系如下

$$\lambda_{ij}=\cos(x'_{i},x_{j})$$

此处$x'$轴就是$x$轴根据一定角度变换得到的

$$ \lambda = \lambda_{ij} = \begin{pmatrix} λ_{11} & λ_{12} & λ_{13}\\ λ_{21} & λ_{22} & λ_{23}\\ λ_{31} & λ_{32} & λ_{33} \end{pmatrix} \quad \vec{x'} = \begin{pmatrix} x'_{1} \\ x'_{2} \\ x'_{3} \end{pmatrix} \quad \vec{x} = \begin{pmatrix} x_{1} \\ x_{2} \\ x_{3} \end{pmatrix} $$

变换方程就是

$$ \vec{x'} = \lambda \vec{x} $$

$$ \vec{x} = \lambda^{T} \vec{x'} \quad或\quad \vec{x} = \lambda^{-1} \vec{x'} $$

二维坐标变换 Link to heading

公式: $$ \begin{pmatrix} x’ \ y' \end{pmatrix} Link to heading

\begin{pmatrix} \cos\theta & \sin\theta \ -\sin\theta & \cos\theta \end{pmatrix} \begin{pmatrix} x \ y \end{pmatrix} $$

import numpy as np
theta = np.radians(30)
x,y = 5, 3
rotation_matrix = np.array([
    [np.cos(theta), np.sin(theta)], 
    [-np.sin(theta), np.cos(theta)]
])
point = np.array([x,y])
rotation_matrix.dot(point)
array([5.83012702, 0.09807621])

三维坐标变换 Link to heading

::: tabs

@tab:active 左手笛卡尔坐标系

绕x轴公式: $$ Z(\gamma) = \begin{pmatrix} x’ \ y’ \ z' \end{pmatrix} Link to heading

\begin{pmatrix} 1 & 0 & 0 \ 0 & \cos\gamma & \sin\gamma \ 0 & -\sin\gamma & \cos\gamma \end{pmatrix} \begin{pmatrix} x \ y \ z \end{pmatrix} $$

绕y轴公式: $$ Y(\beta) = \begin{pmatrix} x’ \ y’ \ z' \end{pmatrix} Link to heading

\begin{pmatrix} \cos\beta & 0 & -\sin\beta \ 0 & 1 & 0 \ \sin\beta & 0 & \cos\beta \end{pmatrix} \begin{pmatrix} x \ y \ z \end{pmatrix} $$

绕z轴公式: $$ X(\theta) = \begin{pmatrix} x’ \ y’ \ z' \end{pmatrix} Link to heading

\begin{pmatrix} \cos\theta & \sin\theta & 0 \ -\sin\theta & \cos\theta & 0 \ 0 & 0 & 1 \end{pmatrix} \begin{pmatrix} x \ y \ z \end{pmatrix} $$

@tab 右手笛卡尔坐标系

绕x轴公式: $$ X(\gamma) = \begin{pmatrix} x’ \ y’ \ z' \end{pmatrix} Link to heading

\begin{pmatrix} 1 & 0 & 0 \ 0 & \cos\gamma & -\sin\gamma \ 0 & \sin\gamma & \cos\gamma

\end{pmatrix} \begin{pmatrix} x \ y \ z \end{pmatrix} $$

绕y轴公式:

$$ Y(\beta) = \begin{pmatrix} x’ \ y’ \ z' \end{pmatrix} Link to heading

\begin{pmatrix} \cos\beta & 0 & \sin\beta \ 0 & 1 & 0 \ -\sin\beta & 0 & \cos\beta \end{pmatrix} \begin{pmatrix} x \ y \ z \end{pmatrix} $$

绕z轴公式: $$ Z(\theta) = \begin{pmatrix} x’ \ y’ \ z' \end{pmatrix} Link to heading

\begin{pmatrix} \cos\theta & -\sin\theta & 0 \ \sin\theta & \cos\theta & 0 \ 0 & 0 & 1 \end{pmatrix} \begin{pmatrix} x \ y \ z \end{pmatrix} $$

:::

import numpy as np
alpha = np.radians(30)  # 绕z轴旋转
beta = np.radians(30)  # 绕y轴旋转
gamma = np.radians(30)  # 绕x轴旋转
x, y, z = 3, 4, 5
rotation_matrix_z = np.array([
    [np.cos(alpha), np.sin(alpha), 0],
    [-np.sin(alpha), np.cos(alpha), 0],
    [0, 0, 1]
])
rotation_matrix_y = np.array([
    [np.cos(beta), 0, -np.sin(beta)],
    [0, 1, 0],
    [np.sin(beta), 0, np.cos(beta)]
])
rotation_matrix_x = np.array([
    [1, 0, 0],
    [0, np.cos(gamma), np.sin(gamma)],
    [0, -np.sin(gamma), np.cos(gamma)]
])
point = np.array([x, y, z])
z_transformed_point = rotation_matrix_z.dot(point)
y_transformed_point = rotation_matrix_y.dot(point)
x_transformed_point = rotation_matrix_x.dot(point)
print(z_transformed_point)
print(y_transformed_point)
print(x_transformed_point)
[4.59807621 1.96410162 5.        ]
[0.09807621 4.         5.83012702]
[3.         5.96410162 2.33012702]

参考链接 Link to heading

坐标转换