80 lines
5.6 KiB
Markdown
80 lines
5.6 KiB
Markdown
# Версоры
|
||
|
||
[Кватернионы](./quaternion-rus.md) - это гиперкомплексные числа, у которых имеется одна действительная компонента и три мнимых компоненты:
|
||
|
||
q = w + ix + jy + kz, где w - действительная компонена, x, y, z - мнимые компоненты, а i, j, k - мнимые единицы
|
||
|
||
i<sup>2</sup> = j<sup>2</sup> = k<sup>2</sup> = ijk = -1
|
||
|
||
w, x, y, z ∈ R
|
||
|
||
Кватернионы были открыты математиком Уильямом Гамильтоном и представлены публике в 1843 году. Позже Гамильтон предложил особый класс кватернионов, которые назвал версорами.
|
||
|
||
## Что такое версор?
|
||
|
||
Версор - это кватернион, модуль которого равен единице. То есть, к формулам, определяющим кватернионы, необходимо добавить условие, что модуль кватерниона равен единице.
|
||
|
||
К формулам, определяющим кватернион достаточно добавить уравнение равенства модуля единице:
|
||
|
||
q = w + ix + jy + kz
|
||
|
||
i<sup>2</sup> = j<sup>2</sup> = k<sup>2</sup> = -1
|
||
|
||
w, x, y, z ∈ R
|
||
|
||
w<sup>2</sup> + x<sup>2</sup> + y<sup>2</sup> + z<sup>2</sup> = 1
|
||
|
||
Название происходит от латинского глагола "versare", означающего "поворачивать", "вращать", к которому добавлено латинское окончание -or, обозначающее субъект, выполняющий действие. Дословно латинское слово "versor" можно перевести как "вращатель" или "поворачиватель".
|
||
|
||
## Применение версоров
|
||
|
||
Версоры оказались отличным инструментом для описания поворотов в трёхмерном пространстве. Для комбинации двух последовательных поворотов полезной оказалась операция умножения кватернионов, а для получения обратного поворота - операция взятия сопряжённого кватерниона.
|
||
|
||
При умножении двух версоров (кватернионов единичной длины) и при взятии сопряжённого версора результат также будет версором, то есть кватернионом единичной длины.
|
||
|
||
Сложение и вычитание двух кватернионов, а также умножение и деление кватерниона на число оказались не нужны для описания поворотов в трёхмерном пространстве.
|
||
|
||
Несмотря на то, что версоры как класс кватернионов были предложены ещё Уильямом Гамильтоном для описаний поворотов ещё в середине 19 века, в русскоязычной литературе термин "версор" встречается настолько редко, что можно сказать, что не употребляется.
|
||
|
||
## Преимущества версоров
|
||
|
||
1. **Сохранение модуля**: Версоры сохраняют модуль, равный единице, что предотвращает их вырождение.
|
||
2. **Эффективность**: Библиотека BGC автоматически нормализует версоры только при необходимости, что позволяет избежать лишних вычислений.
|
||
|
||
## Реализация в библиотеке BGC
|
||
|
||
Библиотека BGC предоставляет отдельную реализацию для версоров в виде структур и функций, которые поддерживают модуль версоров близким к единице.
|
||
|
||
### Структуры
|
||
|
||
```c
|
||
typedef struct {
|
||
const float s0, x1, x2, x3;
|
||
} BgcVersorFP32;
|
||
|
||
typedef struct {
|
||
const double s0, x1, x2, x3;
|
||
} BgcVersorFP64;
|
||
```
|
||
|
||
- s0 - это вещественная часть версора.
|
||
- x1, x2, x3 - Мнимые компоненты версора.
|
||
|
||
## Операции с версорами
|
||
|
||
- [Сброс состояния (reset)](./versor-reset-rus.md)
|
||
- [Указание значений компонент (set values)](./versor-set-values-rus.md)
|
||
- Копирование значений компонент (copy)
|
||
- Обмен значений компонент (swap)
|
||
- Построение на основе поворота (set turn)
|
||
- Проверка на отсутствие поворота (is idle)
|
||
- Преобразование типа (convert)
|
||
- Сокращение поворота (shorten)
|
||
- Инверсия (invert)
|
||
- Комбинирование (combine)
|
||
- Получение описание поворота (get rotation)
|
||
- Получение матрицы поворота (get rotation matrix)
|
||
- Получение матрицы обратного поворота (get reverse matrix)
|
||
- Поворот вектора (turn vector)
|
||
- Обратный поворот вектора (turn vector back)
|
||
- Сравнение (are close)
|