104 lines
No EOL
5.8 KiB
Markdown
104 lines
No EOL
5.8 KiB
Markdown
# Кватернионы
|
||
|
||
Кватернионы - это гиперкомплексные числа, у которых имеется одна действительная
|
||
компонента и три комплексных компоненты:
|
||
|
||

|
||
|
||
Кватернион можно представлять по-разному, например, в виде кортежа
|
||
(последовательности) из четырёх чисел также как четырёхмерный вектор:
|
||
|
||

|
||
|
||
Можно представлять как пару из числа и трёхмерного вектора:
|
||
|
||

|
||
|
||
Кватернионы можно легко вывести из обычных комплексных чисел. Обычные
|
||
комлексные числа в качестве в качестве компонент имеют вещественные
|
||
числа *a* и *b*:
|
||
|
||

|
||
|
||
Но, что если представить, что компоненты *a* и *b* тоже комплексные
|
||
числа, но с другой мнимой единицей *j* вместо *i*, при этом
|
||
мнимая единица *j* имеет такие же свойства, что и *i*:
|
||
|
||

|
||
|
||
Тогда компоненты *a* и *b* можно представить следующим образом:
|
||
|
||

|
||
|
||
Если подставить их в формулу комплексного числа, то получается:
|
||
|
||

|
||
|
||
В этом выражении наиболее интересно произведение мнимых единиц *ij*. Если
|
||
представить, что произведение антикоммутативно, то у произведения
|
||
получаются интересные свойства.
|
||
|
||

|
||
|
||
Например, если взять квадрат произведения, то получается, что оно ведёт себя
|
||
как мнимая единица:
|
||
|
||

|
||
|
||
Таким образом, произведение мнимых единиц *ij* можно обозначить новой мнимой
|
||
единицей:
|
||
|
||

|
||
|
||
И тогда получается полноценный кватернион:
|
||
|
||

|
||
|
||
Кватернионы обладают массой интересных свойств и применений. В геометрии
|
||
основным применением является описание поворотов в трёхмерном пространстве.
|
||
|
||
Кватернионы, которые описывают поворот в трёхмерном пространстве называются
|
||
[версорами](./versor-rus.md).
|
||
|
||
## Реализация кватернионов в библиотеке
|
||
|
||
В библиотеке кватернионы реализованы как в виде обычных кватернионов, так и
|
||
в виде веросоров.
|
||
|
||
Главное отличие в том, что реализация версоров ориентирована именно для
|
||
представления поворотов в трёхмерном пространстве.
|
||
|
||
Версоры нельзя складывать, вычитать, что можно делать с кватернионами. Также
|
||
версоры нельзя умножать и делить на вещественные числа.
|
||
|
||
Но версоры можно комбинировать. Операция комбинирования версоров по является
|
||
обычным произведением кватернионов. Единственное отличие в том, что операция
|
||
комбинирования версоров обеспечивает, чтобы результат комбинации также был
|
||
версором, то есть, имел модуль, равный единицы.
|
||
|
||
Для описаия кватернионов есть две структуры:
|
||
|
||
typedef struct {
|
||
float s0, x1, x2, x3;
|
||
} BgFP32Quaternion;
|
||
|
||
typedef struct {
|
||
double s0, x1, x2, x3;
|
||
} BgFP64Quaternion;
|
||
|
||
|
||
Для описания версоров также имеется две структуры:
|
||
|
||
typedef struct {
|
||
const float s0, x1, x2, x3;
|
||
} BgFP32Versor;
|
||
|
||
typedef struct {
|
||
const double s0, x1, x2, x3;
|
||
} BgFP64Versor;
|
||
|
||
Уже в определении структур можно заметить разницу между в реализации
|
||
кватернионов и версоров: поля версоров объявлены как константы.
|
||
Это сделано намеренно, чтобы разработчик, использующий библиотеку мог считывать
|
||
данные из полей, но для изменения состояния версора прибегал к использованию
|
||
специальных функций, которые обеспечивают, чтобы модуль версора был равен 1. |