From 3a48006ba7f521b6a3d643bd0edf846f2896f819 Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Sun, 2 Dec 2012 16:18:39 +1000 Subject: [PATCH] Use absolute values for radian constants --- src/angle.rs | 15 ++++++++------- src/num/consts.rs | 28 ++++++++++++++++++++++++++-- 2 files changed, 34 insertions(+), 9 deletions(-) diff --git a/src/angle.rs b/src/angle.rs index c2f4df4..76a52ce 100644 --- a/src/angle.rs +++ b/src/angle.rs @@ -3,6 +3,7 @@ use core::f64::consts::pi; use funs::triganomic::{cos, sin}; use mat::{Mat3, Mat4}; +use num::consts::{FloatConsts, IntConsts}; use num::cast::{NumCast, cast}; use quat::Quat; use vec::Vec3; @@ -39,13 +40,13 @@ pub trait Angle: Add pub enum Radians = T; // FIXME: not sure why I need the Eq and Ord trait bounds, but Rust complains if I don't include them -pub impl Radians: Angle { - #[inline(always)] static pure fn full_turn() -> Radians { Radians(cast(2.0 * pi)) } // TODO: calculate absolute values - #[inline(always)] static pure fn half_turn() -> Radians { Radians(cast(pi)) } - #[inline(always)] static pure fn quadrant() -> Radians { Radians(cast(pi / 2.0)) } - #[inline(always)] static pure fn sextant() -> Radians { Radians(cast(pi / 3.0)) } - #[inline(always)] static pure fn octant() -> Radians { Radians(cast(pi / 4.0)) } - #[inline(always)] static pure fn zero() -> Radians { Radians(cast(0.0)) } +pub impl Radians: Angle { + #[inline(always)] static pure fn full_turn() -> Radians { Radians(FloatConsts::two_pi()) } + #[inline(always)] static pure fn half_turn() -> Radians { Radians(FloatConsts::pi()) } + #[inline(always)] static pure fn quadrant() -> Radians { Radians(FloatConsts::pi_2()) } + #[inline(always)] static pure fn sextant() -> Radians { Radians(FloatConsts::pi_3()) } + #[inline(always)] static pure fn octant() -> Radians { Radians(FloatConsts::pi_4()) } + #[inline(always)] static pure fn zero() -> Radians { Radians(NumCast::zero()) } #[inline(always)] pure fn to_radians(&self) -> Radians { *self } #[inline(always)] pure fn to_degrees(&self) -> Degrees { Degrees(**self * cast(180.0 / pi)) } diff --git a/src/num/consts.rs b/src/num/consts.rs index 06164da..06b3a96 100644 --- a/src/num/consts.rs +++ b/src/num/consts.rs @@ -1,10 +1,16 @@ -trait IntConsts { +pub trait IntConsts { static pure fn zero() -> self; static pure fn one() -> self; } -trait FloatConsts: IntConsts { +pub trait FloatConsts: IntConsts { + static pure fn two_pi() -> self; static pure fn pi() -> self; + static pure fn pi_2() -> self; + static pure fn pi_3() -> self; + static pure fn pi_4() -> self; + static pure fn pi_6() -> self; + static pure fn pi_8() -> self; static pure fn frac_pi_2() -> self; static pure fn frac_pi_4() -> self; static pure fn frac_1_pi() -> self; @@ -75,7 +81,13 @@ pub impl f32: IntConsts { } pub impl f32: FloatConsts { + #[inline(always)] static pure fn two_pi() -> f32 { 6.28318530717958647692528676655900576_f32 } #[inline(always)] static pure fn pi() -> f32 { 3.14159265358979323846264338327950288_f32 } + #[inline(always)] static pure fn pi_2() -> f32 { 1.57079632679489661923132169163975144_f32 } + #[inline(always)] static pure fn pi_3() -> f32 { 1.04719755119659774615421446109316763_f32 } + #[inline(always)] static pure fn pi_4() -> f32 { 0.78539816339744830961566084581987572_f32 } + #[inline(always)] static pure fn pi_6() -> f32 { 0.52359877559829887307710723054658381_f32 } + #[inline(always)] static pure fn pi_8() -> f32 { 0.39269908169872415480783042290993786_f32 } #[inline(always)] static pure fn frac_pi_2() -> f32 { 1.57079632679489661923132169163975144_f32 } #[inline(always)] static pure fn frac_pi_4() -> f32 { 0.785398163397448309615660845819875721_f32 } #[inline(always)] static pure fn frac_1_pi() -> f32 { 0.318309886183790671537767526745028724_f32 } @@ -96,7 +108,13 @@ pub impl f64: IntConsts { } pub impl f64: FloatConsts { + #[inline(always)] static pure fn two_pi() -> f64 { 6.28318530717958647692528676655900576_f64 } #[inline(always)] static pure fn pi() -> f64 { 3.14159265358979323846264338327950288_f64 } + #[inline(always)] static pure fn pi_2() -> f64 { 1.57079632679489661923132169163975144_f64 } + #[inline(always)] static pure fn pi_3() -> f64 { 1.04719755119659774615421446109316763_f64 } + #[inline(always)] static pure fn pi_4() -> f64 { 0.78539816339744830961566084581987572_f64 } + #[inline(always)] static pure fn pi_6() -> f64 { 0.52359877559829887307710723054658381_f64 } + #[inline(always)] static pure fn pi_8() -> f64 { 0.39269908169872415480783042290993786_f64 } #[inline(always)] static pure fn frac_pi_2() -> f64 { 1.57079632679489661923132169163975144_f64 } #[inline(always)] static pure fn frac_pi_4() -> f64 { 0.785398163397448309615660845819875721_f64 } #[inline(always)] static pure fn frac_1_pi() -> f64 { 0.318309886183790671537767526745028724_f64 } @@ -117,7 +135,13 @@ pub impl float: IntConsts { } pub impl float: FloatConsts { + #[inline(always)] static pure fn two_pi() -> float { 6.28318530717958647692528676655900576 } #[inline(always)] static pure fn pi() -> float { 3.14159265358979323846264338327950288 } + #[inline(always)] static pure fn pi_2() -> float { 1.57079632679489661923132169163975144 } + #[inline(always)] static pure fn pi_3() -> float { 1.04719755119659774615421446109316763 } + #[inline(always)] static pure fn pi_4() -> float { 0.78539816339744830961566084581987572 } + #[inline(always)] static pure fn pi_6() -> float { 0.52359877559829887307710723054658381 } + #[inline(always)] static pure fn pi_8() -> float { 0.39269908169872415480783042290993786 } #[inline(always)] static pure fn frac_pi_2() -> float { 1.57079632679489661923132169163975144 } #[inline(always)] static pure fn frac_pi_4() -> float { 0.785398163397448309615660845819875721 } #[inline(always)] static pure fn frac_1_pi() -> float { 0.318309886183790671537767526745028724 }