devela/num/geom/metric/angle/
kind.rs
1use crate::{ExtFloatConst, Interval};
7
8#[must_use]
12#[repr(u8)]
13#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, PartialOrd, Hash)]
14pub enum AngleKind {
15 #[default]
17 Full,
18
19 Acute,
21
22 Right,
24
25 Obtuse,
27
28 Straight,
30
31 Reflex,
33}
34
35impl AngleKind {
36 pub fn interval_deg(self) -> Interval<u16> {
38 use AngleKind as K;
39 match self {
40 K::Full => Interval::closed(0, 0), K::Acute => Interval::open(0, 90), K::Right => Interval::closed(90, 90), K::Obtuse => Interval::open(90, 180), K::Straight => Interval::closed(180, 180), K::Reflex => Interval::open(180, 360), }
47 }
48
49 pub fn interval_gra(self) -> Interval<u16> {
51 use AngleKind as K;
52 match self {
53 K::Full => Interval::closed(0, 0),
54 K::Acute => Interval::open(0, 100),
55 K::Right => Interval::closed(100, 100),
56 K::Obtuse => Interval::open(100, 200),
57 K::Straight => Interval::closed(200, 200),
58 K::Reflex => Interval::open(200, 400),
59 }
60 }
61
62 pub fn interval_rad(self) -> Interval<f32> {
64 const PI: f32 = f32::PI;
65 use AngleKind as K;
66 match self {
67 K::Full => Interval::closed(0.0, 0.0),
68 K::Acute => Interval::open(0.0, PI / 2.0),
69 K::Right => Interval::closed(PI / 2.0, PI / 2.0),
70 K::Obtuse => Interval::open(PI / 2.0, PI),
71 K::Straight => Interval::closed(PI, PI),
72 K::Reflex => Interval::open(PI, 2.0 * PI),
73 }
74 }
75
76 pub fn interval_u8(self) -> Interval<u8> {
78 use AngleKind as K;
79 match self {
80 K::Full => Interval::closed(0, 0),
81 K::Acute => Interval::open(0, 64),
82 K::Right => Interval::closed(64, 64),
83 K::Obtuse => Interval::open(64, 128),
84 K::Straight => Interval::closed(128, 128),
85 K::Reflex => Interval::open(128, 255),
86 }
87 }
88}