diff --git a/src/geometry.rs b/src/geometry.rs index 2ff1c1f..912a1ed 100644 --- a/src/geometry.rs +++ b/src/geometry.rs @@ -26,10 +26,17 @@ pub trait CoordLimits: PartialOrd + PartialEq + Sub + Clone + Mul + Copy + One + type Data: CoordLimits; const MIN: Self::Data; const MAX: Self::Data; + + fn distance(x1: Self, y1: Self, x2: Self, y2: Self) -> Self; } impl CoordLimits for u8 { type Data = u8; + + fn distance(x1: Self, y1: Self, x2: Self, y2: Self) -> Self { + (max(x2, x1) - min(x2, x1)).saturating_add(max(y2, y1) - min(y2, y1)) + //(pow(x2 as u16 - x1 as u16, 2) + pow(y2 as u16 - y1 as u16, 2)).sqrt() as u8 + } const MIN: u8 = 0; const MAX: u8 = 255; } @@ -38,12 +45,20 @@ impl CoordLimits for u16 { type Data = u16; const MIN: u16 = u16::MIN; const MAX: u16 = u16::MAX; + + fn distance(x1: Self, y1: Self, x2: Self, y2: Self) -> Self { + (pow(x2 - x1, 2) + pow(y2 - y1, 2)).sqrt() + } } impl CoordLimits for usize { type Data = usize; const MIN: usize = usize::MIN; const MAX: usize = usize::MAX; + + fn distance(x1: Self, y1: Self, x2: Self, y2: Self) -> Self { + (pow(x2 - x1, 2) + pow(y2 - y1, 2)).sqrt() + } } impl, S: CoordinateSpace> Coordinates { @@ -70,6 +85,10 @@ impl, S: CoordinateSpace> Coordinates { fn bottom_right() -> Self { Self::new(T::MAX, T::MAX) } + + pub fn distance_to(&self, other: &Self) -> T { + T::distance(self.x, other.x, self.y, other.y) + } } #[derive(PartialEq, Debug, Copy, Clone)]