asterion_core/
direction.rs1use strum_macros::{Display, EnumIter};
2
3#[derive(Debug, Copy, Clone, Display, PartialEq, Eq, Hash, EnumIter)]
4pub enum Direction {
5 North,
6 East,
7 South,
8 West,
9 NorthEast,
10 SouthEast,
11 SouthWest,
12 NorthWest,
13}
14
15impl Direction {
16 pub fn opposite(&self) -> Self {
17 match self {
18 Self::North => Self::South,
19 Self::East => Self::West,
20 Self::South => Self::North,
21 Self::West => Self::East,
22 Self::NorthEast => Self::SouthWest,
23 Self::SouthWest => Self::NorthEast,
24 Self::SouthEast => Self::NorthWest,
25 Self::NorthWest => Self::SouthEast,
26 }
27 }
28
29 pub fn as_offset(&self) -> (isize, isize) {
30 match self {
31 Self::North => (0, -1),
32 Self::East => (1, 0),
33 Self::South => (0, 1),
34 Self::West => (-1, 0),
35 Self::NorthEast => (1, -1),
36 Self::SouthEast => (1, 1),
37 Self::SouthWest => (-1, 1),
38 Self::NorthWest => (-1, -1),
39 }
40 }
41
42 pub fn rotate_clockwise(&self) -> Self {
43 match self {
44 Self::North => Self::NorthEast,
45 Self::East => Self::SouthEast,
46 Self::South => Self::SouthWest,
47 Self::West => Self::NorthWest,
48 Self::NorthEast => Self::East,
49 Self::SouthEast => Self::South,
50 Self::SouthWest => Self::West,
51 Self::NorthWest => Self::North,
52 }
53 }
54
55 pub fn rotate_counter_clockwise(&self) -> Self {
56 match self {
57 Self::North => Self::NorthWest,
58 Self::East => Self::NorthEast,
59 Self::South => Self::SouthEast,
60 Self::West => Self::SouthWest,
61 Self::NorthEast => Self::North,
62 Self::SouthEast => Self::East,
63 Self::SouthWest => Self::South,
64 Self::NorthWest => Self::West,
65 }
66 }
67}