src/cube.rs

Mon, 21 Oct 2024 10:02:57 -0500

author
Tuomo Valkonen <tuomov@iki.fi>
date
Mon, 21 Oct 2024 10:02:57 -0500
changeset 7
8979a6638424
parent 6
df9628092285
child 8
17d71ca4ce84
permissions
-rw-r--r--

A simple test

0
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
2 use core::f64;
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
3
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
4 use alg_tools::loc::Loc;
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
5 use alg_tools::norms::{Norm, L2};
7
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
6 use crate::manifold::{ManifoldPoint, EmbeddedManifoldPoint};
0
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
7
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
8 #[derive(Copy, Clone, Debug, Eq, PartialEq)]
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
9 pub enum Face {F1, F2, F3, F4, F5, F6}
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
10 use Face::*;
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
11
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
12 pub type Point = Loc<f64, 2>;
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
13
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
14 pub type AdjacentFaces = [Face; 4];
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
15
3
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
16 #[derive(Clone, Debug)]
0
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
17 pub enum Path {
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
18 Direct { destination : Face },
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
19 Indirect { destination : Face, intermediate : Face },
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
20 }
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
21
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
22 /// 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
23 #[derive(Clone, Debug)]
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
24 pub enum PathIter {
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
25 Direct(Face),
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
26 Indirect{ destination : Face, intermediate : AdjacentFaces, current : usize},
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
27 Exhausted,
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
28 }
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
29
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
30 impl std::iter::Iterator for PathIter {
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
31 type Item = Path;
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 fn next(&mut self) -> Option<Self::Item> {
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
34 use PathIter::*;
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
35 match self {
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
36 &mut Exhausted => None,
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
37 &mut Direct(destination) => {
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
38 *self = Exhausted;
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
39 Some(Path::Direct { destination })
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
40 },
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
41 &mut Indirect{destination, intermediate : ref i, ref mut current} => {
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
42 if *current < i.len() {
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
43 let intermediate = i[*current];
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
44 *current += 1;
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
45 Some(Path::Indirect{ destination, intermediate })
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
46 } else {
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
47 *self = Exhausted;
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
48 None
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
49 }
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
50 }
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
51 }
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
52 }
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
53 }
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 Face {
3
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
57 /// Returns an array of the four faces adjacent to `self` in the
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
58 /// order [left, right, down, up] in the `self`-relative unfolding.
0
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
59 pub fn adjacent_faces(&self) -> AdjacentFaces {
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
60 match *self {
3
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
61 F1 => [F3, F2, F4, F5],
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
62 F2 => [F4, F5, F1, F6],
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
63 F3 => [F5, F4, F1, F6],
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
64 F4 => [F3, F2, F1, F6],
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
65 F5 => [F2, F3, F1, F6],
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
66 F6 => [F3, F2, F4, F5],
0
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
67 }
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
68 }
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
69
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
70 /// Returns the face opposing `self`.
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
71 pub fn opposing_face(&self) -> Face {
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
72 match *self {
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
73 F1 => F6,
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
74 F2 => F3,
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
75 F3 => F2,
3
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
76 F4 => F5,
0
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
77 F5 => F4,
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
78 F6 => F1,
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
79 }
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 /// 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
83 pub fn convert_adjacent(&self, adjacent : Face, p: &Point) -> Option<Point> {
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
84 let Loc([x, y]) = *p;
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
85 let mk = |x, y| Some(Loc([x, y]));
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
86 match adjacent {
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
87 F1 => match *self {
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
88 F2 => mk(y, x - 1.0),
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
89 F3 => mk(1.0 - y, -x),
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
90 F4 => mk(x, -y),
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
91 F5 => mk(1.0 - x, y - 1.0),
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
92 F1 => mk(x, y),
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
93 F6 => None,
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
94 },
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
95 F2 => match *self {
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
96 F1 => mk(y + 1.0, x),
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
97 F4 => mk(x + 1.0, y),
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
98 F5 => mk(x - 1.0, y),
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
99 F6 => mk(2.0 - y, x),
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
100 F2 => mk(x, y),
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
101 F3 => None,
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
102 },
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
103 F3 => match *self {
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
104 F1 => mk(-y, 1.0 - x),
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
105 F4 => mk(x - 1.0, y),
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
106 F5 => mk(x + 1.0, y),
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
107 F6 => mk(y - 1.0, 1.0 - x),
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
108 F3 => mk(x, y),
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
109 F2 => None,
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
110 },
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
111 F4 => match *self {
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
112 F1 => mk(x, -y),
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
113 F2 => mk(x - 1.0, y),
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
114 F3 => mk(x + 1.0, y),
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
115 F6 => mk(x, y - 1.0),
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
116 F4 => mk(x, y),
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
117 F5 => None,
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
118 },
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
119 F5 => match *self {
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
120 F1 => mk(1.0 -x, y + 1.0),
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
121 F2 => mk(x + 1.0, y),
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
122 F3 => mk(x - 1.0, y),
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
123 F6 => mk(1.0 -x, 2.0 - y),
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
124 F5 => mk(x, y),
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
125 F4 => None,
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
126 },
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
127 F6 => match *self {
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
128 F2 => mk(y, 2.0 - x),
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
129 F3 => mk(1.0 - y, x + 1.0),
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
130 F4 => mk(x, y + 1.0),
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
131 F5 => mk(1.0 - x, 2.0 - y),
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
132 F6 => mk(x, y),
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
133 F1 => None,
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
134 }
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
135 }
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
136 }
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
137
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
138 /// Converts a point behind a path to the coordinate system of `self`.
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
139 pub fn convert(&self, path : &Path, p: &Point) -> Point {
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
140 use Path::*;
3
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
141 //dbg!(*self, path);
0
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
142 match path {
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
143 &Direct{ destination : d} => self.convert_adjacent(d, p),
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
144 &Indirect{ destination : d, intermediate : i }
3
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
145 => {self.convert_adjacent(i, &i.convert_adjacent(d, p).unwrap())}
0
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
146 }.unwrap()
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
147 }
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
148
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
149
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
150 /// Returns an iterator over all the paths from `self` to `other`.
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
151 fn paths(&self, other : Face) -> PathIter {
3
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
152 //dbg!(self, other);
0
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
153 if self.opposing_face() == other {
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
154 PathIter::Indirect {
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
155 intermediate : self.adjacent_faces(),
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
156 destination : other,
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
157 current : 0
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 } else {
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
160 PathIter::Direct(other)
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
161 }
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
162 }
3
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
163
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
164 pub fn is_in_face(&self, p: &Point) -> bool {
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
165 p.iter().map(|t| t.abs()).all(|t| 0.0 <= t && t <= 1.0)
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
166 }
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
167
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
168 pub fn find_crossing(&self, p : &Point) -> Face {
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
169 let &Loc([x, y]) = p;
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
170 use std::cmp::Ordering::*;
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
171 let crossing = |t| match (0.0 <= t, t<=1.0) {
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
172 (false, _) => Less,
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
173 (_, false) => Greater,
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
174 _ => Equal,
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
175 };
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
176
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
177 // TODO: how to properly handle corners? Just throw an error?
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
178 match (crossing(x), crossing(y)) {
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
179 (Equal, Equal) => *self,
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
180 (Less, _) => self.adjacent_faces()[0],
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
181 (Greater, _) => self.adjacent_faces()[1],
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
182 (Equal, Less) => self.adjacent_faces()[2],
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
183 (Equal, Greater) => self.adjacent_faces()[3],
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
184 }
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
185 }
7
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
186
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
187 /// Get embedded 3D coordinates
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
188 pub fn embedded_coords(&self, p : &Point) -> Loc<f64, 3> {
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
189 let &Loc([x, y]) = p;
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
190 Loc(match *self {
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
191 F1 => [x, y, 0.0],
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
192 F2 => [1.0, x, y],
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
193 F3 => [0.0, 1.0-x, y],
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
194 F4 => [x, 0.0, y],
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
195 F5 => [1.0 - x, 1.0, y],
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
196 F6 => [x, y, 1.0],
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
197 })
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
198 }
0
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
199 }
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
200
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
201 #[derive(Clone, Debug, PartialEq)]
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
202 pub struct OnCube {
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
203 face : Face,
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
204 point : Point,
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
205 }
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
206
5
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
207 impl OnCube {
7
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
208 /// 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
209 /// in [0, 1]^2
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
210 pub fn new(face : Face, point : Point) -> Self {
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
211 assert!(face.is_in_face(&point));
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
212 OnCube { face, point }
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
213 }
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
214
5
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
215 /// Calculates both the logarithmic map and distance to another point
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
216 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
217 let mut best_len = f64::INFINITY;
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
218 let mut best_tan = Loc([0.0, 0.0]);
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
219 for path in self.face.paths(other.face) {
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
220 let tan = self.face.convert(&path, &other.point) - &self.point;
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
221 let len = tan.norm(L2);
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
222 if len < best_len {
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
223 best_tan = tan;
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
224 best_len = len;
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
225 }
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
226 }
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
227 (best_tan, best_len)
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
228 }
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
229 }
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
230
7
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
231
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
232 impl EmbeddedManifoldPoint for OnCube {
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
233 type EmbeddedCoords = Loc<f64, 3>;
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
234
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
235 /// Get embedded 3D coordinates
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
236 fn embedded_coords(&self) -> Loc<f64, 3> {
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
237 self.face.embedded_coords(&self.point)
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
238 }
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
239 }
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
240
0
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
241 impl ManifoldPoint for OnCube {
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
242 type Tangent = Point;
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
243
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
244 fn exp(&self, tangent : &Self::Tangent) -> Self {
3
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
245 let mut face = self.face;
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
246 let mut point = self.point + tangent;
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
247 loop {
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
248 let next_face = face.find_crossing(&point);
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
249 if next_face == face {
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
250 break
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
251 }
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
252 point = next_face.convert_adjacent(face, &point).unwrap();
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
253 face = next_face;
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
254 }
ff4656da04af Sketch exp
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
255 OnCube { face, point }
0
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
256 }
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
257
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
258 fn log(&self, other : &Self) -> Self::Tangent {
5
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
259 self.log_dist(other).0
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
260 }
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
261
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
262 fn dist_to(&self, other : &Self) -> f64 {
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
263 self.log_dist(other).1
0
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
264 }
6
df9628092285 Add a zero function on manifolds
Tuomo Valkonen <tuomov@iki.fi>
parents: 5
diff changeset
265
df9628092285 Add a zero function on manifolds
Tuomo Valkonen <tuomov@iki.fi>
parents: 5
diff changeset
266 fn tangent_origin(&self) -> Self::Tangent {
df9628092285 Add a zero function on manifolds
Tuomo Valkonen <tuomov@iki.fi>
parents: 5
diff changeset
267 Loc([0.0, 0.0])
df9628092285 Add a zero function on manifolds
Tuomo Valkonen <tuomov@iki.fi>
parents: 5
diff changeset
268 }
0
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
269 }
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
270
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
271 #[cfg(test)]
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
272 mod tests {
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
273 use super::*;
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
274
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
275 #[test]
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
276 fn log_test_adjacent() {
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
277 let p1 = OnCube{ face : F1, point : Loc([0.5, 0.5])};
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
278 let p2 = OnCube{ face : F2, point : Loc([0.5, 0.5])};
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
279
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
280 assert_eq!(p1.log(&p2).norm(L2), 1.0);
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
281 }
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
282
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
283 #[test]
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
284 fn log_test_opposing_equal() {
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
285 let p1 = OnCube{ face : F1, point : Loc([0.5, 0.5])};
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
286 let p2 = OnCube{ face : F6, point : Loc([0.5, 0.5])};
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 assert_eq!(p1.log(&p2).norm(L2), 2.0);
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
289 }
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
290
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
291 #[test]
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
292 fn log_test_opposing_unique_shortest() {
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
293 let p1 = OnCube{ face : F1, point : Loc([0.3, 0.25])};
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
294 let p2 = OnCube{ face : F6, point : Loc([0.3, 0.25])};
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
295
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
296 assert_eq!(p1.log(&p2).norm(L2), 1.5);
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
297 }
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
298 }
989e2fe08db2 Basic cube logarithm
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
299

mercurial