MoonBit Quaternion Library
Dependencies
moon add Luna-Flow/quaternion@0.2.0fn main {
// a quarter turn around the z axis
let q = @quaternion.from_axis_angle((0.0, 0.0, 1.0), @math.PI / 2.0)
let (x, y, _) = q.rotate((1.0, 0.0, 0.0))
println("\{x.abs() < 1.0e-12}, \{y}") // true, 1
// half of the turn, by spherical interpolation
let half = @quaternion.slerp(@quaternion.id(), q, 0.5)
println(half) // 0.9238795325112868 + 0i + 0j + 0.3826834323650898k
// `/` is right division: (q / r) * r == q
let r = @quaternion.Quaternion::from_vec((1.0, 2.0, 3.0, 4.0))
println(((q / r) * r - q).square_len() < 1.0e-24) // true
}| Package | Import path | Contents |
|---|---|---|
| core (src) | Luna-Flow/quaternion | Quaternion[T]: arithmetic, / (right division) and left_div, inv, conjugate, norms, rotate, slerp, from_axis_angle, Euler-angle conversion, DoubleConvert |
moon fmt
moon check --target all
moon test --target all
moon infopub trait DoubleConvert {
fn to_double(Self) -> Double
fn from_double(Double) -> Self
}impl AddMonoid for Quaternion[T]impl Conjugate for Quaternion[T]impl Inverse for Quaternion[T]impl MulMonoid for Quaternion[T]impl One for Quaternion[T]impl Ring for Quaternion[T]impl Semiring for Quaternion[T]impl Zero for Quaternion[T]impl Add for Quaternion[T]impl Default for Quaternion[T]impl Div for Quaternion[T]impl Mul for Quaternion[T]impl Neg for Quaternion[T]impl Show for Quaternion[T]impl Sub for Quaternion[T]fn[T : Add + Mul + Div + Sub] Quaternion::div(q : Quaternion[T], r : Quaternion[T]) -> Quaternion[T]fn[T : Div + Num + Ring + Semiring + AddMonoid + Add + Zero + MulMonoid + Mul + One + Neg + Sub] Quaternion::inv(self : Quaternion[T]) -> Quaternion[T]fn[T : Add + Mul + Div + Sub] Quaternion::left_div(self : Quaternion[T], r : Quaternion[T]) -> Quaternion[T]fn[T : Num + DoubleConvert + Ring + Semiring + AddMonoid + Add + Zero + MulMonoid + Mul + One + Neg + Sub] Quaternion::magnitude(self : Quaternion[T]) -> Tfn[T : Mul + Sub + Add] Quaternion::mul(self : Quaternion[T], other : Quaternion[T]) -> Quaternion[T]fn[T : Num + DoubleConvert + Div + Eq + Ring + Semiring + AddMonoid + Add + Zero + MulMonoid + Mul + One + Neg + Sub] Quaternion::normalize(self : Quaternion[T]) -> Quaternion[T]fn[T : Num + DoubleConvert + Mul + Add + Div + Eq + Ring + Semiring + AddMonoid + Zero + MulMonoid + One + Neg + Sub] Quaternion::pow_by_T(self : Quaternion[T], exponent : T) -> Quaternion[T]fn[T : Num + Mul + Add + Sub + Div + Ring + Semiring + AddMonoid + Zero + MulMonoid + One + Neg] Quaternion::pow_by_int(self : Quaternion[T], exponent : Int) -> Quaternion[T]fn[T : DoubleConvert + Mul + Add + Div] from_axis_angle(axis : (T, T, T), angle : T) -> Quaternion[T]fn[T : DoubleConvert + Mul + Add + Sub] from_euler(roll : T, pitch : T, yaw : T, order? : String) -> Quaternion[T]fn[T : DoubleConvert + Num + Mul + Add + Div + Eq + Ring + Semiring + AddMonoid + Zero + MulMonoid + One + Neg + Sub] slerp(q1 : Quaternion[T], q2 : Quaternion[T], t : Double) -> Quaternion[T]