Документация: кватернионы и версоры / Documentation: quaternions and versors

This commit is contained in:
Andrey Pokidov 2024-11-25 15:41:10 +07:00
parent 48d5a010ec
commit d906c8a8ae
3 changed files with 126 additions and 49 deletions

View file

@ -5,60 +5,36 @@
![Определение кватерниона](./media/quaternion_definition.png)
Где *q* - это кватернион, *w*, *x*, *y* и *z* - это действительные числа, а *i*,
*j* и *k* - это мнимые единицы.
Кватернион можно представлять по-разному, например, в виде кортежа
(последовательности) из четырёх чисел также как четырёхмерный вектор:
(последовательности) из четырёх чисел:
![Кватернион-кортеж](./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).
Обычно для представления поворотов используются кватернионы с модулем, равным
единице. Такие кватернионы называются [версорами](./versor-rus.md).
## Реализация кватернионов в библиотеке
@ -98,7 +74,14 @@
} BgFP64Versor;
Уже в определении структур можно заметить разницу между в реализации
кватернионов и версоров: поля версоров объявлены как константы.
Это сделано намеренно, чтобы разработчик, использующий библиотеку мог считывать
данные из полей, но для изменения состояния версора прибегал к использованию
специальных функций, которые обеспечивают, чтобы модуль версора был равен 1.
кватернионов и версоров: поля версоров объявлены как константы, в то время как
поля кватерниона не являются константами.
Это сделано намеренно, чтобы побудить разработчика использовать функции для
версоров, вместо того, чтобы задавать значения полей напрямую, потому что
функции версоров обеспечивают, чтобы модуль версора был равен единице.
В то же время, разработчик может обращаться к полям версора, чтобы получить
значения этих полей для своих целей, например, чтобы сохранить значение
версора в файле или передать по сети.