geometry: implement distance API for points
This commit is contained in:
parent
450fbbf9c9
commit
60bcf4faa3
@ -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<T: CoordLimits<Data = T>, S: CoordinateSpace> Coordinates<T, S> {
|
||||
@ -70,6 +85,10 @@ impl<T: CoordLimits<Data = T>, S: CoordinateSpace> Coordinates<T, S> {
|
||||
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)]
|
||||
|
Loading…
x
Reference in New Issue
Block a user