Документация: кватернионы и версоры / Documentation: quaternions and versors
This commit is contained in:
parent
48d5a010ec
commit
d906c8a8ae
3 changed files with 126 additions and 49 deletions
BIN
docs/documentation-eng.odt
Normal file
BIN
docs/documentation-eng.odt
Normal file
Binary file not shown.
94
docs/quaternion-eng.md
Normal file
94
docs/quaternion-eng.md
Normal file
|
@ -0,0 +1,94 @@
|
||||||
|
# Quaternions
|
||||||
|
|
||||||
|
If brief, quaternions are hypercompex numbers with one real component and three
|
||||||
|
complex components. Quaternions can be represented with formulas:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Where *q* is a quaternion, *w*, *x*, *y* and *z* are real numbers and *i*, *j*
|
||||||
|
and *k* are imaginary units.
|
||||||
|
|
||||||
|
Quaternions can be represented with several ways. For example, a quaternion can
|
||||||
|
be represented as a tuple of four real numbers:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
In that case a quaternion reminds a four-dimensional vector. And quaternions do
|
||||||
|
have many similar features as four-dimensional vectors do. For example:
|
||||||
|
|
||||||
|
* summation and subtraction of quaternions are same as for four-dimensional
|
||||||
|
vectors;
|
||||||
|
* multiplication and division of a quaternion at a real number are same
|
||||||
|
as for a four-dimensional vector;
|
||||||
|
* modulus of a quaternion is calculated the same way as for four-dimensional
|
||||||
|
vector.
|
||||||
|
|
||||||
|
But the product of two quaternions is comletely different result than the dot
|
||||||
|
product of two four-dimensional vectors.
|
||||||
|
|
||||||
|
Another way to represent a quaternion is a pair of a real number and
|
||||||
|
a three-dimensional vector:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Quaternions have many interesting features. In geometry, quaternions are used
|
||||||
|
to represent and combine rotations in three-dimensional Euclidean space.
|
||||||
|
|
||||||
|
Usually quaternions with unit modulus are used to represent rotations. Such
|
||||||
|
quaterions are named as [versors](./versor-eng.md).
|
||||||
|
|
||||||
|
## Implementation of quaternions in the library
|
||||||
|
|
||||||
|
There are two varians of implementation of quaternions in the library:
|
||||||
|
* quaternions
|
||||||
|
* versors
|
||||||
|
|
||||||
|
The main difference implementation of quaternions and versors is that
|
||||||
|
the versors are designed for representation of rotations in
|
||||||
|
the three-dimensional Euclidean space while quaternions are implemented in
|
||||||
|
a more general sense.
|
||||||
|
|
||||||
|
Versors are not possible to add and subtract. Versors cannot be mutiplied
|
||||||
|
or divided with a real number. But quaternions can be added and subtracted,
|
||||||
|
multiplied and divided with a number.
|
||||||
|
|
||||||
|
But versors can be combined. It is the same operation as multiplication of
|
||||||
|
two quaternions but the function of combination of two versors watches that
|
||||||
|
the resulting versor has modulus equal to 1.
|
||||||
|
|
||||||
|
All the functions which change the state of a versor keep the modulus of
|
||||||
|
a versor close to 1.
|
||||||
|
|
||||||
|
There two structural types for quaternions:
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
float s0, x1, x2, x3;
|
||||||
|
} BgFP32Quaternion;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
double s0, x1, x2, x3;
|
||||||
|
} BgFP64Quaternion;
|
||||||
|
|
||||||
|
|
||||||
|
And there are two strucutral types for versors:
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
const float s0, x1, x2, x3;
|
||||||
|
} BgFP32Versor;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
const double s0, x1, x2, x3;
|
||||||
|
} BgFP64Versor;
|
||||||
|
|
||||||
|
As you can see there is a difference in the definision of quaternions and
|
||||||
|
versors: the fields of versors are const while the fields of quaternions
|
||||||
|
are not const.
|
||||||
|
|
||||||
|
This was done intensionally to make a developer to use special functions for
|
||||||
|
versors to set the state of a versor instead of direct setting of
|
||||||
|
the field values because versor functions keep the modulus of a versor equal
|
||||||
|
to 1.
|
||||||
|
|
||||||
|
At the same time a developer can read the fields of a versor for his|her own
|
||||||
|
needs, for example, for saving a versor in a file or pass it via a network.
|
||||||
|
|
|
@ -5,60 +5,36 @@
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
Где *q* - это кватернион, *w*, *x*, *y* и *z* - это действительные числа, а *i*,
|
||||||
|
*j* и *k* - это мнимые единицы.
|
||||||
|
|
||||||
Кватернион можно представлять по-разному, например, в виде кортежа
|
Кватернион можно представлять по-разному, например, в виде кортежа
|
||||||
(последовательности) из четырёх чисел также как четырёхмерный вектор:
|
(последовательности) из четырёх чисел:
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
Можно представлять как пару из числа и трёхмерного вектора:
|
В такой форме кватернион напоминает четырёхмерный вектор. И кватернионы
|
||||||
|
действительно имеют ряд сходств с четрырёхмерными векторами, например:
|
||||||
|
|
||||||
|
* сложение и вычитание кватернионов такие же, как и у четырёхмерных векторов;
|
||||||
|
* умножение и деление кватериона на действительное число такие же как и для
|
||||||
|
четырёхмерного вектора;
|
||||||
|
* взятие модуля кватерниона вычисляется также как и для четырёхмерного вектора.
|
||||||
|
|
||||||
|
Но произведение кватернионов совершенно иное, чем скалярное произведение двух
|
||||||
|
четырёхмерных векторов.
|
||||||
|
|
||||||
|
Ещё одним способом представления кватерниона является пара из действительного
|
||||||
|
числа и трёхмерного вектора:
|
||||||
|
|
||||||

|

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

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

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

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

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

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

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

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

|
|
||||||
|
|
||||||
Кватернионы обладают массой интересных свойств и применений. В геометрии
|
Кватернионы обладают массой интересных свойств и применений. В геометрии
|
||||||
основным применением является описание поворотов в трёхмерном пространстве.
|
основным применением является описание поворотов в трёхмерном евклидовом
|
||||||
|
пространстве.
|
||||||
|
|
||||||
Кватернионы, которые описывают поворот в трёхмерном пространстве называются
|
Обычно для представления поворотов используются кватернионы с модулем, равным
|
||||||
[версорами](./versor-rus.md).
|
единице. Такие кватернионы называются [версорами](./versor-rus.md).
|
||||||
|
|
||||||
## Реализация кватернионов в библиотеке
|
## Реализация кватернионов в библиотеке
|
||||||
|
|
||||||
|
@ -98,7 +74,14 @@
|
||||||
} BgFP64Versor;
|
} BgFP64Versor;
|
||||||
|
|
||||||
Уже в определении структур можно заметить разницу между в реализации
|
Уже в определении структур можно заметить разницу между в реализации
|
||||||
кватернионов и версоров: поля версоров объявлены как константы.
|
кватернионов и версоров: поля версоров объявлены как константы, в то время как
|
||||||
Это сделано намеренно, чтобы разработчик, использующий библиотеку мог считывать
|
поля кватерниона не являются константами.
|
||||||
данные из полей, но для изменения состояния версора прибегал к использованию
|
|
||||||
специальных функций, которые обеспечивают, чтобы модуль версора был равен 1.
|
Это сделано намеренно, чтобы побудить разработчика использовать функции для
|
||||||
|
версоров, вместо того, чтобы задавать значения полей напрямую, потому что
|
||||||
|
функции версоров обеспечивают, чтобы модуль версора был равен единице.
|
||||||
|
|
||||||
|
В то же время, разработчик может обращаться к полям версора, чтобы получить
|
||||||
|
значения этих полей для своих целей, например, чтобы сохранить значение
|
||||||
|
версора в файле или передать по сети.
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue