Улучшение документации

This commit is contained in:
Andrey Pokidov 2025-02-07 22:43:32 +07:00
parent b5aa39c145
commit c7e39e1527
13 changed files with 439 additions and 239 deletions

View file

@ -1,71 +1,51 @@
# Версоры
[Кватернионы](./quaternion-rus.md) - это гиперкомплексные числа, у которых
имеется одна действительная компонента и три комплексных компоненты:
[Кватернионы](./quaternion-rus.md) - это гиперкомплексные числа, у которых имеется одна действительная компонента и три мнимых компоненты:
![Определение кватерниона](./media/quaternion_definition.png)
![Формулы определяющие кватернион](./media/quaternion_definition.png)
Кватернион имеет четыре степени свободы. Но если ввести ограничение в виде
требования, чтобы модуль этого кватерниона был равен единице, то такое множество
кватернионов будет иметь только три степени свободы.
q = w + ix + jy + kz
i<sup>2</sup> = j<sup>2</sup> = k<sup>2</sup> = -1
Эти кватернионы представляют собой сферу радиуса 1 в четырёхмерном пространстве.
"Поверхность" этой сферы имеет размерность равную трём.
Кватернионы были открыты математиком Уильямом Гамильтоном и представлены публике в 1843 году.
Кватернионы единичной длины очень хорошо описывают повороты в трёхмерном
пространстве. Вращения в трёхмерном пространстве имеют три степени свободы,
что совпадает с размерностю поверхности сферы в четырёхмерном пространстве.
Вское Уильям Гамильтон предложил особый класс кватернионов, которые назвал версорами.
Для кватерниона единичной длины существует специальное название: **версор**.
Версор - это кватернион, модуль которого равен единице. То есть, к формулам, определяющим квартернионы, необходимо добавить услвие, что модуль кватериона равен единице.
**Версоры** - это кватернионы единичной длины. К определению кватерниона
необходимо просто добавить одно уравнение:
![Формулы определяющие версор](./media/versor_definition.png)
![Определение версора](./media/versor_definition.png)
Название происходит от латинского глагола "versare", означаюшего "поворачивать", "вращать", к которому добавлено латнское окончание -or, которое обозначает субъект, выполняющий действие.
Несмотря на то, что версоны как класс кватернионов были предложены ещё Уильямом
Гамильтоном для описаний поворотв, в русскоязычной литературе термин "версор",
можно сказать, что не употребляется.
Дословно латинское слово "versor" можно перевести как "вращатель" или "поворачиватель".
Версоры оказались довольно хорошим инструментом для описания поворотов в трёхмерном пространстве.
Для комбинации двух последовательных поворотов оказалось полезной операция умножения кватернионов, а для получения обратного поворота - операция получения сопряжённого кватерниона.
При умножении двух версоров (кватернионов единичной длины) и при взятии сопряжённого версора результат также будет версором, то есть кватернионом единичной длины.
Сложение и вычитание двух кватернионов, а также умножение и деление кватерниона на число оказались не нужны для описания поворотов в трёхмерном пространстве.
Несмотря на то, что версоры как класс кватернионов были предложены ещё Уильямом Гамильтоном для описаний поворотов ещё в середине 19 века, в русскоязычной литературе термин "версор" встречается настолько редко, что можно сказать, что не употребляется.
## Преимущества версоров над кватернионами
Основным преимуществом версоров заключается в том, что они не деградируют.
Главным преимуществом выделения версоров как отдельной от кватернионов абстрации заключается в том, что версоры сохраняют модуль равный единице, то есть, версоры не вырождаются.
Если умножить два кватерниона, модули которых равны единице, то результатом
будет также кватернион с модулем, равным единице. В то время как произведение
двух кватернионов, у которых модули отличаются от единицы, даст кватернион,
модуль которого, скорее всего, также будет отличаться от единицы. А произведение
ряда кватернионов может дать кватернион, у которого модуль будет близок к нулю.
Кватернионы, модуль которых не равен единице в результате множества операций умножения могут дать кватернион, модуль которого может оказаться настолко близок к нулю, что будет сопоставим с величиной погрешности.
Таком образом, модуль версора всегда равен единице в отличие от обычного
кватерниона.
На практике модуль версора не всегда равен единице, но близок к единице из-за наличия погрешности типов **float** и **double** (**binary32** и **binary64**). Но функции библиотеки BGC обеспечивают, чтобы модуль веросра, полученного в результате некоторой операции, не отколнялся от единицы на величину не превышающую заданную погрешность.
На практике модуль веросна не всегда равен единице, но близок к единице из-за
наличия погрешности типов **float** и **double** (**binary32** и **binary64**).
И это является вторым преимуществом применения именно версоров для описания поворотов. Разработчику, который использует библиотеку, не нужно производить нормализацию, как это пришлось бы делать с обычными кватернионами.
Вторым преимуществом версоров в том, что функции библиотеки берут на себя
задачу поддержания модуля версора, чтобы оно не сильно отклонялось от единицы.
Но функции библиотеки не всегда производят нормализацию версоров, а только тогда, когда это необходимо. Функции библиотеки нормализуют полученный версор только тогда, когда модуль версора отклоняется от единицы больше, чем на предопределенную величину погрешности (эпсилон).
Таким образом, разработчику не нужно производить нормализацию, как это пришлось
бы делать с обычными кватернионами.
Третьим преимуществом версоров является то, что функции библиотеки не всегда
производят нормализацию версоров, а только тогда, когда это необходимо.
Функции библиотеки проверяют разницу между модулем версора и единицей, и только
больше предопределенного порога (эпсилон), функция нормализует полученный
версор.
В большинстве случаев, когда входные параметры являются версорами
(нормализованными кватернионами), нет необходимости нормализовать результат
функции. Таким образом, можно избежать трудоемких операций, таких как вычисление
квадратных корней и деление. Такой подход позволяет повысить производительность
и поддерживать версоры нормализованными.
В большинстве случаев, когда входные параметры являются версорами (нормализованными кватернионами), модуль полученного версора также не сильно отклоняется от единицы, а потому нет необходимости производить нормализацию. Таким образом, можно избежать трудоемких операций, таких как вычисление квадратных корней и деление. Такой подход позволяет повысить производительность и поддерживать версоры нормализованными.
## Версоры в библиотеке
Библиотека имеет отдельную реализацию для версоров в виде специальных структур и
набора функций, которые поддерживают модуль версоров близким к единице.
Библиотека имеет отдельную реализацию для версоров в виде специальных структур и набора функций, которые поддерживают модуль версоров близким к единице, посольку необходимо поддерживать модуль веросоров близким к единице, а также версорам не нужны сложение и вычитание, а также умножение и деление на число.
Для описания версора имеется две структуры:
@ -77,19 +57,16 @@
const double s0, x1, x2, x3;
} BgcVersorFP64;
Поля структур намеренно объявлены констрантными (const), чтобы побудить
разработчика использовать функции работы с версорами, вместо того, чтобы
непосредственно задавать значения полей. Функции работы с версорами поддерживают
модуль версора равным единицы.
Поле **s0** вещественной частю версора (нормализованного кватерниона), а поля **x1**, **x2** и **x3** являются мнимыми компонентами версора.
С данными структурами лучше использовать специальные функции, которые позволяют
устанавливать новые значения в поля структур **BgcVersorFP32** и
**BgcVersorFP64**.
Поля структур намеренно объявлены констрантными (const), чтобы побудить разработчика использовать функции работы с версорами, вместо того, чтобы непосредственно задавать значения полей. Функции отвечающие за операции над версорами поддерживают модуль полученных версоров равным единице.
С данными структурами лучше использовать специальные функции, которые позволяют устанавливать новые значения в поля структур **BgcVersorFP32** и **BgcVersorFP64**.
## Операции с версорами
- Сброс состояния (reset)
- Указание значений компонент (set values)
- [Сброс состояния (reset)](./versor-reset-rus.md)
- [Указание значений компонент (set values)](./versor-set-values-rus.md)
- Копирование значений компонент (copy)
- Обмен значений компонент (swap)
- Построение на основе поворота (set turn)