use crate::{EdgeAx, Hex, HexAx, NodeAx};
pub trait Hexes<THex>
where
THex: Hex,
{
fn hexes(&self) -> impl Iterator<Item = THex>;
}
impl Hexes<HexAx> for HexAx {
fn hexes(&self) -> impl Iterator<Item = HexAx> {
[
HexAx::new(self.q, self.r + 1),
HexAx::new(self.q + 1, self.r),
HexAx::new(self.q + 1, self.r - 1),
HexAx::new(self.q, self.r - 1),
HexAx::new(self.q - 1, self.r),
HexAx::new(self.q - 1, self.r + 1),
]
.into_iter()
}
}
impl Hexes<HexAx> for EdgeAx {
fn hexes(&self) -> impl Iterator<Item = HexAx> {
if self.q % 2 == 0 {
[
HexAx::new(self.q / 2, (self.r as f32 / 2.).ceil() as isize),
HexAx::new(self.q / 2, (self.r as f32 / 2.).floor() as isize),
]
} else {
if self.r % 2 == 0 {
[
HexAx::new((self.q as f32 / 2.).ceil() as isize, self.r / 2),
HexAx::new((self.q as f32 / 2.).floor() as isize, self.r / 2),
]
} else {
[
HexAx::new(
(self.q as f32 / 2.).floor() as isize,
(self.r as f32 / 2.).ceil() as isize,
),
HexAx::new(
(self.q as f32 / 2.).ceil() as isize,
(self.r as f32 / 2.).floor() as isize,
),
]
}
}
.into_iter() }
}
impl Hexes<HexAx> for NodeAx {
fn hexes(&self) -> impl Iterator<Item = HexAx> {
match self.q.rem_euclid(3) {
1 => {
assert_eq!(self.r.rem_euclid(3), 1);
[
HexAx::new((self.q - 1) / 3, (self.r + 2) / 3),
HexAx::new((self.q - 1) / 3, (self.r - 1) / 3),
HexAx::new((self.q + 2) / 3, (self.r - 1) / 3),
]
}
2 => {
assert_eq!(self.r.rem_euclid(3), 2);
[
HexAx::new((self.q - 2) / 3, (self.r + 1) / 3),
HexAx::new((self.q + 1) / 3, (self.r + 1) / 3),
HexAx::new((self.q + 1) / 3, (self.r - 2) / 3),
]
}
_ => panic!(
"Tried to evaluate hexes of an invalid node coordinate: {:?}",
self
),
}
.into_iter()
}
}