diff --git a/src/angle.rs b/src/angle.rs index c4a0f93..c2f4df4 100644 --- a/src/angle.rs +++ b/src/angle.rs @@ -14,7 +14,9 @@ pub trait Angle: Add , Sub , Mul , Div + // , Div , Modulo + // , Modulo , Neg , Eq, Ord { static pure fn full_turn() -> self; @@ -50,7 +52,14 @@ pub impl Radians: Angle { #[inline(always)] pure fn wrap(&self) -> Radians { - (*self) % cast(2.0 * pi) // TODO: keep in the domain of 0 to two_pi + let theta = (*self) % cast(2.0 * pi); + + // keep in the domain of 0 to 1 rad + if theta >= Angle::zero() { + theta + } else { + theta + Angle::full_turn() + } } #[inline(always)] @@ -137,7 +146,14 @@ pub impl Degrees: Angle { #[inline(always)] pure fn wrap(&self) -> Degrees { - (*self) % cast(360) // TODO: keep in the domain of 0 to 360 + let theta = (*self) % cast(360); + + // keep in the domain of 0 to 360 degrees + if theta >= Angle::zero() { + theta + } else { + theta + Angle::full_turn() + } } #[inline(always)] diff --git a/src/test/test_angle.rs b/src/test/test_angle.rs index 3624899..9dd9812 100644 --- a/src/test/test_angle.rs +++ b/src/test/test_angle.rs @@ -21,14 +21,14 @@ fn test_radians() { assert Radians(pi).wrap() == Radians(pi); assert Radians(3.0 * pi).wrap() == Radians(pi); assert Radians(2.0 * pi).wrap() == Radians(0.0); - assert Radians(-pi).wrap() == Radians(-pi); // FIXME: should be in the domain of 0 to two_pi - assert Radians(-3.0 * pi).wrap() == Radians(-pi); // FIXME: should be in the domain of 0 to two_pi + assert Radians(-pi).wrap() == Radians(pi); + assert Radians(-3.0 * pi).wrap() == Radians(pi); assert Radians(-2.0 * pi).wrap() == Radians(0.0); assert Radians(0.0).opposite() == Radians(pi as float); assert Radians(pi / 2.0).opposite() == Radians((pi / 2.0) * 3.0); assert Radians(pi * 3.0).opposite() == Radians(0.0); - assert Radians(-2.0 * pi).opposite() == Radians(-pi); // FIXME: should be in the domain of 0 to two_pi + assert Radians(-2.0 * pi).opposite() == Radians(pi); assert Radians(pi) + Radians(pi) == Radians(2.0 * pi); assert Radians(2.0 * pi) - Radians(pi) == Radians(pi); @@ -57,14 +57,14 @@ fn test_degrees() { assert Degrees(90.0).wrap() == Degrees(90.0); assert Degrees(450.0).wrap() == Degrees(90.0); assert Degrees(360.0).wrap() == Degrees(0.0); - assert Degrees(-90.0).wrap() == Degrees(-90.0); // FIXME: should be in the domain of 0 to 360 - assert Degrees(-450.0).wrap() == Degrees(-90.0); // FIXME: should be in the domain of 0 to 360 + assert Degrees(-90.0).wrap() == Degrees(270.0); + assert Degrees(-450.0).wrap() == Degrees(270.0); assert Degrees(-360.0).wrap() == Degrees(0.0); assert Degrees(0.0).opposite() == Degrees(180.0); assert Degrees(90.0).opposite() == Degrees(270.0); assert Degrees(540.0).opposite() == Degrees(0.0); - assert Degrees(-360.0).opposite() == Degrees(-180.0); // FIXME: should be in the domain of 0 to 360 + assert Degrees(-360.0).opposite() == Degrees(180.0); assert Degrees(180.0) + Degrees(180.0) == Degrees(360.0); assert Degrees(360.0) - Degrees(180.0) == Degrees(180.0);