1use crate::LocCode;
2use std::ops::BitOr;
3
4#[derive(Debug, Clone, Copy)]
6pub enum Orientation {
7 LBU,
8 LFU,
9 LFD,
10 LBD,
11 RBD,
12 RFD,
13 RFU,
14 RBU,
15 N,
16 L,
17 R,
18 F,
19 B,
20 U,
21 D,
22 LF,
23 LB,
24 RF,
25 RB,
26 FU,
27 FD,
28 BU,
29 BD,
30 LU,
31 LD,
32 RU,
33 RD,
34}
35
36type Center = (f64, f64, f64);
37
38impl Orientation {
39 pub fn make_new_center<L>(self, loc_code: L, center: Center) -> Center
40 where
41 L: LocCode,
42 {
43 let offset: f64 = 1.0 / ((2 as u32).pow(loc_code.get_level()) as f64);
44 match self {
45 Self::LBU => (center.0 - offset, center.1 + offset, center.2 - offset),
46 Self::LFU => (center.0 - offset, center.1 + offset, center.2 + offset),
47 Self::LFD => (center.0 - offset, center.1 - offset, center.2 + offset),
48 Self::LBD => (center.0 - offset, center.1 - offset, center.2 - offset),
49 Self::RBD => (center.0 + offset, center.1 - offset, center.2 - offset),
50 Self::RFD => (center.0 + offset, center.1 - offset, center.2 + offset),
51 Self::RFU => (center.0 + offset, center.1 + offset, center.2 + offset),
52 Self::RBU => (center.0 + offset, center.1 + offset, center.2 - offset),
53 _ => center,
54 }
55 }
56}
57
58impl Into<u8> for Orientation {
60 fn into(self) -> u8 {
61 match self {
62 Self::LBU => 0,
63 Self::LFU => 1,
64 Self::LFD => 2,
65 Self::LBD => 3,
66 Self::RBD => 4,
67 Self::RFD => 5,
68 Self::RFU => 6,
69 Self::RBU => 7,
70 _ => 8,
71 }
72 }
73}
74
75impl BitOr for Orientation {
76 type Output = Self;
77
78 fn bitor(self, rh: Self) -> Self {
79 match (&self, &rh) {
80 (Self::L, Self::F) => Self::LF,
82 (Self::L, Self::B) => Self::LB,
83 (Self::R, Self::F) => Self::RF,
84 (Self::R, Self::B) => Self::RB,
85 (Self::F, Self::L) => Self::LF,
86 (Self::F, Self::R) => Self::RF,
87 (Self::B, Self::L) => Self::LB,
88 (Self::B, Self::R) => Self::RB,
89
90 (Self::F, Self::U) => Self::FU,
92 (Self::F, Self::D) => Self::FD,
93 (Self::B, Self::U) => Self::BU,
94 (Self::B, Self::D) => Self::BD,
95 (Self::U, Self::F) => Self::FU,
96 (Self::U, Self::B) => Self::BU,
97 (Self::D, Self::F) => Self::FD,
98 (Self::D, Self::B) => Self::BD,
99
100 (Self::L, Self::U) => Self::LU,
102 (Self::L, Self::D) => Self::LD,
103 (Self::R, Self::U) => Self::RU,
104 (Self::R, Self::D) => Self::RD,
105 (Self::U, Self::L) => Self::LU,
106 (Self::U, Self::R) => Self::RU,
107 (Self::D, Self::L) => Self::LD,
108 (Self::D, Self::R) => Self::RD,
109
110 (Self::LF, Self::U) => Self::LFU,
112 (Self::LF, Self::D) => Self::LFD,
113 (Self::LB, Self::U) => Self::LBU,
114 (Self::LB, Self::D) => Self::LBD,
115 (Self::RF, Self::U) => Self::RFU,
116 (Self::RF, Self::D) => Self::RFD,
117 (Self::RB, Self::U) => Self::RBU,
118 (Self::RB, Self::D) => Self::RBD,
119 (Self::U, Self::LF) => Self::LFU,
120 (Self::U, Self::LB) => Self::LBU,
121 (Self::U, Self::RF) => Self::RFU,
122 (Self::U, Self::RB) => Self::RBU,
123 (Self::D, Self::LF) => Self::LFD,
124 (Self::D, Self::LB) => Self::LBD,
125 (Self::D, Self::RF) => Self::RFD,
126 (Self::D, Self::RB) => Self::RBD,
127
128 (Self::FU, Self::L) => Self::LFU,
130 (Self::FU, Self::R) => Self::RFU,
131 (Self::FD, Self::L) => Self::LFD,
132 (Self::FD, Self::R) => Self::RFD,
133 (Self::BU, Self::L) => Self::LBU,
134 (Self::BU, Self::R) => Self::RBU,
135 (Self::BD, Self::L) => Self::LBD,
136 (Self::BD, Self::R) => Self::RBD,
137 (Self::L, Self::FU) => Self::LFU,
138 (Self::L, Self::FD) => Self::LFD,
139 (Self::L, Self::BU) => Self::LBU,
140 (Self::L, Self::BD) => Self::LBD,
141 (Self::R, Self::FU) => Self::RFU,
142 (Self::R, Self::FD) => Self::RFD,
143 (Self::R, Self::BU) => Self::RBU,
144 (Self::R, Self::BD) => Self::RBD,
145
146 (Self::LU, Self::F) => Self::LFU,
148 (Self::LU, Self::B) => Self::LBU,
149 (Self::LD, Self::F) => Self::LFD,
150 (Self::LD, Self::B) => Self::LBD,
151 (Self::RU, Self::F) => Self::RFU,
152 (Self::RU, Self::B) => Self::RBU,
153 (Self::RD, Self::F) => Self::RFD,
154 (Self::RD, Self::B) => Self::RBD,
155 (Self::F, Self::LU) => Self::LFU,
156 (Self::F, Self::LD) => Self::LFD,
157 (Self::F, Self::RU) => Self::RFU,
158 (Self::F, Self::RD) => Self::RFD,
159 (Self::B, Self::LU) => Self::LBU,
160 (Self::B, Self::LD) => Self::LBD,
161 (Self::B, Self::RU) => Self::RBU,
162 (Self::B, Self::RD) => Self::RBD,
163
164 (Self::N, _) => rh,
166 _ => self,
167 }
168 }
169}