# Кватернионы Кватернионы - это гиперкомплексные числа, у которых имеется одна действительная компонента и три комплексных компоненты: ![Определение кватерниона](./media/quaternion_definition.png) Кватернион можно представлять по-разному, например, в виде кортежа (последовательности) из четырёх чисел также как четырёхмерный вектор: ![Кватернион-кортеж](./media/quaternion_vector4_form.png) Можно представлять как пару из числа и трёхмерного вектора: ![Кватернион как число и вектор](./media/quaternion_mixed_form.png) Кватернионы можно легко вывести из обычных комплексных чисел. Обычные комлексные числа в качестве в качестве компонент имеют вещественные числа *a* и *b*: ![Определение комплексного числа](./media/compex_number_000.png) Но, что если представить, что компоненты *a* и *b* тоже комплексные числа, но с другой мнимой единицей *j* вместо *i*, при этом мнимая единица *j* имеет такие же свойства, что и *i*: ![Комплексная единица j](./media/imaginary_j.png) Тогда компоненты *a* и *b* можно представить следующим образом: ![Комплексные компоненты](./media/compex_number_001.png) Если подставить их в формулу комплексного числа, то получается: ![Гиперкомплексное число](./media/compex_number_002.png) В этом выражении наиболее интересно произведение мнимых единиц *ij*. Если представить, что произведение антикоммутативно, то у произведения получаются интересные свойства. ![Антикоммутативность](./media/imaginary_anticommutative.png) Например, если взять квадрат произведения, то получается, что оно ведёт себя как мнимая единица: ![Квадрат произведения](./media/imaginary_anticommutative2.png) Таким образом, произведение мнимых единиц *ij* можно обозначить новой мнимой единицей: ![Новая мнимая единица](./media/imaginary_k.png) И тогда получается полноценный кватернион: ![Кватернион](./media/quaternion_result.png) Кватернионы обладают массой интересных свойств и применений. В геометрии основным применением является описание поворотов в трёхмерном пространстве. Кватернионы, которые описывают поворот в трёхмерном пространстве называются [версорами](./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.