src/cube.rs

Mon, 31 Mar 2025 21:02:35 -0500

author
Tuomo Valkonen <tuomov@iki.fi>
date
Mon, 31 Mar 2025 21:02:35 -0500
changeset 64
706ffa443214
parent 56
34f8ec636368
permissions
-rw-r--r--

arXiv link

13
f67949050a32 documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 12
diff changeset
1 /*!
f67949050a32 documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 12
diff changeset
2 Implementation of the surface of the 3D cube as a [`ManifoldPoint`].
f67949050a32 documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 12
diff changeset
3 */
0
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
4
12
3b05a8b45b95 Save log to a CSV file
Tuomo Valkonen <tuomov@iki.fi>
parents: 11
diff changeset
5 use serde_repr::*;
3b05a8b45b95 Save log to a CSV file
Tuomo Valkonen <tuomov@iki.fi>
parents: 11
diff changeset
6 use serde::Serialize;
0
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
7 use alg_tools::loc::Loc;
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
8 use alg_tools::norms::{Norm, L2};
56
34f8ec636368 Update to current alg_tools
Tuomo Valkonen <tuomov@iki.fi>
parents: 46
diff changeset
9 use alg_tools::impl_basic_space;
37
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 34
diff changeset
10 use crate::manifold::{EmbeddedManifoldPoint, FacedManifoldPoint, ManifoldPoint};
0
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
11
13
f67949050a32 documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 12
diff changeset
12 /// All the difference faces of a [`OnCube`].
12
3b05a8b45b95 Save log to a CSV file
Tuomo Valkonen <tuomov@iki.fi>
parents: 11
diff changeset
13 #[derive(Copy, Clone, Debug, Eq, PartialEq, Serialize_repr, Deserialize_repr)]
3b05a8b45b95 Save log to a CSV file
Tuomo Valkonen <tuomov@iki.fi>
parents: 11
diff changeset
14 #[repr(u8)]
3b05a8b45b95 Save log to a CSV file
Tuomo Valkonen <tuomov@iki.fi>
parents: 11
diff changeset
15 pub enum Face {F1 = 1, F2 = 2, F3 = 3, F4 = 4, F5 = 5, F6 = 6}
0
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
16 use Face::*;
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
17
46
90cc221eb52b More documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 37
diff changeset
18 /// General point in 2D
0
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
19 pub type Point = Loc<f64, 2>;
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
20
46
90cc221eb52b More documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 37
diff changeset
21 /// Types for faces adjacent to a given face.
0
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
22 pub type AdjacentFaces = [Face; 4];
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
23
46
90cc221eb52b More documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 37
diff changeset
24 /// Types of paths on a cube
12
3b05a8b45b95 Save log to a CSV file
Tuomo Valkonen <tuomov@iki.fi>
parents: 11
diff changeset
25 #[derive(Clone, Debug, Serialize)]
0
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
26 pub enum Path {
46
90cc221eb52b More documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 37
diff changeset
27 /// Direct path from an unindicated source face to a `destination` face.
0
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
28 Direct { destination : Face },
46
90cc221eb52b More documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 37
diff changeset
29 /// Indirect path from an unindicated source face to a `destination` face,
90cc221eb52b More documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 37
diff changeset
30 /// via an `intermediate` face.
0
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
31 Indirect { destination : Face, intermediate : Face },
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
32 }
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
33
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
34 /// An iterator over paths on a cube, from a source face to a destination face.
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
35 #[derive(Clone, Debug)]
34
aa6129697116 Same face path optimisation / possible fix
Tuomo Valkonen <tuomov@iki.fi>
parents: 30
diff changeset
36 pub enum PathIter {
46
90cc221eb52b More documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 37
diff changeset
37 /// Direct path to a destination.
34
aa6129697116 Same face path optimisation / possible fix
Tuomo Valkonen <tuomov@iki.fi>
parents: 30
diff changeset
38 Same {
46
90cc221eb52b More documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 37
diff changeset
39 /// Deistination face
34
aa6129697116 Same face path optimisation / possible fix
Tuomo Valkonen <tuomov@iki.fi>
parents: 30
diff changeset
40 destination : Face,
46
90cc221eb52b More documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 37
diff changeset
41 /// Indicator whether the only possible [`Path::Direct`] has already been returned.
34
aa6129697116 Same face path optimisation / possible fix
Tuomo Valkonen <tuomov@iki.fi>
parents: 30
diff changeset
42 exhausted : bool
aa6129697116 Same face path optimisation / possible fix
Tuomo Valkonen <tuomov@iki.fi>
parents: 30
diff changeset
43 },
46
90cc221eb52b More documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 37
diff changeset
44 /// Path via several possible intermedite faces.
90cc221eb52b More documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 37
diff changeset
45 /// This is used to generate several [`Path::Indirect`].
34
aa6129697116 Same face path optimisation / possible fix
Tuomo Valkonen <tuomov@iki.fi>
parents: 30
diff changeset
46 Indirect {
46
90cc221eb52b More documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 37
diff changeset
47 /// Destination face
34
aa6129697116 Same face path optimisation / possible fix
Tuomo Valkonen <tuomov@iki.fi>
parents: 30
diff changeset
48 destination : Face,
46
90cc221eb52b More documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 37
diff changeset
49 /// Possible intermediate faces
34
aa6129697116 Same face path optimisation / possible fix
Tuomo Valkonen <tuomov@iki.fi>
parents: 30
diff changeset
50 intermediate : AdjacentFaces,
46
90cc221eb52b More documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 37
diff changeset
51 /// Intermediate face index counter.
34
aa6129697116 Same face path optimisation / possible fix
Tuomo Valkonen <tuomov@iki.fi>
parents: 30
diff changeset
52 current : usize
aa6129697116 Same face path optimisation / possible fix
Tuomo Valkonen <tuomov@iki.fi>
parents: 30
diff changeset
53 }
0
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
54 }
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
55
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
56 impl std::iter::Iterator for PathIter {
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
57 type Item = Path;
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
58
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
59 fn next(&mut self) -> Option<Self::Item> {
34
aa6129697116 Same face path optimisation / possible fix
Tuomo Valkonen <tuomov@iki.fi>
parents: 30
diff changeset
60 match *self {
aa6129697116 Same face path optimisation / possible fix
Tuomo Valkonen <tuomov@iki.fi>
parents: 30
diff changeset
61 PathIter::Same { destination, ref mut exhausted } => {
aa6129697116 Same face path optimisation / possible fix
Tuomo Valkonen <tuomov@iki.fi>
parents: 30
diff changeset
62 if !*exhausted {
aa6129697116 Same face path optimisation / possible fix
Tuomo Valkonen <tuomov@iki.fi>
parents: 30
diff changeset
63 *exhausted = true;
aa6129697116 Same face path optimisation / possible fix
Tuomo Valkonen <tuomov@iki.fi>
parents: 30
diff changeset
64 return Some(Path::Direct { destination })
aa6129697116 Same face path optimisation / possible fix
Tuomo Valkonen <tuomov@iki.fi>
parents: 30
diff changeset
65 }
aa6129697116 Same face path optimisation / possible fix
Tuomo Valkonen <tuomov@iki.fi>
parents: 30
diff changeset
66 None
aa6129697116 Same face path optimisation / possible fix
Tuomo Valkonen <tuomov@iki.fi>
parents: 30
diff changeset
67 },
aa6129697116 Same face path optimisation / possible fix
Tuomo Valkonen <tuomov@iki.fi>
parents: 30
diff changeset
68 PathIter::Indirect { destination, intermediate : ref i, ref mut current } => {
aa6129697116 Same face path optimisation / possible fix
Tuomo Valkonen <tuomov@iki.fi>
parents: 30
diff changeset
69 while *current < i.len() {
aa6129697116 Same face path optimisation / possible fix
Tuomo Valkonen <tuomov@iki.fi>
parents: 30
diff changeset
70 let intermediate = i[*current];
aa6129697116 Same face path optimisation / possible fix
Tuomo Valkonen <tuomov@iki.fi>
parents: 30
diff changeset
71 *current += 1;
aa6129697116 Same face path optimisation / possible fix
Tuomo Valkonen <tuomov@iki.fi>
parents: 30
diff changeset
72 if intermediate == destination {
aa6129697116 Same face path optimisation / possible fix
Tuomo Valkonen <tuomov@iki.fi>
parents: 30
diff changeset
73 return Some(Path::Direct { destination })
aa6129697116 Same face path optimisation / possible fix
Tuomo Valkonen <tuomov@iki.fi>
parents: 30
diff changeset
74 } else if intermediate != destination.opposing_face() {
aa6129697116 Same face path optimisation / possible fix
Tuomo Valkonen <tuomov@iki.fi>
parents: 30
diff changeset
75 return Some(Path::Indirect{ destination, intermediate })
aa6129697116 Same face path optimisation / possible fix
Tuomo Valkonen <tuomov@iki.fi>
parents: 30
diff changeset
76 }
aa6129697116 Same face path optimisation / possible fix
Tuomo Valkonen <tuomov@iki.fi>
parents: 30
diff changeset
77 // Paths should never go through a face opposing the destination.
aa6129697116 Same face path optimisation / possible fix
Tuomo Valkonen <tuomov@iki.fi>
parents: 30
diff changeset
78 }
aa6129697116 Same face path optimisation / possible fix
Tuomo Valkonen <tuomov@iki.fi>
parents: 30
diff changeset
79 None
0
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
80 }
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
81 }
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
82 }
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
83 }
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
84
11
933242e0f3b8 Basic face image export
Tuomo Valkonen <tuomov@iki.fi>
parents: 10
diff changeset
85 impl std::fmt::Display for Face {
933242e0f3b8 Basic face image export
Tuomo Valkonen <tuomov@iki.fi>
parents: 10
diff changeset
86 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
933242e0f3b8 Basic face image export
Tuomo Valkonen <tuomov@iki.fi>
parents: 10
diff changeset
87 let s = match *self {
933242e0f3b8 Basic face image export
Tuomo Valkonen <tuomov@iki.fi>
parents: 10
diff changeset
88 F1 => "F1",
933242e0f3b8 Basic face image export
Tuomo Valkonen <tuomov@iki.fi>
parents: 10
diff changeset
89 F2 => "F2",
933242e0f3b8 Basic face image export
Tuomo Valkonen <tuomov@iki.fi>
parents: 10
diff changeset
90 F3 => "F3",
933242e0f3b8 Basic face image export
Tuomo Valkonen <tuomov@iki.fi>
parents: 10
diff changeset
91 F4 => "F4",
933242e0f3b8 Basic face image export
Tuomo Valkonen <tuomov@iki.fi>
parents: 10
diff changeset
92 F5 => "F5",
933242e0f3b8 Basic face image export
Tuomo Valkonen <tuomov@iki.fi>
parents: 10
diff changeset
93 F6 => "F6",
933242e0f3b8 Basic face image export
Tuomo Valkonen <tuomov@iki.fi>
parents: 10
diff changeset
94 };
933242e0f3b8 Basic face image export
Tuomo Valkonen <tuomov@iki.fi>
parents: 10
diff changeset
95 write!(f, "{}", s)
933242e0f3b8 Basic face image export
Tuomo Valkonen <tuomov@iki.fi>
parents: 10
diff changeset
96 }
933242e0f3b8 Basic face image export
Tuomo Valkonen <tuomov@iki.fi>
parents: 10
diff changeset
97 }
0
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
98
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
99 impl Face {
11
933242e0f3b8 Basic face image export
Tuomo Valkonen <tuomov@iki.fi>
parents: 10
diff changeset
100 /// Return an aray of all faces
933242e0f3b8 Basic face image export
Tuomo Valkonen <tuomov@iki.fi>
parents: 10
diff changeset
101 pub fn all() -> [Face; 6] {
933242e0f3b8 Basic face image export
Tuomo Valkonen <tuomov@iki.fi>
parents: 10
diff changeset
102 [F1, F2, F3, F4, F5, F6]
933242e0f3b8 Basic face image export
Tuomo Valkonen <tuomov@iki.fi>
parents: 10
diff changeset
103 }
933242e0f3b8 Basic face image export
Tuomo Valkonen <tuomov@iki.fi>
parents: 10
diff changeset
104
3
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
105 /// Returns an array of the four faces adjacent to `self` in the
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
106 /// order [left, right, down, up] in the `self`-relative unfolding.
0
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
107 pub fn adjacent_faces(&self) -> AdjacentFaces {
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
108 match *self {
3
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
109 F1 => [F3, F2, F4, F5],
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
110 F2 => [F4, F5, F1, F6],
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
111 F3 => [F5, F4, F1, F6],
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
112 F4 => [F3, F2, F1, F6],
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
113 F5 => [F2, F3, F1, F6],
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
114 F6 => [F3, F2, F4, F5],
0
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
115 }
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
116 }
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
117
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
118 /// Returns the face opposing `self`.
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
119 pub fn opposing_face(&self) -> Face {
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
120 match *self {
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
121 F1 => F6,
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
122 F2 => F3,
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
123 F3 => F2,
3
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
124 F4 => F5,
0
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
125 F5 => F4,
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
126 F6 => F1,
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
127 }
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
128 }
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
129
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
130 /// Converts a point on an adjacent face to the coordinate system of `self`.
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
131 pub fn convert_adjacent(&self, adjacent : Face, p: &Point) -> Option<Point> {
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
132 let Loc([x, y]) = *p;
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
133 let mk = |x, y| Some(Loc([x, y]));
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
134 match adjacent {
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
135 F1 => match *self {
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
136 F2 => mk(y, x - 1.0),
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
137 F3 => mk(1.0 - y, -x),
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
138 F4 => mk(x, -y),
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
139 F5 => mk(1.0 - x, y - 1.0),
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
140 F1 => mk(x, y),
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
141 F6 => None,
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
142 },
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
143 F2 => match *self {
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
144 F1 => mk(y + 1.0, x),
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
145 F4 => mk(x + 1.0, y),
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
146 F5 => mk(x - 1.0, y),
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
147 F6 => mk(2.0 - y, x),
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
148 F2 => mk(x, y),
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
149 F3 => None,
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
150 },
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
151 F3 => match *self {
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
152 F1 => mk(-y, 1.0 - x),
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
153 F4 => mk(x - 1.0, y),
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
154 F5 => mk(x + 1.0, y),
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
155 F6 => mk(y - 1.0, 1.0 - x),
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
156 F3 => mk(x, y),
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
157 F2 => None,
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
158 },
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
159 F4 => match *self {
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
160 F1 => mk(x, -y),
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
161 F2 => mk(x - 1.0, y),
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
162 F3 => mk(x + 1.0, y),
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
163 F6 => mk(x, y - 1.0),
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
164 F4 => mk(x, y),
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
165 F5 => None,
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
166 },
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
167 F5 => match *self {
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
168 F1 => mk(1.0 -x, y + 1.0),
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
169 F2 => mk(x + 1.0, y),
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
170 F3 => mk(x - 1.0, y),
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
171 F6 => mk(1.0 -x, 2.0 - y),
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
172 F5 => mk(x, y),
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
173 F4 => None,
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
174 },
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
175 F6 => match *self {
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
176 F2 => mk(y, 2.0 - x),
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
177 F3 => mk(1.0 - y, x + 1.0),
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
178 F4 => mk(x, y + 1.0),
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
179 F5 => mk(1.0 - x, 2.0 - y),
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
180 F6 => mk(x, y),
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
181 F1 => None,
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
182 }
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
183 }
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
184 }
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
185
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
186 /// Converts a point behind a path to the coordinate system of `self`.
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
187 pub fn convert(&self, path : &Path, p: &Point) -> Point {
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
188 use Path::*;
3
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
189 //dbg!(*self, path);
0
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
190 match path {
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
191 &Direct{ destination : d} => self.convert_adjacent(d, p),
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
192 &Indirect{ destination : d, intermediate : i }
3
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
193 => {self.convert_adjacent(i, &i.convert_adjacent(d, p).unwrap())}
0
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
194 }.unwrap()
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
195 }
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
196
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
197
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
198 /// Returns an iterator over all the paths from `self` to `other`.
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
199 fn paths(&self, other : Face) -> PathIter {
34
aa6129697116 Same face path optimisation / possible fix
Tuomo Valkonen <tuomov@iki.fi>
parents: 30
diff changeset
200 if other == *self {
aa6129697116 Same face path optimisation / possible fix
Tuomo Valkonen <tuomov@iki.fi>
parents: 30
diff changeset
201 PathIter::Same {
aa6129697116 Same face path optimisation / possible fix
Tuomo Valkonen <tuomov@iki.fi>
parents: 30
diff changeset
202 destination : other,
aa6129697116 Same face path optimisation / possible fix
Tuomo Valkonen <tuomov@iki.fi>
parents: 30
diff changeset
203 exhausted : false
aa6129697116 Same face path optimisation / possible fix
Tuomo Valkonen <tuomov@iki.fi>
parents: 30
diff changeset
204 }
aa6129697116 Same face path optimisation / possible fix
Tuomo Valkonen <tuomov@iki.fi>
parents: 30
diff changeset
205 } else {
aa6129697116 Same face path optimisation / possible fix
Tuomo Valkonen <tuomov@iki.fi>
parents: 30
diff changeset
206 PathIter::Indirect {
aa6129697116 Same face path optimisation / possible fix
Tuomo Valkonen <tuomov@iki.fi>
parents: 30
diff changeset
207 intermediate : self.adjacent_faces(),
aa6129697116 Same face path optimisation / possible fix
Tuomo Valkonen <tuomov@iki.fi>
parents: 30
diff changeset
208 destination : other,
aa6129697116 Same face path optimisation / possible fix
Tuomo Valkonen <tuomov@iki.fi>
parents: 30
diff changeset
209 current : 0
aa6129697116 Same face path optimisation / possible fix
Tuomo Valkonen <tuomov@iki.fi>
parents: 30
diff changeset
210 }
0
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
211 }
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
212 }
3
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
213
13
f67949050a32 documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 12
diff changeset
214 /// Indicates whether an unfolded point `p` is on this face, i.e.,
46
90cc221eb52b More documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 37
diff changeset
215 /// has coordinates in $\[0,1\]^2$.
3
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
216 pub fn is_in_face(&self, p: &Point) -> bool {
14
d0f20c6cb49c Fixes to find_crossing and exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
217 p.iter().all(|t| 0.0 <= *t && *t <= 1.0)
3
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
218 }
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
219
14
d0f20c6cb49c Fixes to find_crossing and exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
220 /// Given an unfolded point `p` and a destination point `d` in unfolded coordinates,
d0f20c6cb49c Fixes to find_crossing and exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
221 /// but possibly outside this face, find the crossing point of the line between
d0f20c6cb49c Fixes to find_crossing and exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
222 /// `p` and `d` on an edge of (`self`). Return the point and the edge presented
d0f20c6cb49c Fixes to find_crossing and exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
223 /// by an adjacent face.
13
f67949050a32 documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 12
diff changeset
224 ///
14
d0f20c6cb49c Fixes to find_crossing and exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
225 /// Crossing at corners is decided arbitrarily.
d0f20c6cb49c Fixes to find_crossing and exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
226 pub fn find_crossing(&self, p :& Point, d : &Point) -> (Face, Point) {
d0f20c6cb49c Fixes to find_crossing and exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
227 //assert!(self.is_in_face(p));
d0f20c6cb49c Fixes to find_crossing and exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
228
d0f20c6cb49c Fixes to find_crossing and exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
229 if self.is_in_face(d) {
d0f20c6cb49c Fixes to find_crossing and exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
230 return (*self, *p)
d0f20c6cb49c Fixes to find_crossing and exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
231 }
d0f20c6cb49c Fixes to find_crossing and exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
232
d0f20c6cb49c Fixes to find_crossing and exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
233 use std::cmp::Ordering::*;
d0f20c6cb49c Fixes to find_crossing and exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
234
3
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
235 let &Loc([x, y]) = p;
14
d0f20c6cb49c Fixes to find_crossing and exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
236 let &Loc([xd, yd]) = d;
d0f20c6cb49c Fixes to find_crossing and exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
237 let tx = xd - x;
d0f20c6cb49c Fixes to find_crossing and exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
238 let ty = yd - y;
d0f20c6cb49c Fixes to find_crossing and exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
239
d0f20c6cb49c Fixes to find_crossing and exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
240 // Move towards tangent as (x + s tx, y + s ty) for the largest s<=1.0 for which
15
2f4af30af476 Simplify crossing calculations
Tuomo Valkonen <tuomov@iki.fi>
parents: 14
diff changeset
241 // both coordinates is within [0, 1]. Also gives the direction of move along
2f4af30af476 Simplify crossing calculations
Tuomo Valkonen <tuomov@iki.fi>
parents: 14
diff changeset
242 // each coordinate.
2f4af30af476 Simplify crossing calculations
Tuomo Valkonen <tuomov@iki.fi>
parents: 14
diff changeset
243 let (sx, dirx) = match tx.partial_cmp(&0.0) {
2f4af30af476 Simplify crossing calculations
Tuomo Valkonen <tuomov@iki.fi>
parents: 14
diff changeset
244 Some(Less) => (1.0f64.min(-x/tx), Less),
2f4af30af476 Simplify crossing calculations
Tuomo Valkonen <tuomov@iki.fi>
parents: 14
diff changeset
245 Some(Greater) => (1.0f64.min((1.0-x)/tx), Greater),
2f4af30af476 Simplify crossing calculations
Tuomo Valkonen <tuomov@iki.fi>
parents: 14
diff changeset
246 _ => (1.0, Equal)
14
d0f20c6cb49c Fixes to find_crossing and exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
247 };
15
2f4af30af476 Simplify crossing calculations
Tuomo Valkonen <tuomov@iki.fi>
parents: 14
diff changeset
248 let (sy, diry) = match ty.partial_cmp(&0.0) {
2f4af30af476 Simplify crossing calculations
Tuomo Valkonen <tuomov@iki.fi>
parents: 14
diff changeset
249 Some(Less) => (1.0f64.min(-y/ty), Less),
2f4af30af476 Simplify crossing calculations
Tuomo Valkonen <tuomov@iki.fi>
parents: 14
diff changeset
250 Some(Greater) => (1.0f64.min((1.0-y)/ty), Greater),
2f4af30af476 Simplify crossing calculations
Tuomo Valkonen <tuomov@iki.fi>
parents: 14
diff changeset
251 _ => (1.0, Equal),
3
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
252 };
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
253
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
254 // TODO: how to properly handle corners? Just throw an error?
15
2f4af30af476 Simplify crossing calculations
Tuomo Valkonen <tuomov@iki.fi>
parents: 14
diff changeset
255 let (crossing, c) = match (sx < sy, dirx, diry) {
2f4af30af476 Simplify crossing calculations
Tuomo Valkonen <tuomov@iki.fi>
parents: 14
diff changeset
256 // x move is less than y move, so crossing is either on left or right edge
2f4af30af476 Simplify crossing calculations
Tuomo Valkonen <tuomov@iki.fi>
parents: 14
diff changeset
257 (true, Less, _) => (self.adjacent_faces()[0], sx),
2f4af30af476 Simplify crossing calculations
Tuomo Valkonen <tuomov@iki.fi>
parents: 14
diff changeset
258 (true, Greater, _) => (self.adjacent_faces()[1], sx),
2f4af30af476 Simplify crossing calculations
Tuomo Valkonen <tuomov@iki.fi>
parents: 14
diff changeset
259 (true, Equal, _) => (*self, sx),
2f4af30af476 Simplify crossing calculations
Tuomo Valkonen <tuomov@iki.fi>
parents: 14
diff changeset
260 // y move is less than x move, so crossing is either on bottom or top edge
2f4af30af476 Simplify crossing calculations
Tuomo Valkonen <tuomov@iki.fi>
parents: 14
diff changeset
261 (false, _, Less) => (self.adjacent_faces()[2], sy),
2f4af30af476 Simplify crossing calculations
Tuomo Valkonen <tuomov@iki.fi>
parents: 14
diff changeset
262 (false, _, Greater) => (self.adjacent_faces()[3], sy),
2f4af30af476 Simplify crossing calculations
Tuomo Valkonen <tuomov@iki.fi>
parents: 14
diff changeset
263 (false, _, Equal) => (*self, sy),
14
d0f20c6cb49c Fixes to find_crossing and exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
264 };
15
2f4af30af476 Simplify crossing calculations
Tuomo Valkonen <tuomov@iki.fi>
parents: 14
diff changeset
265 (crossing, Loc([x + c*tx, y + c*ty]))
3
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
266 }
7
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
267
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
268 /// Get embedded 3D coordinates
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
269 pub fn embedded_coords(&self, p : &Point) -> Loc<f64, 3> {
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
270 let &Loc([x, y]) = p;
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
271 Loc(match *self {
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
272 F1 => [x, y, 0.0],
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
273 F2 => [1.0, x, y],
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
274 F3 => [0.0, 1.0-x, y],
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
275 F4 => [x, 0.0, y],
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
276 F5 => [1.0 - x, 1.0, y],
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
277 F6 => [x, y, 1.0],
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
278 })
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
279 }
0
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
280 }
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
281
46
90cc221eb52b More documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 37
diff changeset
282 /// Point on a the surface of the unit cube $\[0,1\]^3$.
12
3b05a8b45b95 Save log to a CSV file
Tuomo Valkonen <tuomov@iki.fi>
parents: 11
diff changeset
283 #[derive(Clone, Debug, PartialEq, Serialize)]
0
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
284 pub struct OnCube {
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
285 face : Face,
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
286 point : Point,
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
287 }
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
288
5
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
289 impl OnCube {
7
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
290 /// Creates a new point on the cube, given a face and face-relative coordinates
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
291 /// in [0, 1]^2
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
292 pub fn new(face : Face, point : Point) -> Self {
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
293 assert!(face.is_in_face(&point));
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
294 OnCube { face, point }
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
295 }
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
296
5
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
297 /// Calculates both the logarithmic map and distance to another point
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
298 fn log_dist(&self, other : &Self) -> (<Self as ManifoldPoint>::Tangent, f64) {
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
299 let mut best_len = f64::INFINITY;
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
300 let mut best_tan = Loc([0.0, 0.0]);
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
301 for path in self.face.paths(other.face) {
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
302 let tan = self.face.convert(&path, &other.point) - &self.point;
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
303 let len = tan.norm(L2);
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
304 if len < best_len {
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
305 best_tan = tan;
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
306 best_len = len;
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
307 }
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
308 }
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
309 (best_tan, best_len)
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
310 }
37
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 34
diff changeset
311 }
12
3b05a8b45b95 Save log to a CSV file
Tuomo Valkonen <tuomov@iki.fi>
parents: 11
diff changeset
312
37
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 34
diff changeset
313 impl FacedManifoldPoint for OnCube {
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 34
diff changeset
314 type Face = Face;
13
f67949050a32 documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 12
diff changeset
315 /// Returns the face of this point.
37
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 34
diff changeset
316 fn face(&self) -> Face {
12
3b05a8b45b95 Save log to a CSV file
Tuomo Valkonen <tuomov@iki.fi>
parents: 11
diff changeset
317 self.face
3b05a8b45b95 Save log to a CSV file
Tuomo Valkonen <tuomov@iki.fi>
parents: 11
diff changeset
318 }
5
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
319 }
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
320
7
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
321
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
322 impl EmbeddedManifoldPoint for OnCube {
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
323 type EmbeddedCoords = Loc<f64, 3>;
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
324
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
325 /// Get embedded 3D coordinates
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
326 fn embedded_coords(&self) -> Loc<f64, 3> {
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
327 self.face.embedded_coords(&self.point)
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
328 }
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
329 }
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
330
0
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
331 impl ManifoldPoint for OnCube {
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
332 type Tangent = Point;
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
333
8
17d71ca4ce84 Make exp consuming
Tuomo Valkonen <tuomov@iki.fi>
parents: 7
diff changeset
334 fn exp(self, tangent : &Self::Tangent) -> Self {
3
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
335 let mut face = self.face;
14
d0f20c6cb49c Fixes to find_crossing and exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
336 let mut point = self.point;
d0f20c6cb49c Fixes to find_crossing and exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
337 let mut dest = self.point + tangent;
3
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
338 loop {
14
d0f20c6cb49c Fixes to find_crossing and exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
339 let (next_face, cross) = face.find_crossing(&point, &dest);
3
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
340 if next_face == face {
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
341 break
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
342 }
14
d0f20c6cb49c Fixes to find_crossing and exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
343 point = next_face.convert_adjacent(face, &cross).unwrap();
d0f20c6cb49c Fixes to find_crossing and exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
344 dest = next_face.convert_adjacent(face, &dest).unwrap();
3
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
345 face = next_face;
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
346 }
14
d0f20c6cb49c Fixes to find_crossing and exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
347 OnCube { face, point : dest }
0
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
348 }
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
349
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
350 fn log(&self, other : &Self) -> Self::Tangent {
5
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
351 self.log_dist(other).0
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
352 }
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
353
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
354 fn dist_to(&self, other : &Self) -> f64 {
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
355 self.log_dist(other).1
0
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
356 }
6
df9628092285 Add a zero function on manifolds
Tuomo Valkonen <tuomov@iki.fi>
parents: 5
diff changeset
357
df9628092285 Add a zero function on manifolds
Tuomo Valkonen <tuomov@iki.fi>
parents: 5
diff changeset
358 fn tangent_origin(&self) -> Self::Tangent {
df9628092285 Add a zero function on manifolds
Tuomo Valkonen <tuomov@iki.fi>
parents: 5
diff changeset
359 Loc([0.0, 0.0])
df9628092285 Add a zero function on manifolds
Tuomo Valkonen <tuomov@iki.fi>
parents: 5
diff changeset
360 }
0
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
361 }
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
362
56
34f8ec636368 Update to current alg_tools
Tuomo Valkonen <tuomov@iki.fi>
parents: 46
diff changeset
363 impl_basic_space!(OnCube);
34f8ec636368 Update to current alg_tools
Tuomo Valkonen <tuomov@iki.fi>
parents: 46
diff changeset
364
34f8ec636368 Update to current alg_tools
Tuomo Valkonen <tuomov@iki.fi>
parents: 46
diff changeset
365
0
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
366 #[cfg(test)]
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
367 mod tests {
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
368 use super::*;
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
369
46
90cc221eb52b More documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 37
diff changeset
370 /// Tests that the distancse between the centers of all the faces are correctly calculated.
0
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
371 #[test]
29
76f9ec073a83 More tests
Tuomo Valkonen <tuomov@iki.fi>
parents: 15
diff changeset
372 fn center_distance() {
76f9ec073a83 More tests
Tuomo Valkonen <tuomov@iki.fi>
parents: 15
diff changeset
373 let center = Loc([0.5, 0.5]);
76f9ec073a83 More tests
Tuomo Valkonen <tuomov@iki.fi>
parents: 15
diff changeset
374
76f9ec073a83 More tests
Tuomo Valkonen <tuomov@iki.fi>
parents: 15
diff changeset
375 for f1 in Face::all() {
76f9ec073a83 More tests
Tuomo Valkonen <tuomov@iki.fi>
parents: 15
diff changeset
376 let p1 = OnCube { face : f1, point : center.clone() };
76f9ec073a83 More tests
Tuomo Valkonen <tuomov@iki.fi>
parents: 15
diff changeset
377 for f2 in Face::all() {
76f9ec073a83 More tests
Tuomo Valkonen <tuomov@iki.fi>
parents: 15
diff changeset
378 let p2 = OnCube { face : f2, point : center.clone() };
76f9ec073a83 More tests
Tuomo Valkonen <tuomov@iki.fi>
parents: 15
diff changeset
379 if f1==f2 {
76f9ec073a83 More tests
Tuomo Valkonen <tuomov@iki.fi>
parents: 15
diff changeset
380 assert_eq!(p1.dist_to(&p2), 0.0);
76f9ec073a83 More tests
Tuomo Valkonen <tuomov@iki.fi>
parents: 15
diff changeset
381 } else if f1.opposing_face()==f2 {
76f9ec073a83 More tests
Tuomo Valkonen <tuomov@iki.fi>
parents: 15
diff changeset
382 assert_eq!(p1.dist_to(&p2), 2.0);
76f9ec073a83 More tests
Tuomo Valkonen <tuomov@iki.fi>
parents: 15
diff changeset
383 } else {
76f9ec073a83 More tests
Tuomo Valkonen <tuomov@iki.fi>
parents: 15
diff changeset
384 assert_eq!(p1.dist_to(&p2), 1.0);
76f9ec073a83 More tests
Tuomo Valkonen <tuomov@iki.fi>
parents: 15
diff changeset
385 }
76f9ec073a83 More tests
Tuomo Valkonen <tuomov@iki.fi>
parents: 15
diff changeset
386 }
76f9ec073a83 More tests
Tuomo Valkonen <tuomov@iki.fi>
parents: 15
diff changeset
387 }
76f9ec073a83 More tests
Tuomo Valkonen <tuomov@iki.fi>
parents: 15
diff changeset
388 }
76f9ec073a83 More tests
Tuomo Valkonen <tuomov@iki.fi>
parents: 15
diff changeset
389
46
90cc221eb52b More documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 37
diff changeset
390 /// Tests that the distances between points on the boundaries of distinct faces are
90cc221eb52b More documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 37
diff changeset
391 /// correctly calculated.
29
76f9ec073a83 More tests
Tuomo Valkonen <tuomov@iki.fi>
parents: 15
diff changeset
392 #[test]
76f9ec073a83 More tests
Tuomo Valkonen <tuomov@iki.fi>
parents: 15
diff changeset
393 fn boundary_distance() {
76f9ec073a83 More tests
Tuomo Valkonen <tuomov@iki.fi>
parents: 15
diff changeset
394 let left = Loc([0.0, 0.5]);
76f9ec073a83 More tests
Tuomo Valkonen <tuomov@iki.fi>
parents: 15
diff changeset
395 let right = Loc([1.0, 0.5]);
76f9ec073a83 More tests
Tuomo Valkonen <tuomov@iki.fi>
parents: 15
diff changeset
396 let down = Loc([0.5, 0.0]);
76f9ec073a83 More tests
Tuomo Valkonen <tuomov@iki.fi>
parents: 15
diff changeset
397 let up = Loc([0.5, 1.0]);
76f9ec073a83 More tests
Tuomo Valkonen <tuomov@iki.fi>
parents: 15
diff changeset
398 let center = Loc([0.5, 0.5]);
76f9ec073a83 More tests
Tuomo Valkonen <tuomov@iki.fi>
parents: 15
diff changeset
399
76f9ec073a83 More tests
Tuomo Valkonen <tuomov@iki.fi>
parents: 15
diff changeset
400 for f1 in Face::all() {
76f9ec073a83 More tests
Tuomo Valkonen <tuomov@iki.fi>
parents: 15
diff changeset
401 let pl = OnCube { face : f1, point : left.clone() };
76f9ec073a83 More tests
Tuomo Valkonen <tuomov@iki.fi>
parents: 15
diff changeset
402 let pr = OnCube { face : f1, point : right.clone() };
76f9ec073a83 More tests
Tuomo Valkonen <tuomov@iki.fi>
parents: 15
diff changeset
403 let pd = OnCube { face : f1, point : down.clone() };
76f9ec073a83 More tests
Tuomo Valkonen <tuomov@iki.fi>
parents: 15
diff changeset
404 let pu = OnCube { face : f1, point : up.clone() };
76f9ec073a83 More tests
Tuomo Valkonen <tuomov@iki.fi>
parents: 15
diff changeset
405 let a = f1.adjacent_faces();
76f9ec073a83 More tests
Tuomo Valkonen <tuomov@iki.fi>
parents: 15
diff changeset
406 let al = OnCube { face : a[0], point : center.clone() };
76f9ec073a83 More tests
Tuomo Valkonen <tuomov@iki.fi>
parents: 15
diff changeset
407 let ar = OnCube { face : a[1], point : center.clone() };
76f9ec073a83 More tests
Tuomo Valkonen <tuomov@iki.fi>
parents: 15
diff changeset
408 let ad = OnCube { face : a[2], point : center.clone() };
76f9ec073a83 More tests
Tuomo Valkonen <tuomov@iki.fi>
parents: 15
diff changeset
409 let au = OnCube { face : a[3], point : center.clone() };
76f9ec073a83 More tests
Tuomo Valkonen <tuomov@iki.fi>
parents: 15
diff changeset
410 let ao = OnCube { face : f1.opposing_face(), point : center.clone() };
76f9ec073a83 More tests
Tuomo Valkonen <tuomov@iki.fi>
parents: 15
diff changeset
411
76f9ec073a83 More tests
Tuomo Valkonen <tuomov@iki.fi>
parents: 15
diff changeset
412 assert_eq!(pl.dist_to(&al), 0.5);
76f9ec073a83 More tests
Tuomo Valkonen <tuomov@iki.fi>
parents: 15
diff changeset
413 assert_eq!(pr.dist_to(&ar), 0.5);
76f9ec073a83 More tests
Tuomo Valkonen <tuomov@iki.fi>
parents: 15
diff changeset
414 assert_eq!(pd.dist_to(&ad), 0.5);
76f9ec073a83 More tests
Tuomo Valkonen <tuomov@iki.fi>
parents: 15
diff changeset
415 assert_eq!(pu.dist_to(&au), 0.5);
76f9ec073a83 More tests
Tuomo Valkonen <tuomov@iki.fi>
parents: 15
diff changeset
416 assert_eq!(pl.dist_to(&ao), 1.5);
76f9ec073a83 More tests
Tuomo Valkonen <tuomov@iki.fi>
parents: 15
diff changeset
417 assert_eq!(pr.dist_to(&ao), 1.5);
76f9ec073a83 More tests
Tuomo Valkonen <tuomov@iki.fi>
parents: 15
diff changeset
418 assert_eq!(pd.dist_to(&ao), 1.5);
76f9ec073a83 More tests
Tuomo Valkonen <tuomov@iki.fi>
parents: 15
diff changeset
419 assert_eq!(pu.dist_to(&ao), 1.5);
76f9ec073a83 More tests
Tuomo Valkonen <tuomov@iki.fi>
parents: 15
diff changeset
420 }
76f9ec073a83 More tests
Tuomo Valkonen <tuomov@iki.fi>
parents: 15
diff changeset
421 }
76f9ec073a83 More tests
Tuomo Valkonen <tuomov@iki.fi>
parents: 15
diff changeset
422
76f9ec073a83 More tests
Tuomo Valkonen <tuomov@iki.fi>
parents: 15
diff changeset
423
46
90cc221eb52b More documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 37
diff changeset
424 /// Tests that the conversions between the coordinate systems of each face is working correctly.
29
76f9ec073a83 More tests
Tuomo Valkonen <tuomov@iki.fi>
parents: 15
diff changeset
425 #[test]
10
Tuomo Valkonen <tuomov@iki.fi>
parents: 8
diff changeset
426 fn convert_adjacent() {
Tuomo Valkonen <tuomov@iki.fi>
parents: 8
diff changeset
427 let point = Loc([0.4, 0.6]);
Tuomo Valkonen <tuomov@iki.fi>
parents: 8
diff changeset
428
14
d0f20c6cb49c Fixes to find_crossing and exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
429 for f1 in Face::all() {
d0f20c6cb49c Fixes to find_crossing and exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
430 for f2 in Face::all() {
10
Tuomo Valkonen <tuomov@iki.fi>
parents: 8
diff changeset
431 println!("{:?}-{:?}", f1, f2);
Tuomo Valkonen <tuomov@iki.fi>
parents: 8
diff changeset
432 match f1.convert_adjacent(f2, &point) {
Tuomo Valkonen <tuomov@iki.fi>
parents: 8
diff changeset
433 None => assert_eq!(f2.opposing_face(), f1),
Tuomo Valkonen <tuomov@iki.fi>
parents: 8
diff changeset
434 Some(q) => {
Tuomo Valkonen <tuomov@iki.fi>
parents: 8
diff changeset
435 match f2.convert_adjacent(f1, &q) {
Tuomo Valkonen <tuomov@iki.fi>
parents: 8
diff changeset
436 None => assert_eq!(f1.opposing_face(), f2),
Tuomo Valkonen <tuomov@iki.fi>
parents: 8
diff changeset
437 Some(p) => assert!((p-&point).norm(L2) < 1e-9),
Tuomo Valkonen <tuomov@iki.fi>
parents: 8
diff changeset
438 }
Tuomo Valkonen <tuomov@iki.fi>
parents: 8
diff changeset
439 }
Tuomo Valkonen <tuomov@iki.fi>
parents: 8
diff changeset
440 }
Tuomo Valkonen <tuomov@iki.fi>
parents: 8
diff changeset
441 }
Tuomo Valkonen <tuomov@iki.fi>
parents: 8
diff changeset
442 }
Tuomo Valkonen <tuomov@iki.fi>
parents: 8
diff changeset
443 }
Tuomo Valkonen <tuomov@iki.fi>
parents: 8
diff changeset
444
Tuomo Valkonen <tuomov@iki.fi>
parents: 8
diff changeset
445 // This will fail, as different return path does not guarantee
Tuomo Valkonen <tuomov@iki.fi>
parents: 8
diff changeset
446 // that a point outside the face will be returned to its point of origin.
Tuomo Valkonen <tuomov@iki.fi>
parents: 8
diff changeset
447 // #[test]
Tuomo Valkonen <tuomov@iki.fi>
parents: 8
diff changeset
448 // fn convert_paths() {
Tuomo Valkonen <tuomov@iki.fi>
parents: 8
diff changeset
449 // let point = Loc([0.4, 0.6]);
Tuomo Valkonen <tuomov@iki.fi>
parents: 8
diff changeset
450
14
d0f20c6cb49c Fixes to find_crossing and exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
451 // for f1 in Face::all() {
d0f20c6cb49c Fixes to find_crossing and exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
452 // for f2 in Face::all() {
10
Tuomo Valkonen <tuomov@iki.fi>
parents: 8
diff changeset
453 // for p1 in f2.paths(f1) {
Tuomo Valkonen <tuomov@iki.fi>
parents: 8
diff changeset
454 // for p2 in f1.paths(f2) {
Tuomo Valkonen <tuomov@iki.fi>
parents: 8
diff changeset
455 // println!("{:?}-{:?}; {:?} {:?}", f1, f2, p1, p2);
Tuomo Valkonen <tuomov@iki.fi>
parents: 8
diff changeset
456 // let v = &f2.convert(&p1, &point);
Tuomo Valkonen <tuomov@iki.fi>
parents: 8
diff changeset
457 // let q = f1.convert(&p2, v);
Tuomo Valkonen <tuomov@iki.fi>
parents: 8
diff changeset
458 // assert!((q-&point).norm(L2) < 1e-9,
Tuomo Valkonen <tuomov@iki.fi>
parents: 8
diff changeset
459 // "norm({}-{}) ≥ 1e-9 (dest {})", q, &point, &v);
Tuomo Valkonen <tuomov@iki.fi>
parents: 8
diff changeset
460 // }
Tuomo Valkonen <tuomov@iki.fi>
parents: 8
diff changeset
461 // }
Tuomo Valkonen <tuomov@iki.fi>
parents: 8
diff changeset
462 // }
Tuomo Valkonen <tuomov@iki.fi>
parents: 8
diff changeset
463 // }
Tuomo Valkonen <tuomov@iki.fi>
parents: 8
diff changeset
464 // }
Tuomo Valkonen <tuomov@iki.fi>
parents: 8
diff changeset
465
46
90cc221eb52b More documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 37
diff changeset
466 /// Tests that the logarithmic map is working correctly between adjacent faces.
10
Tuomo Valkonen <tuomov@iki.fi>
parents: 8
diff changeset
467 #[test]
Tuomo Valkonen <tuomov@iki.fi>
parents: 8
diff changeset
468 fn log_adjacent() {
0
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
469 let p1 = OnCube{ face : F1, point : Loc([0.5, 0.5])};
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
470 let p2 = OnCube{ face : F2, point : Loc([0.5, 0.5])};
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
471
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
472 assert_eq!(p1.log(&p2).norm(L2), 1.0);
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
473 }
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
474
46
90cc221eb52b More documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 37
diff changeset
475 /// Tests that the logarithmic map is working correctly between opposing faces.
0
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
476 #[test]
10
Tuomo Valkonen <tuomov@iki.fi>
parents: 8
diff changeset
477 fn log_opposing_equal() {
0
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
478 let p1 = OnCube{ face : F1, point : Loc([0.5, 0.5])};
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
479 let p2 = OnCube{ face : F6, point : Loc([0.5, 0.5])};
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
480
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
481 assert_eq!(p1.log(&p2).norm(L2), 2.0);
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
482 }
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
483
46
90cc221eb52b More documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 37
diff changeset
484 /// Tests that the logarithmic map is working correctly between opposing faces when there
90cc221eb52b More documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 37
diff changeset
485 /// is a unique shortest geodesic.
0
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
486 #[test]
10
Tuomo Valkonen <tuomov@iki.fi>
parents: 8
diff changeset
487 fn log_opposing_unique_shortest() {
0
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
488 let p1 = OnCube{ face : F1, point : Loc([0.3, 0.25])};
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
489 let p2 = OnCube{ face : F6, point : Loc([0.3, 0.25])};
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
490
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
491 assert_eq!(p1.log(&p2).norm(L2), 1.5);
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
492 }
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
493 }
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
494

mercurial