1 |
1 |
2 use core::f64; |
2 use core::f64; |
3 |
3 |
4 use alg_tools::loc::Loc; |
4 use alg_tools::loc::Loc; |
5 use alg_tools::norms::{Norm, L2}; |
5 use alg_tools::norms::{Norm, L2}; |
6 use crate::manifold::ManifoldPoint; |
6 use crate::manifold::{ManifoldPoint, EmbeddedManifoldPoint}; |
7 |
7 |
8 #[derive(Copy, Clone, Debug, Eq, PartialEq)] |
8 #[derive(Copy, Clone, Debug, Eq, PartialEq)] |
9 pub enum Face {F1, F2, F3, F4, F5, F6} |
9 pub enum Face {F1, F2, F3, F4, F5, F6} |
10 use Face::*; |
10 use Face::*; |
11 |
11 |
181 (Greater, _) => self.adjacent_faces()[1], |
181 (Greater, _) => self.adjacent_faces()[1], |
182 (Equal, Less) => self.adjacent_faces()[2], |
182 (Equal, Less) => self.adjacent_faces()[2], |
183 (Equal, Greater) => self.adjacent_faces()[3], |
183 (Equal, Greater) => self.adjacent_faces()[3], |
184 } |
184 } |
185 } |
185 } |
|
186 |
|
187 /// Get embedded 3D coordinates |
|
188 pub fn embedded_coords(&self, p : &Point) -> Loc<f64, 3> { |
|
189 let &Loc([x, y]) = p; |
|
190 Loc(match *self { |
|
191 F1 => [x, y, 0.0], |
|
192 F2 => [1.0, x, y], |
|
193 F3 => [0.0, 1.0-x, y], |
|
194 F4 => [x, 0.0, y], |
|
195 F5 => [1.0 - x, 1.0, y], |
|
196 F6 => [x, y, 1.0], |
|
197 }) |
|
198 } |
186 } |
199 } |
187 |
200 |
188 #[derive(Clone, Debug, PartialEq)] |
201 #[derive(Clone, Debug, PartialEq)] |
189 pub struct OnCube { |
202 pub struct OnCube { |
190 face : Face, |
203 face : Face, |
191 point : Point, |
204 point : Point, |
192 } |
205 } |
193 |
206 |
194 impl OnCube { |
207 impl OnCube { |
|
208 /// Creates a new point on the cube, given a face and face-relative coordinates |
|
209 /// in [0, 1]^2 |
|
210 pub fn new(face : Face, point : Point) -> Self { |
|
211 assert!(face.is_in_face(&point)); |
|
212 OnCube { face, point } |
|
213 } |
|
214 |
195 /// Calculates both the logarithmic map and distance to another point |
215 /// Calculates both the logarithmic map and distance to another point |
196 fn log_dist(&self, other : &Self) -> (<Self as ManifoldPoint>::Tangent, f64) { |
216 fn log_dist(&self, other : &Self) -> (<Self as ManifoldPoint>::Tangent, f64) { |
197 let mut best_len = f64::INFINITY; |
217 let mut best_len = f64::INFINITY; |
198 let mut best_tan = Loc([0.0, 0.0]); |
218 let mut best_tan = Loc([0.0, 0.0]); |
199 for path in self.face.paths(other.face) { |
219 for path in self.face.paths(other.face) { |
206 } |
226 } |
207 (best_tan, best_len) |
227 (best_tan, best_len) |
208 } |
228 } |
209 } |
229 } |
210 |
230 |
|
231 |
|
232 impl EmbeddedManifoldPoint for OnCube { |
|
233 type EmbeddedCoords = Loc<f64, 3>; |
|
234 |
|
235 /// Get embedded 3D coordinates |
|
236 fn embedded_coords(&self) -> Loc<f64, 3> { |
|
237 self.face.embedded_coords(&self.point) |
|
238 } |
|
239 } |
|
240 |
211 impl ManifoldPoint for OnCube { |
241 impl ManifoldPoint for OnCube { |
212 type Tangent = Point; |
242 type Tangent = Point; |
213 |
243 |
214 fn exp(&self, tangent : &Self::Tangent) -> Self { |
244 fn exp(&self, tangent : &Self::Tangent) -> Self { |
215 let mut face = self.face; |
245 let mut face = self.face; |