bgc-c/docs/quaternion-rus.md

5.3 KiB
Raw Blame History

Кватернионы

Кватернионы - это гиперкомплексные числа, у которых имеется одна действительная компонента и три комплексных компоненты:

Определение кватерниона

Где q - это кватернион, w, x, y и z - это действительные числа, а i, j и k - это мнимые единицы.

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

Кватернион-кортеж

В такой форме кватернион напоминает четырёхмерный вектор. И кватернионы действительно имеют ряд сходств с четрырёхмерными векторами, например:

  • сложение и вычитание кватернионов такие же, как и у четырёхмерных векторов;
  • умножение и деление кватериона на действительное число такие же как и для четырёхмерного вектора;
  • взятие модуля кватерниона вычисляется также как и для четырёхмерного вектора.

Но произведение кватернионов совершенно иное, чем скалярное произведение двух четырёхмерных векторов.

Ещё одним способом представления кватерниона является пара из действительного числа и трёхмерного вектора:

Кватернион как число и вектор

Кватернионы обладают массой интересных свойств и применений. В геометрии основным применением является описание поворотов в трёхмерном евклидовом пространстве.

Обычно для представления поворотов используются кватернионы с модулем, равным единице. Такие кватернионы называются версорами.

Реализация кватернионов в библиотеке

В библиотеке кватернионы реализованы как в виде обычных кватернионов, так и в виде веросоров.

Главное отличие в том, что реализация версоров ориентирована именно для представления поворотов в трёхмерном пространстве.

Версоры нельзя складывать, вычитать, что можно делать с кватернионами. Также версоры нельзя умножать и делить на вещественные числа.

Но версоры можно комбинировать. Операция комбинирования версоров по является обычным произведением кватернионов. Единственное отличие в том, что операция комбинирования версоров обеспечивает, чтобы результат комбинации также был версором, то есть, имел модуль, равный единицы.

Для описаия кватернионов есть две структуры:

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;

Уже в определении структур можно заметить разницу между в реализации кватернионов и версоров: поля версоров объявлены как константы, в то время как поля кватерниона не являются константами.

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

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