turtle_svg/
angle.rs

1use crate::models::range_model::Range;
2
3/// Angle type, in degrees by default
4#[derive(Clone, Copy)]
5pub struct Angle(pub f64);
6
7impl Angle {
8    fn set(&mut self, value: f64) {
9        self.0 = value;
10
11        if self.is_in_range() == false {
12            self.0 %= Self::MAX;
13        }
14    }
15
16    /// Set the value with a value in degrees
17    pub fn set_degrees(&mut self, value: f64) {
18        self.set(value);
19    }
20
21    /// Set the value with a value in radian
22    pub fn set_radian(&mut self, value: f64) {
23        self.set(value.to_degrees());
24    }
25
26    /// Get the value with a value in degress
27    pub fn degrees(&self) -> f64 {
28        self.0
29    }
30
31    /// Get the value with a value in radian
32    pub fn radian(&self) -> f64 {
33        self.0.to_radians()
34    }
35}
36
37impl Range<f64> for Angle {
38    const MIN: f64 = 0.;
39    const MAX: f64 = 360.;
40
41    fn is_in_range(&self) -> bool {
42        self.degrees() >= Self::MIN && self.degrees() <= Self::MAX
43    }
44}
45
46impl Into<Angle> for f64 {
47    fn into(self) -> Angle {
48        let angle = Angle(self);
49
50        if angle.is_in_range() == false {
51            return Angle(self % Self::MAX);
52        }
53
54        angle
55    }
56}