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
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]