diff --git a/src/cgmath/angle.rs b/src/cgmath/angle.rs index c7a64d2..ad71f15 100644 --- a/src/cgmath/angle.rs +++ b/src/cgmath/angle.rs @@ -63,7 +63,7 @@ pub trait Angle S: Float > : Clone + Zero -+ Eq + Ord ++ Eq + Equiv + Ord + ApproxEq + Neg + ToRad @@ -144,6 +144,18 @@ impl Deg { #[inline] pub fn turn_div_6() -> Deg { Angle::turn_div_6() } } +impl Equiv> for Rad { + fn equiv(&self, other: &Rad) -> bool { + self.normalize() == other.normalize() + } +} + +impl Equiv> for Deg { + fn equiv(&self, other: &Deg) -> bool { + self.normalize() == other.normalize() + } +} + impl Angle for Rad { #[inline] fn from>(theta: A) -> Rad { theta.to_rad() } #[inline] fn full_turn() -> Rad { rad(Real::two_pi()) } diff --git a/src/tests/angle.rs b/src/tests/angle.rs index 0b34dc3..19f7f60 100644 --- a/src/tests/angle.rs +++ b/src/tests/angle.rs @@ -16,10 +16,21 @@ use cgmath::angle::*; #[test] -fn angle_conv() { +fn conv() { assert_approx_eq!(deg(-5.0).to_rad().to_deg(), deg(-5.0)); assert_approx_eq!(deg(30.0).to_rad().to_deg(), deg(30.0)); assert_approx_eq!(rad(-5.0).to_deg().to_rad(), rad(-5.0)); assert_approx_eq!(rad(30.0).to_deg().to_rad(), rad(30.0)); } + +#[test] +fn equiv() { + assert!(Deg::::full_turn().equiv(&-Deg::::full_turn())) + assert!(Deg::::turn_div_2().equiv(&-Deg::::turn_div_2())) + assert!(Deg::::turn_div_3().sub_a(Deg::::full_turn()).equiv(&Deg::::turn_div_3())) + + assert!(Rad::::full_turn().equiv(&-Rad::::full_turn())) + assert!(Rad::::turn_div_2().equiv(&-Rad::::turn_div_2())) + assert!(Rad::::turn_div_3().sub_a(Rad::::full_turn()).equiv(&Rad::::turn_div_3())) +}