1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
use super::InversePredictionTransformImpl;
use crate::core::shared::{DataValue, NdVector, Vector};
use crate::decode::attribute::portabilization::Deportabilization;
use crate::prelude::ByteReader;
use crate::shared::attribute::Portable;
pub(crate) struct OctahedronOrthogonalInverseTransform<Data>
where Data: Vector + Portable,
{
deportabilization: Deportabilization<<Self as InversePredictionTransformImpl>::Correction>,
_marker: std::marker::PhantomData<Data>,
}
impl<Data> InversePredictionTransformImpl for OctahedronOrthogonalInverseTransform<Data>
where
Data: Vector + Portable,
Data::Component: DataValue
{
const ID: usize = 3;
type Data = Data;
type Correction = NdVector<2,f64>;
type Metadata = ();
fn new<R>(reader: &mut R) -> Result<Self, super::Err>
where R: ByteReader
{
let deportabilization = Deportabilization::new(reader)?;
Ok(
Self {
_marker: std::marker::PhantomData,
deportabilization,
}
)
}
fn inverse<R>(&self, mut pred: Self::Data, reader: &mut R) -> Self::Data
where R: ByteReader
{
unimplemented!();
// // Safety:
// // We made sure that the data is three dimensional.
// debug_assert!(
// Data::NUM_COMPONENTS == 3,
// );
// let mut reflected = false;
// let quadrant;
// unsafe {
// if *pred.get_unchecked(2) < Data::Component::zero() {
// reflected = true;
// let minus_one = Data::Component::from_f64(-1.0);
// *pred.get_unchecked_mut(2) *= minus_one;
// }
// if *pred.get_unchecked(0) > Data::Component::zero() {
// if *pred.get_unchecked(1) > Data::Component::zero() {
// // first quadrant. Rotate around z-axis by pi.
// quadrant = 1;
// let minus_one = Data::Component::from_f64(-1.0);
// *pred.get_unchecked_mut(0) *= minus_one;
// *pred.get_unchecked_mut(1) *= minus_one;
// } else {
// // fourth quadrant. Rotate around z-axis by -pi/2.
// quadrant = 4;
// let temp = *pred.get_unchecked(0);
// let one = Data::Component::one();
// let minus_one = Data::Component::zero() - one;
// *pred.get_unchecked_mut(0) = *pred.get_unchecked(1);
// *pred.get_unchecked_mut(1) = temp * minus_one;
// }
// } else {
// if *pred.get_unchecked(1) > Data::Component::zero() {
// // second quadrant. Rotate around z-axis by pi/2.
// quadrant = 2;
// let temp = *pred.get_unchecked(0);
// let one = Data::Component::one();
// let minus_one = Data::Component::zero() - one;
// *pred.get_unchecked_mut(0) = *pred.get_unchecked(1) * minus_one;
// *pred.get_unchecked_mut(1) = temp;
// } else {
// // third quadrant will not be transformed.
// quadrant = 3;
// }
// };
// }
// let pred_in_oct = unsafe {
// octahedral_transform(pred)
// };
// let orig = pred_in_oct + crr;
// unsafe{
// if *pred.get_unchecked(2) < Data::Component::zero() {
// let minus_one = Data::Component::from_f64(-1.0);
// *pred.get_unchecked_mut(2) *= minus_one;
// }
// }
// // Safety:
// // We made sure that the data is three dimensional.
// let mut orig: Data = unsafe {
// octahedral_inverse_transform(orig)
// };
// // pull back the transformation
// // Safety:
// // We made sure that the data is three dimensional.
// unsafe {
// if quadrant == 1 {
// let minus_one = Data::Component::from_f64(-1.0);
// *orig.get_unchecked_mut(0) *= minus_one;
// *orig.get_unchecked_mut(1) *= minus_one;
// } else if quadrant == 2 {
// // rotate around z-axis by -pi/2
// let temp = *orig.get_unchecked(0);
// let one = Data::Component::one();
// let minus_one = Data::Component::zero() - one;
// *orig.get_unchecked_mut(0) = *orig.get_unchecked(1) * minus_one;
// *orig.get_unchecked_mut(1) = temp;
// } else if quadrant == 4 {
// // rotate around z-axis by pi/2
// let temp = *orig.get_unchecked(0);
// let one = Data::Component::one();
// let minus_one = Data::Component::zero() - one;
// *orig.get_unchecked_mut(0) = *orig.get_unchecked(1);
// *orig.get_unchecked_mut(1) = temp * minus_one;
// }
// if reflected {
// let minus_one = Data::Component::from_f64(-1.0);
// *orig.get_unchecked_mut(2) *= minus_one;
// }
// }
// orig
}
}