use crate::coordinate_systems::{IJ, KJ};
use crate::lattice::types::{Flip, Quaternary, NO, YES};
pub const K_POS: KJ = KJ(crate::coordinate_systems::vec2::Vec2 { x: 1.0, y: 0.0 }); pub const J_POS: KJ = KJ(crate::coordinate_systems::vec2::Vec2 { x: 0.0, y: 1.0 }); pub const K_NEG: KJ = KJ(crate::coordinate_systems::vec2::Vec2 { x: -1.0, y: 0.0 });
pub const J_NEG: KJ = KJ(crate::coordinate_systems::vec2::Vec2 { x: 0.0, y: -1.0 });
pub const ZERO: KJ = KJ(crate::coordinate_systems::vec2::Vec2 { x: 0.0, y: 0.0 });
pub fn quaternary_to_kj(n: Quaternary, flips: [Flip; 2]) -> KJ {
let [flip_x, flip_y] = flips;
let (p, q) = match (flip_x, flip_y) {
(NO, NO) => (K_POS, J_POS),
(YES, NO) => (J_NEG, K_NEG), (NO, YES) => (J_POS, K_POS), (YES, YES) => (K_NEG, J_NEG), _ => panic!("Invalid flip values"),
};
match n {
0 => ZERO, 1 => p, 2 => KJ::new(q.x() + p.x(), q.y() + p.y()), 3 => KJ::new(q.x() + 2.0 * p.x(), q.y() + 2.0 * p.y()), _ => panic!("Invalid Quaternary value: {}", n),
}
}
pub fn quaternary_to_flips(n: Quaternary) -> [Flip; 2] {
match n {
0 => [NO, NO],
1 => [NO, YES],
2 => [NO, NO],
3 => [YES, NO],
_ => panic!("Invalid Quaternary value: {}", n),
}
}
pub fn ij_to_quaternary(ij: IJ, flips: [Flip; 2]) -> Quaternary {
let u = ij.x();
let v = ij.y();
let a = if flips[0] == YES { -(u + v) } else { u + v };
let b = if flips[1] == YES { -u } else { u };
let c = if flips[0] == YES { -v } else { v };
if flips[0] + flips[1] == 0 {
if c < 1.0 {
0
} else if b > 1.0 {
3
} else if a > 1.0 {
2
} else {
1
}
} else if a < 1.0 {
0
} else if b > 1.0 {
3
} else if c > 1.0 {
2
} else {
1
}
}