#[derive(Debug, Clone, Copy)]
pub enum EulerRot {
ZYX,
ZXY,
YXZ,
YZX,
XYZ,
XZY,
ZYZ,
ZXZ,
YXY,
YZY,
XYX,
XZX,
}
impl EulerRot {
pub(crate) const fn levi_civita_sig(self) -> f32 {
let (i, j, k) = self.map_sequence();
let (i, j, k) = (i as i32, j as i32, k as i32);
((i - j) * (j - k) * (k - i) / 2) as f32
}
pub(crate) const fn map_sequence(self) -> (usize, usize, usize) {
use EulerRot::*;
match self {
XYZ | ZYZ => (3, 2, 1),
YXZ | ZXZ => (3, 1, 2),
ZXY | YXY => (2, 1, 3),
XZY | YZY => (2, 3, 1),
ZYX | XYX => (1, 2, 3),
YZX | XZX => (1, 3, 2),
}
}
pub(crate) const fn not_proper(self) -> bool {
use EulerRot::*;
match self {
ZYX | ZXY | YXZ | YZX | XYZ | XZY => true,
ZYZ | ZXZ | YXY | YZY | XYX | XZX => false,
}
}
}
impl Default for EulerRot {
fn default() -> Self {
Self::XYZ
}
}