Add quaterdirection and fix multistation off by one errors

This commit is contained in:
hal8174 2025-01-26 22:16:12 +01:00
parent 1af9712bcb
commit c3bb980fcf
5 changed files with 137 additions and 47 deletions

View file

@ -5,6 +5,7 @@ pub mod color;
pub mod direction;
pub mod pathfield;
pub mod position;
pub mod quaterdirection;
pub mod transformation;
pub mod visualize;
@ -14,6 +15,7 @@ pub mod prelude {
block::Block,
direction::Direction,
position::{Position, PositionType},
quaterdirection::QuaterDirection,
transformation::{Transformable, Transformation},
};
}

View file

@ -0,0 +1,78 @@
use crate::prelude::{Transformable, Transformation};
#[derive(Clone, Copy, PartialEq, Eq, Debug, Hash)]
pub enum QuaterDirection {
N,
NNE,
NE,
ENE,
E,
ESE,
SE,
SSE,
S,
SSW,
SW,
WSW,
W,
WNW,
NW,
NNW,
}
impl QuaterDirection {
pub fn to_int_direction(&self) -> u8 {
match self {
QuaterDirection::N => 0,
QuaterDirection::NNE => 1,
QuaterDirection::NE => 2,
QuaterDirection::ENE => 3,
QuaterDirection::E => 4,
QuaterDirection::ESE => 5,
QuaterDirection::SE => 6,
QuaterDirection::SSE => 7,
QuaterDirection::S => 8,
QuaterDirection::SSW => 9,
QuaterDirection::SW => 10,
QuaterDirection::WSW => 11,
QuaterDirection::W => 12,
QuaterDirection::WNW => 13,
QuaterDirection::NW => 14,
QuaterDirection::NNW => 15,
}
}
pub fn from_int_direction(x: u8) -> Self {
match x {
0 => QuaterDirection::N,
1 => QuaterDirection::NNE,
2 => QuaterDirection::NE,
3 => QuaterDirection::ENE,
4 => QuaterDirection::E,
5 => QuaterDirection::ESE,
6 => QuaterDirection::SE,
7 => QuaterDirection::SSE,
8 => QuaterDirection::S,
9 => QuaterDirection::SSW,
10 => QuaterDirection::SW,
11 => QuaterDirection::WSW,
12 => QuaterDirection::W,
13 => QuaterDirection::WNW,
14 => QuaterDirection::NW,
15 => QuaterDirection::NNW,
_ => unreachable!(),
}
}
}
impl Transformable for QuaterDirection {
fn transform(&self, t: Transformation) -> Self {
Self::from_int_direction((self.to_int_direction() + 4 * t.rot().get_index()) % 16)
}
}
impl From<u8> for QuaterDirection {
fn from(value: u8) -> Self {
Self::from_int_direction(value)
}
}