bestagon 0.7.0

An engine for discrete stuff in hexagonal grids
Documentation
use crate::{EdgeAx, Hex, HexAx, Node, NodeAx};

pub trait Nodes<TNode>
where
  TNode: Node,
{
  fn nodes(&self) -> impl Iterator<Item = TNode>;
}

impl Nodes<NodeAx> for HexAx {
  fn nodes(&self) -> impl Iterator<Item = NodeAx> {
    [
      self.n_south_west().into(),
      self.n_south_east().into(),
      self.n_east().into(),
      self.n_north_east().into(),
      self.n_north_west().into(),
      self.n_west().into(),
    ]
    .into_iter()
  }
}

impl Nodes<NodeAx> for EdgeAx {
  fn nodes(&self) -> impl Iterator<Item = NodeAx> {
    if self.q % 2 == 0 {
      [
        NodeAx::new(
          self.q * 3 / 2 + 1,
          ((self.r * 3) as f32 / 2.).floor() as isize,
        ),
        NodeAx::new(
          self.q * 3 / 2 - 1,
          ((self.r * 3) as f32 / 2.).ceil() as isize,
        ),
      ]
    } else {
      if self.r % 2 == 0 {
        [
          NodeAx::new(
            ((self.q * 3) as f32 / 2.).floor() as isize,
            self.r * 3 / 2 + 1,
          ),
          NodeAx::new(
            ((self.q * 3) as f32 / 2.).ceil() as isize,
            self.r * 3 / 2 - 1,
          ),
        ]
      } else {
        [
          NodeAx::new(
            ((self.q * 3) as f32 / 2.).floor() as isize,
            ((self.r * 3) as f32 / 2.).floor() as isize,
          ),
          NodeAx::new(
            ((self.q * 3) as f32 / 2.).ceil() as isize,
            ((self.r * 3) as f32 / 2.).ceil() as isize,
          ),
        ]
      }
    }
    .into_iter()
  }
}

#[cfg(test)]
mod test {
  #[test]
  fn test_nodes_for_edges() {}
}