Maintainer | numericprelude@henning-thielemann.de |
---|---|

Stability | provisional |

Portability | portable (?) |

Safe Haskell | None |

Language | Haskell98 |

Quaternions

- data T a
- fromReal :: C a => a -> T a
- (+::) :: a -> (a, a, a) -> T a
- toRotationMatrix :: C a => T a -> Array (Int, Int) a
- fromRotationMatrix :: C a => Array (Int, Int) a -> T a
- fromRotationMatrixDenorm :: C a => Array (Int, Int) a -> T a
- toComplexMatrix :: C a => T a -> Array (Int, Int) (T a)
- fromComplexMatrix :: C a => Array (Int, Int) (T a) -> T a
- scalarProduct :: C a => (a, a, a) -> (a, a, a) -> a
- crossProduct :: C a => (a, a, a) -> (a, a, a) -> (a, a, a)
- conjugate :: C a => T a -> T a
- scale :: C a => a -> T a -> T a
- norm :: C a => T a -> a
- normSqr :: C a => T a -> a
- normalize :: C a => T a -> T a
- similarity :: C a => T a -> T a -> T a
- slerp :: C a => a -> (a, a, a) -> (a, a, a) -> (a, a, a)

# Cartesian form

Quaternions could be defined based on Complex numbers. However quaternions are often considered as real part and three imaginary parts.

# Conversions

toRotationMatrix :: C a => T a -> Array (Int, Int) a Source

Let `c`

be a unit quaternion, then it holds
`similarity c (0+::x) == toRotationMatrix c * x`

fromRotationMatrixDenorm :: C a => Array (Int, Int) a -> T a Source

The rotation matrix must be normalized. (I.e. no rotation with scaling) The computed quaternion is not normalized.

toComplexMatrix :: C a => T a -> Array (Int, Int) (T a) Source

Map a quaternion to complex valued 2x2 matrix,
such that quaternion addition and multiplication
is mapped to matrix addition and multiplication.
The determinant of the matrix equals the squared quaternion norm (`normSqr`

).
Since complex numbers can be turned into real (orthogonal) matrices,
a quaternion could also be converted into a real matrix.

fromComplexMatrix :: C a => Array (Int, Int) (T a) -> T a Source

Revert `toComplexMatrix`

.

# Operations

scalarProduct :: C a => (a, a, a) -> (a, a, a) -> a Source

crossProduct :: C a => (a, a, a) -> (a, a, a) -> (a, a, a) Source

normSqr :: C a => T a -> a Source

the same as NormedEuc.normSqr but with a simpler type class constraint

similarity :: C a => T a -> T a -> T a Source

similarity mapping as needed for rotating 3D vectors

It holds
`similarity (cos(a/2) +:: scaleImag (sin(a/2)) v) (0 +:: x) == (0 +:: y)`

where `y`

results from rotating `x`

around the axis `v`

by the angle `a`

.

:: C a | |

=> a | For |

-> (a, a, a) | vector |

-> (a, a, a) | vector |

-> (a, a, a) |

Spherical Linear Interpolation

Can be generalized to any transcendent Hilbert space. In fact, we should also include the real part in the interpolation.