1use num_traits::{Signed, Zero};
6use std::ops::{Add, Sub};
7
8#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq, Ord, PartialOrd)]
10pub struct Point<T> {
11 pub x: T,
13 pub y: T,
15}
16
17impl<T> Point<T> {
18 pub fn new(x: T, y: T) -> Self {
20 Self { x, y }
21 }
22}
23
24impl<T> Point<T>
25where
26 T: Copy + Add<Output = T> + Sub<Output = T> + Zero,
27{
28 pub fn rotate_ccw90(&self) -> Self {
30 Self::new(T::zero() - self.y, self.x)
31 }
32}
33
34impl<T> Point<T>
35where
36 T: Copy + Add<Output = T> + Sub<Output = T> + Signed,
37{
38 pub fn manhattan_distance(&self, other: &Self) -> T {
40 let dx = self.x - other.x;
41 let dy = self.y - other.y;
42
43 dx.abs() + dy.abs()
44 }
45
46 pub fn translate(&self, (dx, dy): (T, T)) -> Self {
48 Point::new(self.x + dx, self.y + dy)
49 }
50}
51
52impl<T> From<(T, T)> for Point<T> {
53 fn from((x, y): (T, T)) -> Self {
54 Point::new(x, y)
55 }
56}