Добавлена вводная статья по версорам в документации

This commit is contained in:
Andrey Pokidov 2024-11-23 04:04:29 +07:00
parent 3932f83720
commit 5c80084b1e
3 changed files with 112 additions and 2 deletions

55
docs/english/Versor.md Normal file
View file

@ -0,0 +1,55 @@
# Versors
Quaternions are complex numbers which have one real component and three
imaginary components.
A quaternion can be viewed as a four-dimensional vector:
1. summation and subtraction of quaternions are same as for four-dimensional
vectors in Euclidean space;
2. quaternions can be multiplied by real numbers the same way as four-
dimensional vectors;
3. the modulus of a quaternion is calculated in exactly the same way as
the modulus of a vector in four-dimensional Euclidean space;
4. the multiplication of two quaternions can be represented as the product
of a 4x4 matrix and a four-dimensional vector.
A quaternion has four degrees of freedom. But if we introduce a constraint in
the form of a requirement that the modulus of this quaternion be equal to one,
then such a set of quaternions will have only three degrees of freedom.
These quaternions represent a sphere of radius 1 in four-dimensional space.
The "surface" of this sphere has a dimension equal to three.
Quaternions of unit length describe rotations in three-dimensional space very
well. And this is logical, because rotations in three-dimensional space have
three degrees of freedom, just like a sphere in four-dimensional space.
There is a special name for a quaternion of unit length: versor.
Versors are quaternions of unit length.
## Implementation of versors in the library
The library has a separate implementation for versors in the form of special
structures and a set of functions that keep the modulus of a versorclose to one.
There are two structures for versors: **BgFP32Versor** and **BgFP64Versor**:
typedef struct {
const float s0, x1, x2, x3;
} BgFP32Versor;
typedef struct {
const double s0, x1, x2, x3;
} BgFP64Versor;
The fields are deliberately declared const so that a developer using these
structures is not tempted to change the values of the fields directly.
With these structures, it is better to use special functions that allow you
to save new values in the structure fields of **BgFP32Versor** and
**BgFP64Versor**.