aboutsummaryrefslogtreecommitdiff
path: root/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs191
1 files changed, 124 insertions, 67 deletions
diff --git a/src/main.rs b/src/main.rs
index 6e6408c..f5989e8 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -246,13 +246,6 @@ impl<'brand, 'arena, V: Default> Dcel<'brand, 'arena, V> {
}
}
- pub fn mvsf(&mut self, data: V) -> (cell!(Vertex), cell!(Face)) {
- let f = self.faces.alloc(&mut self.token, ());
- let v = self.vertices.alloc(&mut self.token, data);
-
- (v, f)
- }
-
pub fn mevvls(&mut self, data: [V; 2]) -> (cell!(HalfEdge), [cell!(Vertex); 2], cell!(Face)) {
let [d1, d2] = data;
@@ -296,23 +289,23 @@ impl<'brand, 'arena, V: Default> Dcel<'brand, 'arena, V> {
) -> Option<(cell!(HalfEdge), cell!(Vertex))> {
// before:
//
- // fa
+ // >
// / a3
// a1 ->
// v1 v v2
// <- b1
// \ b3
- // fb
+ // <
//
// after:
//
- // fa
+ // >
// / a3
// a1 -> a2 ->
// v1 v v2
// <- b1 <- b2
// \ b3
- // fb
+ // <
let v = self.vertices.alloc(&mut self.token, data);
let a2 = self.half_edges.alloc(&mut self.token, ());
@@ -328,12 +321,12 @@ impl<'brand, 'arena, V: Default> Dcel<'brand, 'arena, V> {
let mut a3 = a1.borrow(&self.token).next?;
if a3.borrow(&self.token) == b1.borrow(&self.token) {
- a3 = a1; // b3
+ a3 = b1; // a1
}
let mut b3 = b1.borrow(&self.token).prev?;
if b3.borrow(&self.token) == a1.borrow(&self.token) {
- b3 = b1; // a2
+ b3 = a2; // b1
}
self.twin(a2, b2);
@@ -348,16 +341,48 @@ impl<'brand, 'arena, V: Default> Dcel<'brand, 'arena, V> {
self.follow(b3, b2);
self.follow(b2, b1);
- Some((a1, v))
+ Some((a2, v))
}
+ // pub fn mel(&mut self, b0: cell!(HalfEdge), a2: cell!(HalfEdge)) -> Option<()> {
pub fn mel(&mut self, v1: cell!(Vertex), v2: cell!(Vertex)) -> Option<()> {
- let a = self.half_edges.alloc(&mut self.token, ());
- let b = self.half_edges.alloc(&mut self.token, ());
+ // before:
+ // > >
+ // a0 \ / a2
+ // v1 v2
+ // b0 / \ b2
+ // < <
+ //
+ // after:
+ // > >
+ // a0 \ a1 -> / a2
+ // v1 v2
+ // b0 / <- b1 \ b2
+ // < <
+ //
- self.twin(a, b);
+ let a1 = self.half_edges.alloc(&mut self.token, ());
+ let b1 = self.half_edges.alloc(&mut self.token, ());
+
+ let b0 = v1.borrow(&self.token).outgoing?;
+ let a2 = v2.borrow(&self.token).outgoing?;
+
+ //let v1 = b0.borrow(&self.token).origin?;
+ //let v2 = a2.borrow(&self.token).origin?;
+
+ let a0 = b0.borrow(&self.token).twin?;
+ let b2 = a2.borrow(&self.token).twin?;
+
+ self.twin(a1, b1);
+
+ self.origin(v1, a1);
+ self.origin(v2, b1);
+
+ self.follow(a0, a1);
+ self.follow(a1, a2);
- //self.origin();
+ self.follow(b2, b1);
+ self.follow(b1, b0);
Some(())
}
@@ -381,6 +406,8 @@ impl<'brand, 'arena, V: Default> Dcel<'brand, 'arena, V> {
(v, a, b)
}
+
+ //fn mekh(&mut self, )
}
struct DcelDotOptions {
@@ -424,65 +451,77 @@ fn dcel_write_dot(
for v in dcel.vertices.elements.iter() {
let v = v.borrow(&dcel.token);
if let Some(id) = v.id {
- // writeln!(f, "\t{id} [pos=\"{},{}!\"]", v.data.0, v.data.1)?;
writeln!(
f,
- "{id} [label=\"{}\", pos=\"{},{}!\"]",
+ "vertex_{id} [label=\"{}\", pos=\"{},{}!\"]",
v.data.0, v.data.1[0], v.data.1[1]
);
rank.push(id);
}
}
- /*
- write!(f, "{{ rank=same; ")?;
- for r in rank {
- write!(f, "{r}; ")?;
- }
- writeln!(f, "}}");*/
-
for h in dcel.half_edges.elements.iter() {
let h = h.borrow(&dcel.token);
if let Some(id) = h.id {
let twin = h.twin.unwrap().borrow(&dcel.token);
let twin_id = twin.id.unwrap();
- let a_v = h.origin.unwrap().borrow(&dcel.token);
- let b_v = twin.origin.unwrap().borrow(&dcel.token);
+ let connect = |f: &mut fmt::Formatter<'_>,
+ id: &str,
+ label: &str,
+ attr: &str,
+ pts: [(&str, [f64; 2]); 2]|
+ -> Result<(), fmt::Error> {
+ let mut vec = [pts[1].1[1] - pts[0].1[1], pts[1].1[0] - pts[0].1[0]];
- let mut vec = [
- -(b_v.data.1[1] - a_v.data.1[1]) as f64,
- (b_v.data.1[0] - a_v.data.1[0]) as f64,
- ];
+ let len = (vec[0] * vec[0] + vec[1] * vec[1]).sqrt();
+ vec[0] *= -0.075;
+ vec[1] *= 0.075;
- let len = (vec[0] * vec[0] + vec[1] * vec[1]).sqrt();
- vec[0] *= 0.2 / len;
- vec[1] *= 0.2 / len;
+ let mid = [
+ (pts[1].1[0] + pts[0].1[0]) / 2.0 + vec[0],
+ (pts[1].1[1] + pts[0].1[1]) / 2.0 + vec[1],
+ ];
- let mid = [
- (a_v.data.1[0] + b_v.data.1[0]) as f64 / 2.0 + vec[0],
- (a_v.data.1[1] + b_v.data.1[1]) as f64 / 2.0 + vec[1],
- ];
+ writeln!(
+ f,
+ "{id} [pos=\"{},{}!\", shape=point, width=0.01, height=0.01]",
+ mid[0], mid[1]
+ )?;
+ writeln!(f, "{} -> {id} [{attr}arrowhead=none]", pts[0].0)?;
+ writeln!(f, "{id} -> {} [{attr}label=\"{label}\"]", pts[1].0)?;
- let a = a_v.id.unwrap();
- let b = b_v.id.unwrap();
+ Ok(())
+ };
- writeln!(
+ let a = h.origin.unwrap().borrow(&dcel.token);
+ let b = twin.origin.unwrap().borrow(&dcel.token);
+
+ connect(
f,
- "edge_{id} [pos=\"{},{}!\", shape=point, width=0.01, height=0.01]",
- mid[0], mid[1]
+ &format!("half_edge_{id}"),
+ &format!("{id}"),
+ "",
+ [
+ (
+ &format!("vertex_{}", a.id.unwrap()),
+ [a.data.1[0] as _, a.data.1[1] as _],
+ ),
+ (
+ &format!("vertex_{}", b.id.unwrap()),
+ [b.data.1[0] as _, b.data.1[1] as _],
+ ),
+ ],
)?;
- writeln!(f, "{a} -> edge_{id} [arrowhead=none]")?;
- writeln!(f, "edge_{id} -> {b} [label=\"{id}\"]")?;
if opt.twin {
- writeln!(f, "edge_{id} -> edge_{twin_id} [color=\"red\"]")?;
+ writeln!(f, "half_edge_{id} -> half_edge_{twin_id} [color=\"red\"]")?;
}
if opt.next {
writeln!(
f,
- "edge_{id} -> edge_{} [color=\"green\"]",
+ "half_edge_{id} -> half_edge_{} [color=\"green\"]",
h.next.unwrap().borrow(&dcel.token).id.unwrap()
)?;
}
@@ -490,7 +529,7 @@ fn dcel_write_dot(
if opt.prev {
writeln!(
f,
- "edge_{id} -> edge_{} [color=\"blue\"]",
+ "half_edge_{id} -> half_edge_{} [color=\"blue\"]",
h.prev.unwrap().borrow(&dcel.token).id.unwrap()
)?;
}
@@ -509,28 +548,46 @@ impl<T: Fn(&mut fmt::Formatter<'_>) -> fmt::Result> fmt::Display for DisplayFn<T
}
}
+use std::io::Write;
+
fn main() {
GhostToken::new(|token| {
let alloc = DcelAllocator::default();
let mut dcel = Dcel::new(token, &alloc);
- let h0 = dcel.mevvls([("S", [0, 0]), ("E", [9, 0])]).0;
- let h2 = dcel.mve(h0, ("P1", [6, 0])).unwrap().0;
- dcel.mve(h2, ("P2", [3, 0])).unwrap();
-
- dcel.mev(h0.borrow(&dcel.token).origin.unwrap(), ("B", [0, 3]));
-
- print!(
- "{}",
- DisplayFn(|f: &mut fmt::Formatter<'_>| dcel_write_dot(
- &dcel,
- f,
- DcelDotOptions {
- prev: false,
- next: true,
- twin: false,
- }
- ))
+ let show = |name, dcel: &Dcel<(&'static str, [i64; 2])>| {
+ write!(
+ &mut std::fs::File::create(name).unwrap(),
+ "{}",
+ DisplayFn(|f: &mut fmt::Formatter<'_>| dcel_write_dot(
+ dcel,
+ f,
+ DcelDotOptions {
+ prev: false,
+ next: true,
+ twin: false,
+ }
+ ))
+ )
+ .unwrap();
+ };
+
+ let (a, [w, n], _) = dcel.mevvls([("W", [-4, 0]), ("N", [0, 4])]);
+ show("1.dot", &dcel);
+
+ let b = dcel.mve(a, ("E", [4, 0])).unwrap().0;
+ show("2.dot", &dcel);
+
+ dcel.mve(a, ("S", [0, -4])).unwrap();
+ show("3.dot", &dcel);
+
+ dcel.mel(/*a, b.borrow(&dcel.token).twin.unwrap()*/ w, n);
+ show("4.dot", &dcel);
+
+ eprintln!(
+ "{} {}",
+ a.borrow(&dcel.token).id.unwrap(),
+ b.borrow(&dcel.token).id.unwrap()
);
/*