Улучшение документации
This commit is contained in:
parent
b5aa39c145
commit
c7e39e1527
13 changed files with 439 additions and 239 deletions
|
@ -1,71 +1,51 @@
|
|||
# Версоры
|
||||
|
||||
[Кватернионы](./quaternion-rus.md) - это гиперкомплексные числа, у которых
|
||||
имеется одна действительная компонента и три комплексных компоненты:
|
||||
[Кватернионы](./quaternion-rus.md) - это гиперкомплексные числа, у которых имеется одна действительная компонента и три мнимых компоненты:
|
||||
|
||||

|
||||

|
||||
|
||||
Кватернион имеет четыре степени свободы. Но если ввести ограничение в виде
|
||||
требования, чтобы модуль этого кватерниона был равен единице, то такое множество
|
||||
кватернионов будет иметь только три степени свободы.
|
||||
q = w + ix + jy + kz
|
||||
i<sup>2</sup> = j<sup>2</sup> = k<sup>2</sup> = -1
|
||||
|
||||
Эти кватернионы представляют собой сферу радиуса 1 в четырёхмерном пространстве.
|
||||
"Поверхность" этой сферы имеет размерность равную трём.
|
||||
Кватернионы были открыты математиком Уильямом Гамильтоном и представлены публике в 1843 году.
|
||||
|
||||
Кватернионы единичной длины очень хорошо описывают повороты в трёхмерном
|
||||
пространстве. Вращения в трёхмерном пространстве имеют три степени свободы,
|
||||
что совпадает с размерностю поверхности сферы в четырёхмерном пространстве.
|
||||
Вское Уильям Гамильтон предложил особый класс кватернионов, которые назвал версорами.
|
||||
|
||||
Для кватерниона единичной длины существует специальное название: **версор**.
|
||||
Версор - это кватернион, модуль которого равен единице. То есть, к формулам, определяющим квартернионы, необходимо добавить услвие, что модуль кватериона равен единице.
|
||||
|
||||
**Версоры** - это кватернионы единичной длины. К определению кватерниона
|
||||
необходимо просто добавить одно уравнение:
|
||||

|
||||
|
||||

|
||||
Название происходит от латинского глагола "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)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue