Skip to content

Способы представления поворотов матрицы поворота, ось угол, кватернион

Способы представления поворотов

Повороты в пространстве могут быть представлены различными способами. Наиболее часто используемые методы включают матрицы поворота, представление ось–угол и кватернионы.

1. Матрицы поворота

Математика: Матрица поворота в двумерном пространстве для угла \(\theta\) выглядит так:

\(\mathbf{R}(\theta) = \begin{pmatrix}\cos \theta & -\sin \theta \\\sin \theta & \cos \theta\end{pmatrix}\)

В трехмерном пространстве для поворота вокруг оси \(z\) на угол \(\theta\) матрица поворота будет:

\(\mathbf{R}_z(\theta) = \begin{pmatrix}\cos \theta & -\sin \theta & 0 \\\sin \theta & \cos \theta & 0\\0 & 0 & 1\end{pmatrix}\)

Код на Python:

import numpy as np

# Угол поворота в радианах
theta = np.radians(45)

# Матрица поворота для двумерного случая
R_2d = np.array([[np.cos(theta), -np.sin(theta)], [np.sin(theta), np.cos(theta)]])

# Матрица поворота для трехмерного случая вокруг оси z
R_3d = np.array([[np.cos(theta), -np.sin(theta), 0],
                 [np.sin(theta), np.cos(theta), 0],
                 [0, 0, 1]])

print("Матрица поворота 2D:")
print(R_2d)
print("Матрица поворота 3D вокруг оси z:")
print(R_3d)

2. Представление ось–угол

Математика: Поворот может быть описан углом \(\theta\) и осью \(\mathbf{u}\) (нормализованной вектором): \(\text{Поворот на угол } \theta \text{ вокруг оси } \mathbf{u} = \begin{pmatrix} u_x, u_y, u_z \end{pmatrix}\)

Код на Python:

import numpy as np

# Угол поворота в радианах
theta = np.radians(45)
# Ось вращения (нормализованный вектор)
u = np.array([0, 0, 1])
u = u / np.linalg.norm(u)

# Вычисление матрицы поворота с использованием ось-угол представления
K = np.array([[0, -u[2], u[1]],
              [u[2], 0, -u[0]],
              [-u[1], u[0], 0]])

R = np.eye(3) + np.sin(theta) * K + (1 - np.cos(theta)) * np.dot(K, K)

print("Матрица поворота (ось-угол):")
print(R)

3. Кватернионы

Математика: Кватернион для поворота на угол \(\theta\) вокруг оси \(\mathbf{u}\) задается как: \(q = \cos\left(\frac{\theta}{2}\right) + \mathbf{u} \sin\left(\frac{\theta}{2}\right)\) где \(\mathbf{u} = u_x \mathbf{i} + u_y \mathbf{j} + u_z \mathbf{k}\)

Код на Python:

import numpy as np

# Угол поворота в радианах
theta = np.radians(45)
# Ось вращения (нормализованный вектор)
u = np.array([0, 0, 1])
u = u / np.linalg.norm(u)

# Кватернион
w = np.cos(theta / 2)
x, y, z = u * np.sin(theta / 2)
q = np.array([w, x, y, z])

print("Кватернион:")
print(q)

# Преобразование кватерниона в матрицу поворота
q0, q1, q2, q3 = q
R = np.array([[1 - 2*(q2**2 + q3**2), 2*(q1*q2 - q0*q3), 2*(q1*q3 + q0*q2)],
              [2*(q1*q2 + q0*q3), 1 - 2*(q1**2 + q3**2), 2*(q2*q3 - q0*q1)],
              [2*(q1*q3 - q0*q2), 2*(q2*q3 + q0*q1), 1 - 2*(q1**2 + q2**2)]])

print("Матрица поворота из кватерниона:")
print(R)

Эти методы позволяют представлять и использовать повороты в различных приложениях, таких как компьютерная графика, робототехника и физическое моделирование.