use super::CoordIJK;
#[derive(Debug, Clone, Copy, Eq, PartialEq)]
pub struct CoordCube {
pub i: i32,
pub j: i32,
pub k: i32,
}
impl CoordCube {
pub const fn new(i: i32, j: i32, k: i32) -> Self {
Self { i, j, k }
}
pub fn translate(&self, offsets: (f64, f64, f64)) -> Self {
let i = f64::from(self.i) + offsets.0;
let j = f64::from(self.j) + offsets.1;
let k = f64::from(self.k) + offsets.2;
#[allow(clippy::cast_possible_truncation)] let (mut ri, mut rj, mut rk) =
{ (i.round() as i32, j.round() as i32, k.round() as i32) };
let i_diff = (f64::from(ri) - i).abs();
let j_diff = (f64::from(rj) - j).abs();
let k_diff = (f64::from(rk) - k).abs();
if i_diff > j_diff && i_diff > k_diff {
ri = -rj - rk;
} else if j_diff > k_diff {
rj = -ri - rk;
} else {
rk = -ri - rj;
}
Self::new(ri, rj, rk)
}
}
impl From<CoordCube> for CoordIJK {
fn from(value: CoordCube) -> Self {
Self::new(-value.i, value.j, 0).normalize()
}
}