Улучшение документации
This commit is contained in:
parent
c7e39e1527
commit
a3ff67792d
2 changed files with 57 additions and 60 deletions
|
@ -2,26 +2,33 @@
|
|||
|
||||
[Кватернионы](./quaternion-rus.md) - это гиперкомплексные числа, у которых имеется одна действительная компонента и три мнимых компоненты:
|
||||
|
||||

|
||||
q = w + ix + jy + kz, где w - действительная компонена, x, y, z - мнимые компоненты, а i, j, k - мнимые единицы
|
||||
|
||||
q = w + ix + jy + kz
|
||||
i<sup>2</sup> = j<sup>2</sup> = k<sup>2</sup> = -1
|
||||
i<sup>2</sup> = j<sup>2</sup> = k<sup>2</sup> = ijk = -1
|
||||
|
||||
Кватернионы были открыты математиком Уильямом Гамильтоном и представлены публике в 1843 году.
|
||||
w, x, y, z ∈ R
|
||||
|
||||
Вское Уильям Гамильтон предложил особый класс кватернионов, которые назвал версорами.
|
||||
Кватернионы были открыты математиком Уильямом Гамильтоном и представлены публике в 1843 году. Позже Гамильтон предложил особый класс кватернионов, которые назвал версорами.
|
||||
|
||||
Версор - это кватернион, модуль которого равен единице. То есть, к формулам, определяющим квартернионы, необходимо добавить услвие, что модуль кватериона равен единице.
|
||||
## Что такое версор?
|
||||
|
||||

|
||||
Версор - это кватернион, модуль которого равен единице. То есть, к формулам, определяющим кватернионы, необходимо добавить условие, что модуль кватерниона равен единице.
|
||||
|
||||
Название происходит от латинского глагола "versare", означаюшего "поворачивать", "вращать", к которому добавлено латнское окончание -or, которое обозначает субъект, выполняющий действие.
|
||||
К формулам, определяющим кватернион достаточно добавить уравнение равенства модуля единице:
|
||||
|
||||
Дословно латинское слово "versor" можно перевести как "вращатель" или "поворачиватель".
|
||||
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" можно перевести как "вращатель" или "поворачиватель".
|
||||
|
||||
## Применение версоров
|
||||
|
||||
Версоры оказались отличным инструментом для описания поворотов в трёхмерном пространстве. Для комбинации двух последовательных поворотов полезной оказалась операция умножения кватернионов, а для получения обратного поворота - операция взятия сопряжённого кватерниона.
|
||||
|
||||
При умножении двух версоров (кватернионов единичной длины) и при взятии сопряжённого версора результат также будет версором, то есть кватернионом единичной длины.
|
||||
|
||||
|
@ -29,26 +36,18 @@
|
|||
|
||||
Несмотря на то, что версоры как класс кватернионов были предложены ещё Уильямом Гамильтоном для описаний поворотов ещё в середине 19 века, в русскоязычной литературе термин "версор" встречается настолько редко, что можно сказать, что не употребляется.
|
||||
|
||||
## Преимущества версоров над кватернионами
|
||||
## Преимущества версоров
|
||||
|
||||
Главным преимуществом выделения версоров как отдельной от кватернионов абстрации заключается в том, что версоры сохраняют модуль равный единице, то есть, версоры не вырождаются.
|
||||
1. **Сохранение модуля**: Версоры сохраняют модуль, равный единице, что предотвращает их вырождение.
|
||||
2. **Эффективность**: Библиотека BGC автоматически нормализует версоры только при необходимости, что позволяет избежать лишних вычислений.
|
||||
|
||||
Кватернионы, модуль которых не равен единице в результате множества операций умножения могут дать кватернион, модуль которого может оказаться настолко близок к нулю, что будет сопоставим с величиной погрешности.
|
||||
## Реализация в библиотеке BGC
|
||||
|
||||
На практике модуль версора не всегда равен единице, но близок к единице из-за наличия погрешности типов **float** и **double** (**binary32** и **binary64**). Но функции библиотеки BGC обеспечивают, чтобы модуль веросра, полученного в результате некоторой операции, не отколнялся от единицы на величину не превышающую заданную погрешность.
|
||||
Библиотека BGC предоставляет отдельную реализацию для версоров в виде структур и функций, которые поддерживают модуль версоров близким к единице.
|
||||
|
||||
И это является вторым преимуществом применения именно версоров для описания поворотов. Разработчику, который использует библиотеку, не нужно производить нормализацию, как это пришлось бы делать с обычными кватернионами.
|
||||
|
||||
Но функции библиотеки не всегда производят нормализацию версоров, а только тогда, когда это необходимо. Функции библиотеки нормализуют полученный версор только тогда, когда модуль версора отклоняется от единицы больше, чем на предопределенную величину погрешности (эпсилон).
|
||||
|
||||
В большинстве случаев, когда входные параметры являются версорами (нормализованными кватернионами), модуль полученного версора также не сильно отклоняется от единицы, а потому нет необходимости производить нормализацию. Таким образом, можно избежать трудоемких операций, таких как вычисление квадратных корней и деление. Такой подход позволяет повысить производительность и поддерживать версоры нормализованными.
|
||||
|
||||
## Версоры в библиотеке
|
||||
|
||||
Библиотека имеет отдельную реализацию для версоров в виде специальных структур и набора функций, которые поддерживают модуль версоров близким к единице, посольку необходимо поддерживать модуль веросоров близким к единице, а также версорам не нужны сложение и вычитание, а также умножение и деление на число.
|
||||
|
||||
Для описания версора имеется две структуры:
|
||||
### Структуры
|
||||
|
||||
```c
|
||||
typedef struct {
|
||||
const float s0, x1, x2, x3;
|
||||
} BgcVersorFP32;
|
||||
|
@ -56,12 +55,10 @@
|
|||
typedef struct {
|
||||
const double s0, x1, x2, x3;
|
||||
} BgcVersorFP64;
|
||||
```
|
||||
|
||||
Поле **s0** вещественной частю версора (нормализованного кватерниона), а поля **x1**, **x2** и **x3** являются мнимыми компонентами версора.
|
||||
|
||||
Поля структур намеренно объявлены констрантными (const), чтобы побудить разработчика использовать функции работы с версорами, вместо того, чтобы непосредственно задавать значения полей. Функции отвечающие за операции над версорами поддерживают модуль полученных версоров равным единице.
|
||||
|
||||
С данными структурами лучше использовать специальные функции, которые позволяют устанавливать новые значения в поля структур **BgcVersorFP32** и **BgcVersorFP64**.
|
||||
- s0 - это вещественная часть версора.
|
||||
- x1, x2, x3 - Мнимые компоненты версора.
|
||||
|
||||
## Операции с версорами
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue