Skip to content

Commit 5b8317d

Browse files
committed
working on scope simplifications
1 parent 3b9c9a0 commit 5b8317d

3 files changed

Lines changed: 55 additions & 49 deletions

File tree

src/bones/polyhedron/cycles.rs

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,44 @@ impl Cycles {
2727
pub fn into_iter(&self) -> std::vec::IntoIter<Cycle> {
2828
self.cycles.clone().into_iter()
2929
}
30+
/// Returns the
31+
pub fn sorted_connections(&self, v: VertexId) -> Vec<VertexId> {
32+
log::info!("cycles: {:?}", self.cycles);
33+
log::info!("hunting for {v}");
34+
// We only care about cycles that contain the vertex
35+
let mut relevant = self
36+
.iter()
37+
.filter_map(move |cycle| {
38+
if let Some(p) = cycle.iter().position(|&x| x == v) {
39+
log::info!("finding {p}");
40+
Some([cycle[p + cycle.len() - 1], cycle[p + 1]])
41+
} else {
42+
None
43+
}
44+
})
45+
.collect::<Vec<[VertexId; 2]>>();
46+
//.collect::<HashMap<VertexId, VertexId>>();
47+
48+
log::info!("RELEVANT: {relevant:?}");
49+
let mut sorted_connections = vec![relevant[0][0]];
50+
loop {
51+
let previous = sorted_connections.last().unwrap();
52+
match relevant
53+
.iter()
54+
.position(|[v, u]| v == previous || u == previous)
55+
{
56+
Some(i) => {
57+
let [v, u] = relevant.remove(i);
58+
let next = if v == *previous { u } else { v };
59+
sorted_connections.push(next);
60+
}
61+
None => {
62+
break;
63+
}
64+
}
65+
}
66+
sorted_connections[1..].to_vec()
67+
}
3068
}
3169

3270
impl Index<usize> for Cycle {
Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,22 @@
1-
use crate::bones::Polyhedron;
1+
use crate::bones::{Polyhedron, VertexId};
2+
3+
use super::Shape;
24

35
impl Polyhedron {
4-
pub fn truncate(&mut self) {
5-
for v in self.shape.distance.vertices() {
6-
self.render.extend(
7-
self.shape.distance.connections(v).len() - 1,
8-
self.render.positions[v],
9-
);
6+
pub fn truncate(&mut self) -> Vec<[VertexId; 2]> {
7+
let Polyhedron { shape, render, .. } = self;
8+
let Shape {
9+
distance, cycles, ..
10+
} = shape;
11+
12+
let mut new_edges = Vec::default();
13+
for v in distance.vertices() {
14+
let connections = cycles.sorted_connections(v);
15+
render.extend(connections.len() - 1, render.positions[v]);
16+
new_edges.extend(distance.split_vertex(v, connections));
17+
*cycles = distance.simple_cycles();
1018
}
11-
self.shape.truncate(None);
1219
self.shape.recompute();
20+
new_edges
1321
}
1422
}

src/bones/polyhedron/shape/conway.rs

Lines changed: 1 addition & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -3,48 +3,8 @@ use std::collections::{HashMap, HashSet};
33
use crate::bones::{Cycle, Shape, VertexId};
44

55
impl Shape {
6-
/// Returns the
7-
pub fn sorted_connections(&self, v: VertexId) -> Vec<VertexId> {
8-
log::info!("cycles: {:?}", self.cycles);
9-
log::info!("hunting for {v}");
10-
// We only care about cycles that contain the vertex
11-
let mut relevant = self
12-
.cycles
13-
.iter()
14-
.filter_map(move |cycle| {
15-
if let Some(p) = cycle.iter().position(|&x| x == v) {
16-
log::info!("finding {p}");
17-
Some([cycle[p + cycle.len() - 1], cycle[p + 1]])
18-
} else {
19-
None
20-
}
21-
})
22-
.collect::<Vec<[VertexId; 2]>>();
23-
//.collect::<HashMap<VertexId, VertexId>>();
24-
25-
log::info!("RELEVANT: {relevant:?}");
26-
let mut sorted_connections = vec![relevant[0][0]];
27-
loop {
28-
let previous = sorted_connections.last().unwrap();
29-
match relevant
30-
.iter()
31-
.position(|[v, u]| v == previous || u == previous)
32-
{
33-
Some(i) => {
34-
let [v, u] = relevant.remove(i);
35-
let next = if v == *previous { u } else { v };
36-
sorted_connections.push(next);
37-
}
38-
None => {
39-
break;
40-
}
41-
}
42-
}
43-
sorted_connections[1..].to_vec()
44-
}
45-
466
pub fn split_vertex(&mut self, v: VertexId) -> Vec<[usize; 2]> {
47-
let sorted_connections = self.sorted_connections(v);
7+
let sorted_connections = self.cycles.sorted_connections(v);
488
println!("connections_sorted : {sorted_connections:?}");
499
//
5010
// let connections = self.distance.connections(v);

0 commit comments

Comments
 (0)