devela/geom/dir/angle/
kind.rs1use crate::{FloatConst, Interval};
7
8#[doc = crate::_tags!(geom)]
9#[doc = crate::_doc_meta!{location("num/geom/dir")}]
11#[must_use]
14#[repr(u8)]
15#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, PartialOrd, Hash)]
16pub enum AngleKind {
17 #[default]
19 Full,
20
21 Acute,
23
24 Right,
26
27 Obtuse,
29
30 Straight,
32
33 Reflex,
35}
36
37impl AngleKind {
38 pub fn interval_deg(self) -> Interval<u16> {
40 use AngleKind as K;
41 match self {
42 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), }
49 }
50
51 pub fn interval_gra(self) -> Interval<u16> {
53 use AngleKind as K;
54 match self {
55 K::Full => Interval::closed(0, 0),
56 K::Acute => Interval::open(0, 100),
57 K::Right => Interval::closed(100, 100),
58 K::Obtuse => Interval::open(100, 200),
59 K::Straight => Interval::closed(200, 200),
60 K::Reflex => Interval::open(200, 400),
61 }
62 }
63
64 pub fn interval_rad(self) -> Interval<f32> {
66 const PI: f32 = f32::PI;
67 use AngleKind as K;
68 match self {
69 K::Full => Interval::closed(0.0, 0.0),
70 K::Acute => Interval::open(0.0, PI / 2.0),
71 K::Right => Interval::closed(PI / 2.0, PI / 2.0),
72 K::Obtuse => Interval::open(PI / 2.0, PI),
73 K::Straight => Interval::closed(PI, PI),
74 K::Reflex => Interval::open(PI, 2.0 * PI),
75 }
76 }
77
78 pub fn interval_u8(self) -> Interval<u8> {
80 use AngleKind as K;
81 match self {
82 K::Full => Interval::closed(0, 0),
83 K::Acute => Interval::open(0, 64),
84 K::Right => Interval::closed(64, 64),
85 K::Obtuse => Interval::open(64, 128),
86 K::Straight => Interval::closed(128, 128),
87 K::Reflex => Interval::open(128, 255),
88 }
89 }
90}