use crate::geometry::vec::Vec2d; use std::fmt; #[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] pub enum Direction { North, NorthEast, East, SouthEast, South, SouthWest, West, NorthWest, } impl fmt::Display for Direction { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { use Direction::*; let s = match self { North => "N", NorthEast => "NE", East => "E", SouthEast => "SE", South => "S", SouthWest => "SW", West => "W", NorthWest => "NW", }; f.write_str(s) } } impl Direction { pub fn is_diagonal(&self) -> bool { use Direction::*; match self { NorthEast | SouthEast | SouthWest | NorthWest => true, _ => false, } } pub fn as_vec(&self) -> Vec2d { use Direction::*; match self { North => Vec2d::new(0, -1), NorthEast => Vec2d::new(1, -1), East => Vec2d::new(1, 0), SouthEast => Vec2d::new(1, 1), South => Vec2d::new(0, 1), SouthWest => Vec2d::new(-1, 1), West => Vec2d::new(-1, 0), NorthWest => Vec2d::new(-1, -1), } } pub const ALL: [Direction; 8] = [ Direction::North, Direction::NorthEast, Direction::East, Direction::SouthEast, Direction::South, Direction::SouthWest, Direction::West, Direction::NorthWest, ]; }