Улучшение документации по кватернионам и версорам

This commit is contained in:
Andrey Pokidov 2025-02-07 23:46:30 +07:00
parent a3ff67792d
commit 72b6690ad6
4 changed files with 92 additions and 165 deletions

View file

@ -1,70 +1,35 @@
# Кватернионы
Кватернионы - это гиперкомплексные числа, у которых имеется одна действительная
компонента и три комплексных компоненты:
Кватернионы — это гиперкомплексные числа, которые расширяют понятие комплексных чисел. Они состоят из одной действительной компоненты и трёх мнимых компонент:
![Определение кватерниона](./media/quaternion_definition.png)
q = w + ix + jy + kz
Где *q* - это кватернион, *w*, *x*, *y* и *z* - это действительные числа, а *i*,
*j* и *k* - это мнимые единицы.
где:
Кватернион можно представлять по-разному, например, в виде кортежа
(последовательности) из четырёх чисел:
- w, x, y, z ∈ R - действительные числа
- i, j, k - мнимые единицы, удовлетворяющие следующим условиям:
- i<sup>2</sup> = j<sup>2</sup> = k<sup>2</sup> = ijk = -1
![Кватернион-кортеж](./media/quaternion_vector4_form.png)
В такой форме кватернион напоминает четырёхмерный вектор. И кватернионы
действительно имеют ряд сходств с четрырёхмерными векторами, например:
* сложение и вычитание кватернионов такие же, как и у четырёхмерных векторов;
* умножение и деление кватериона на действительное число такие же как и для
четырёхмерного вектора;
* взятие модуля кватерниона вычисляется также как и для четырёхмерного вектора.
Но произведение кватернионов совершенно иное, чем скалярное произведение двух
четырёхмерных векторов.
Ещё одним способом представления кватерниона является пара из действительного
числа и трёхмерного вектора:
![Кватернион как число и вектор](./media/quaternion_mixed_form.png)
Кватернионы обладают массой интересных свойств и применений. В геометрии
основным применением является описание поворотов в трёхмерном евклидовом
пространстве.
Обычно для представления поворотов используются кватернионы с модулем, равным
единице. Такие кватернионы называются [версорами](./versor-rus.md).
Кватернионы были открыты математиком Уильямом Гамильтоном и представлены публике в 1843 году. Они нашли широкое применение в компьютерной графике, робототехнике и физике для описания поворотов в трёхмерном пространстве.
## Реализация кватернионов в библиотеке
В библиотеке кватернионы реализованы в двух вариантах:
* в виде обычных кватернионов
* в виде веросоров
Библиотека предоставляет две реализации кватернионов:
1. **Кватернионы общего назначения**
- Поддерживают все основные операции (сложение, вычитание, умножение на скаляр и т.д.).
Главное отличие в реализации кватернионов и версоров том, что реализация
версоров ориентирована именно для представления поворотов в трёхмерном
евклидовом пространстве пространстве, в то время как кватернионы имеют более
общую реализацию.
2. **Версоры**:
- Специализированные кватернионы, модуль которых всегда равен единице.
- Подходят для описания поворотов в трёхмерном пространстве.
- Не поддерживают операции сложения, вычитания и умножения на скаляр.
Версоры нельзя складывать, вычитать. Также версоры нельзя умножать и делить на
вещественные числа. Но кватернионы можно складывать, вычитать, а также умножать
и делить на вещественное число.
Кватернионы общего назначения также можно использовать для представления поворотов в трёхмерном пространстве. Но разработчик, использующий кватернионы для описания поворотов, сам должен следить за тем, чтобы модули кватернионов не становились меньше величины погрешности и не принимали значение NaN (не число).
Версоры можно комбинировать. Операция комбинирования версоров является обычным
произведением кватернионов. Единственное отличие в том, что операция
комбинирования версоров обеспечивает, чтобы результат комбинации также имел
модуль, равный единицы.
### Структуры для кватернионов
Все функции версоров, которые менияют состояние версора, обеспечивают, чтобы
модуль версора оставался близким к единице.
Да, модуль версора очень близок к единице, потому что числа с плавающей запятой
не совершенны и имеют небольшие погрешности. Поэтому модуль не всегда равен
единице, но очень близок к единице.
Для описаия кватернионов есть две структуры:
#### Кватернионы общего назначения
```c
typedef struct {
float s0, x1, x2, x3;
} BgcQuaternionFP32;
@ -72,10 +37,11 @@
typedef struct {
double s0, x1, x2, x3;
} BgcQuaternionFP64;
```
#### Версоры
Для описания версоров также имеется две структуры:
```c
typedef struct {
const float s0, x1, x2, x3;
} BgcVersorFP32;
@ -83,17 +49,12 @@
typedef struct {
const double s0, x1, x2, x3;
} BgcVersorFP64;
```
Уже в определении структур можно заметить разницу между в реализации
кватернионов и версоров: поля версоров объявлены как константы, в то время как
поля кватерниона не являются константами.
Поля:
- s0 - это вещественная часть версора.
- x1, x2, x3 - Мнимые компоненты версора.
Это сделано намеренно, чтобы побудить разработчика использовать функции для
версоров, вместо того, чтобы задавать значения полей напрямую, потому что
функции версоров обеспечивают, чтобы модуль версора был равен единице.
В то же время, разработчик может обращаться к полям версора, чтобы получить
значения этих полей для своих целей, например, чтобы сделать какие-либо
вычисления или сохранить состояние версора в файле, или передать версор через
подключение по компьютерной сети.
Поля версоров объявлены как const, чтобы разработчик использовал функции библиотеки для работы с версорами, а не изменял их напрямую.
Поля кватернионов разработчик, использующий библиотеку, может менять свободно.