diff options
Diffstat (limited to 'core')
| -rw-r--r-- | core/Cargo.toml | 1 | ||||
| -rw-r--r-- | core/src/angle.rs | 45 | 
2 files changed, 43 insertions, 3 deletions
| diff --git a/core/Cargo.toml b/core/Cargo.toml index 8859e91e..7acb7511 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -15,6 +15,7 @@ bitflags.workspace = true  log.workspace = true  thiserror.workspace = true  twox-hash.workspace = true +num-traits.workspace = true  palette.workspace = true  palette.optional = true diff --git a/core/src/angle.rs b/core/src/angle.rs index 75a57c76..91fc2ba7 100644 --- a/core/src/angle.rs +++ b/core/src/angle.rs @@ -1,17 +1,56 @@  use crate::{Point, Rectangle, Vector}; +  use std::f32::consts::PI; +use std::ops::RangeInclusive; -#[derive(Debug, Copy, Clone, PartialEq)]  /// Degrees +#[derive(Debug, Copy, Clone, PartialEq, PartialOrd)]  pub struct Degrees(pub f32); -#[derive(Debug, Copy, Clone, PartialEq)]  /// Radians +#[derive(Debug, Copy, Clone, PartialEq, PartialOrd)]  pub struct Radians(pub f32); +impl Radians { +    /// The range of radians of a circle. +    pub const RANGE: RangeInclusive<Radians> = Radians(0.0)..=Radians(2.0 * PI); +} +  impl From<Degrees> for Radians {      fn from(degrees: Degrees) -> Self { -        Radians(degrees.0 * PI / 180.0) +        Self(degrees.0 * PI / 180.0) +    } +} + +impl From<f32> for Radians { +    fn from(radians: f32) -> Self { +        Self(radians) +    } +} + +impl From<u8> for Radians { +    fn from(radians: u8) -> Self { +        Self(f32::from(radians)) +    } +} + +impl From<Radians> for f64 { +    fn from(radians: Radians) -> Self { +        Self::from(radians.0) +    } +} + +impl num_traits::FromPrimitive for Radians { +    fn from_i64(n: i64) -> Option<Self> { +        Some(Self(n as f32)) +    } + +    fn from_u64(n: u64) -> Option<Self> { +        Some(Self(n as f32)) +    } + +    fn from_f64(n: f64) -> Option<Self> { +        Some(Self(n as f32))      }  } | 
