Skip to content

Instantly share code, notes, and snippets.

@Lakret
Created October 3, 2012 06:08
Show Gist options
  • Save Lakret/3825333 to your computer and use it in GitHub Desktop.
Save Lakret/3825333 to your computer and use it in GitHub Desktop.
Quaternions
// Кватернионы — это гиперкомплексные числа, предложенные Гамильтоном в 1843 году.
// Кватернионы с операциями на них образуют алгебраическую структуру, называемую "телом" или "кольцом с делением" (division ring) ℍ.
// Такие алгебраические структуры отличаются от привычных нам полей (например, поля действительных чисел ℝ) тем,
// что умножение в них некоммутативно, т.е. для кватернионов справедливо a * b =/= b * a.
// Кватернионы очень удобны для записи вращений в трёхмерном пространстве, поэтому они нашли широкое применение в механике,
// 3D-графике и компьютерном зрении.
// В этом упражнении вы должны будете создать тип, представляющий кватернионы.
// Этот тип будет размеченным объединением, т.к. мы можем по-разному определить кватернионы.
// Например, определение 1:
// — кватернион можно определить как сумму a + b*i + c*j + d*k, где a, b, c и d — вещественные числа
// а i, j и k — мнимые единицы со св-вом i^2 = j^2 = k^2 = i*j*k = -1.
// Тогда мы можем записать первый конструктор переменной так:
type Quaternion =
| FourReals of float * float * float * float
// — кватернион — это упорядоченная пара комплексных чисел ((a + bi), (c + di))
| PairOfComplex of Complex * Complex
// — кватернион — это вещественная матрица вида
// | a -b -c -d |
// | b a -d c |
// | c d a -b |
// | d -c b a |
// (используйте тип float [,] как параметр в конструкторе переменной.
// К сожалению, мы не можем задать размерности массива в типе. Столь мощные системы типизации существуют, но они крайне редки на сегодняшний день.
| RealMatrix of float [,]
// — кватернион — это комплексная матрица вида
// | ( a + bi) (c + di) |
// | (-c + di) (a - bi) |
| ComplexMatrix of Complex [,]
// — кватернион — это кортеж из действительного числа и трёхмерного вектора
| RealAnd3DVector of float * Vector3D
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment