quaternion

Types

The Quaternion type.

Example:
let q = Quaternion(1.0, #(2.0, 3.0, 4.0))
pub type Quaternion {
  Quaternion(real: Float, imaginary: #(Float, Float, Float))
}

Constructors

  • Quaternion(real: Float, imaginary: #(Float, Float, Float))

Constants

pub const id: Quaternion

The multiplicative identity.

Example:
Quaternion(1.0, #(2.0, 3.0, 4.0))
|> quaternion.multiply(quaternion.id)
|> quaternion.to_string
// "1.0 + 2.0i + 3.0j + 4.0k"

Functions

pub fn add(a: Quaternion, b: Quaternion) -> Quaternion

Adds two quaternions

Example:
let q = quaternion.Quaternion(1.0, #(2.0, 3.0, 4.0))
let r = quaternion.Quaternion(0.0, #(0.0, -1.0, -2.0))

let s = quaternion.add(q, r)
|> quaternion.to_string
// "1.0 + 2.0i + 2.0j + 2.0k"
pub fn axis_angle(
  axis: #(Float, Float, Float),
  angle: Float,
) -> Quaternion

Constructs the quaternion representing the given angle (in radians) around the given axis

Example:
#(1.0, 1.0, 1.0)
|> quaternion.axis_angle(elementary.pi())
// #(0.577, 0.577, 0.577)
pub fn conjugate(q: Quaternion) -> Quaternion

Computes the conjugate of a quaternion.

Example:
let q = quaternion.Quaternion(1.0, #(2.0, 3.0, 4.0))
|> quaternion.conjugate
|> quaternion.to_string
// "1.0 + -2.0i + -3.0j + -4.0k"
pub fn dot(q: Quaternion, r: Quaternion) -> Float

Computes the dot product of two quaternions.

Example:
let q = quaternion.Quaternion(1.0, #(2.0, -2.0, -1.0))
let r = quaternion.Quaternion(-1.0, #(1.0, 2.0, -2.0))

let s = quaternion.dot(q, r)
// -1.0
pub fn euler_angles(x: Float, y: Float, z: Float) -> Quaternion

Constructs the quaternion representing the given euler angle rotations (in radian)

Example:
let q = quaternion.euler_angles(0.0, pi, 0.0)
|> quaternion.rotate_vector(#(1.0, 1.0, 1.0))
// #(-1.0, 1.0, -1.0)
pub fn from_imaginary(i: #(Float, Float, Float)) -> Quaternion

Constructs a quaternion with only an imaginary part

Example:
#(1.0, 2.0, 3.0)
|> quaternion.from_imaginary
|> to_string
// "0.0 + 1.0i + 2.0j + 3.0k"
pub fn from_list(q: List(Float)) -> Result(Quaternion, String)

Constructs a Quaternion from a list of Floats.

Example:
let q = quaternion.Quaternion(1.0, #(2.0, 3.0, 4.0))

// Is the same as:

let r = quaternion.from_list([1.0, 2.0, 3.0, 4.0])
pub fn from_real(r: Float) -> Quaternion

Constructs a quaternion with only a real part

Example:
1.0
|> quaternion.from_real
|> quaternion.to_string
// "1.0 + 0.0i + 0.0j + 0.0k"
pub fn length(q: Quaternion) -> Float

Computes the length of a quaternion.

Example:
let q = quaternion.Quaternion(1.0, #(2.0, 3.0, 4.0))
|> quaternion.square_length
// 5.477...
pub fn loosely_equals(
  q: Quaternion,
  r: Quaternion,
  epsilon: Float,
) -> Bool

Asserts if quaternions are loosely equals

Example:
#(1.0, 1.0, 1.0)
|> quaternion.axis_angle(elementary.pi())
|> quaternion.loosely_equals(Quaternion(0.0, #(0.577, 0.577, 0.577)), epsilon)
|> should.equal(True)
pub fn multiply(q: Quaternion, r: Quaternion) -> Quaternion

Computes the product of two quaternions.

Example:
let q = quaternion.Quaternion(1.0, #(2.0, 3.0, 4.0))
let r = quaternion.Quaternion(1.0, #(-1.0, 2.0, -2.0))

let s = quaternion.multiply(q, r)
|> quaternion.to_string
// "5.0 + -13.0i + 5.0j + 9.0k"
pub fn normalize(q: Quaternion) -> Quaternion

Normalizes a quaternion.

Example:
let q = quaternion.Quaternion(1.0, #(2.0, 3.0, 4.0))
|> quaternion.normalize
|> quaternion.length
// 1.0
pub fn rotate_vector(
  q: Quaternion,
  v: #(Float, Float, Float),
) -> #(Float, Float, Float)

Rotates a 3D vector using a quaternion (quaternion should be of norm 1.0).

Example:
let v = #(0.0, 1.0, 0.0))
|> quaternion.axis_angle(pi)
|> quaternion.rotate_vector(#(1.0, 1.0, 1.0))
|> quaternion.to_string
// "0.0 + -1.0i + 1.0j + -1.0k"
pub fn scale(q: Quaternion, factor: Float) -> Quaternion

Scales a quaternion (element-wise) by a scalar.

Example:
let q = quaternion.Quaternion(1.0, #(2.0, 3.0, 4.0))
let factor = 2.0

let s = quaternion.times(q, r)
|> quaternion.to_string
// "2.0 + 4.0i + 6.0j + 8.0k"
pub fn square_length(q: Quaternion) -> Float

Computes the squared length of a quaternion.

Example:
let q = quaternion.Quaternion(1.0, #(2.0, 3.0, 4.0))
|> quaternion.square_length
// 30
pub fn substract(a: Quaternion, b: Quaternion) -> Quaternion

Substracts two quaternions

Example:
let q = quaternion.Quaternion(1.0, #(2.0, 3.0, 4.0))
let r = quaternion.Quaternion(0.0, #(0.0, -1.0, -2.0))

let s = quaternion.substract(q, r)
|> quaternion.to_string
// "1.0 + 2.0i + 4.0j + 6.0k"
pub fn times(a: Quaternion, b: Quaternion) -> Quaternion

Computes the product (element-wise) of two quaternions.

Example:
let q = quaternion.Quaternion(1.0, #(2.0, 3.0, 4.0))
let r = quaternion.Quaternion(0.0, #(0.0, -1.0, -2.0))

let s = quaternion.times(q, r)
|> quaternion.to_string
// "0.0 + 0.0i + -3.0j + -4.0k"
pub fn to_list(q: Quaternion) -> List(Float)

Constructs a list from a given Quaternion.

Example:
let q = quaternion.Quaternion(1.0, #(2.0, 3.0, 4.0))
|> quaternion.to_list

// Is the same as:

let r = [1.0, 2.0, 3.0, 4.0]
pub fn to_string(q: Quaternion) -> String

Returns a string representing a given quaternion

Example:
let q = quaternion.Quaternion(1.0, #(2.0, 3.0, 4.0))
|> quaternion.to_string

// Is the same as:

let r = "1.0 + 2.0i + 3.0j + 4.0k"
Search Document