use crate::{Arc, Line, Vector};
pub trait Length {
fn length(&self) -> f64;
}
impl<'a, L: Length + ?Sized> Length for &'a L {
fn length(&self) -> f64 { (*self).length() }
}
impl Length for Line {
fn length(&self) -> f64 { self.displacement().length() }
}
impl Length for Vector {
fn length(&self) -> f64 { euclid::Vector2D::length(self) }
}
impl Length for Arc {
fn length(&self) -> f64 { self.radius() * self.sweep_angle().radians.abs() }
}
#[cfg(test)]
mod tests {
use super::*;
use crate::{Angle, Point};
#[test]
fn line() {
let thing = Line::new(Point::zero(), Point::new(3.0, 4.0));
assert_eq!(thing.length(), 5.0);
}
#[test]
fn arc() {
let arc = Arc::from_centre_radius(
Point::zero(),
10.0,
Angle::zero(),
Angle::pi(),
);
assert_eq!(
arc.length(),
arc.sweep_angle().radians.abs() * arc.radius()
);
}
}