Use absolute values for radian constants

This commit is contained in:
Brendan Zabarauskas 2012-12-02 16:18:39 +10:00
parent 90802b1713
commit 3a48006ba7
2 changed files with 34 additions and 9 deletions

View file

@ -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<T>: Add<self,self>
pub enum Radians<T> = T;
// FIXME: not sure why I need the Eq and Ord trait bounds, but Rust complains if I don't include them
pub impl<T:Copy Num NumCast Eq Ord> Radians<T>: Angle<T> {
#[inline(always)] static pure fn full_turn() -> Radians<T> { Radians(cast(2.0 * pi)) } // TODO: calculate absolute values
#[inline(always)] static pure fn half_turn() -> Radians<T> { Radians(cast(pi)) }
#[inline(always)] static pure fn quadrant() -> Radians<T> { Radians(cast(pi / 2.0)) }
#[inline(always)] static pure fn sextant() -> Radians<T> { Radians(cast(pi / 3.0)) }
#[inline(always)] static pure fn octant() -> Radians<T> { Radians(cast(pi / 4.0)) }
#[inline(always)] static pure fn zero() -> Radians<T> { Radians(cast(0.0)) }
pub impl<T:Copy FloatConsts Num NumCast Eq Ord> Radians<T>: Angle<T> {
#[inline(always)] static pure fn full_turn() -> Radians<T> { Radians(FloatConsts::two_pi()) }
#[inline(always)] static pure fn half_turn() -> Radians<T> { Radians(FloatConsts::pi()) }
#[inline(always)] static pure fn quadrant() -> Radians<T> { Radians(FloatConsts::pi_2()) }
#[inline(always)] static pure fn sextant() -> Radians<T> { Radians(FloatConsts::pi_3()) }
#[inline(always)] static pure fn octant() -> Radians<T> { Radians(FloatConsts::pi_4()) }
#[inline(always)] static pure fn zero() -> Radians<T> { Radians(NumCast::zero()) }
#[inline(always)] pure fn to_radians(&self) -> Radians<T> { *self }
#[inline(always)] pure fn to_degrees(&self) -> Degrees<T> { Degrees(**self * cast(180.0 / pi)) }

View file

@ -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 }