Add geometry crate with Point and Direction
This commit is contained in:
parent
c04c7adfd2
commit
c2243baf17
2 changed files with 74 additions and 0 deletions
8
2022/geometry/Cargo.toml
Normal file
8
2022/geometry/Cargo.toml
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
[package]
|
||||||
|
name = "geometry"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
[dependencies]
|
66
2022/geometry/src/lib.rs
Normal file
66
2022/geometry/src/lib.rs
Normal file
|
@ -0,0 +1,66 @@
|
||||||
|
#[derive(Clone, Copy, Debug)]
|
||||||
|
pub enum Direction {
|
||||||
|
North,
|
||||||
|
East,
|
||||||
|
South,
|
||||||
|
West,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Direction {
|
||||||
|
pub fn all() -> &'static [Direction] {
|
||||||
|
&[
|
||||||
|
Direction::North,
|
||||||
|
Direction::East,
|
||||||
|
Direction::South,
|
||||||
|
Direction::West,
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn from_relative_direction(letter: &str) -> Option<Direction> {
|
||||||
|
match letter {
|
||||||
|
"U" | "u" => Some(Direction::North),
|
||||||
|
"R" | "r" => Some(Direction::East),
|
||||||
|
"D" | "d" => Some(Direction::South),
|
||||||
|
"L" | "l" => Some(Direction::West),
|
||||||
|
_ => None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A point in standard coordinates, where Y values grow in the positively in the North direction.
|
||||||
|
*/
|
||||||
|
#[derive(Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
|
||||||
|
pub struct Point {
|
||||||
|
pub x: i32,
|
||||||
|
pub y: i32,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Point {
|
||||||
|
pub fn zero() -> Point {
|
||||||
|
Point::new(0, 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn new(x: i32, y: i32) -> Point {
|
||||||
|
Point { x, y }
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn distance_to(&self, other: &Point) -> (i32, i32) {
|
||||||
|
(other.x - self.x, other.y - self.y)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn move_by_one_in(&mut self, direction: Direction) {
|
||||||
|
match direction {
|
||||||
|
Direction::North => self.y += 1,
|
||||||
|
Direction::East => self.x += 1,
|
||||||
|
Direction::South => self.y -= 1,
|
||||||
|
Direction::West => self.x -= 1,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl std::fmt::Display for Point {
|
||||||
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||||
|
write!(f, "({}, {})", self.x, self.y)
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue