1use crate::models::range_model::Range;
2
3#[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 pub fn set_degrees(&mut self, value: f64) {
18 self.set(value);
19 }
20
21 pub fn set_radian(&mut self, value: f64) {
23 self.set(value.to_degrees());
24 }
25
26 pub fn degrees(&self) -> f64 {
28 self.0
29 }
30
31 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}