aboutsummaryrefslogtreecommitdiff
path: root/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs160
1 files changed, 30 insertions, 130 deletions
diff --git a/src/main.rs b/src/main.rs
index 4a308aa..c3a3f4f 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -40,11 +40,11 @@ pub use mevvlfs::*;
mod mev;
pub use mev::*;
-// mod mve;
-// pub use mve::*;
+mod mve;
+pub use mve::*;
-// mod melf;
-// pub use melf::*;
+mod melf;
+pub use melf::*;
mod mekh;
pub use mekh::*;
@@ -626,22 +626,6 @@ impl<'brand, 'arena, T: Entity<'brand, 'arena>> Allocator<'brand, 'arena, T> {
}
}
-pub struct Melf<'brand, 'arena, V> {
- pub shell: ptr!(Shell),
- pub vertices: [ptr!(Vertex); 2],
- pub old_loop: ptr!(Loop),
- pub new_loop: own!(Loop),
- pub edge: own!(Edge),
- pub face: own!(Face),
-}
-
-pub struct Mve<'brand, 'arena, V> {
- pub shell: ptr!(Shell),
- pub old_edge: ptr!(Edge),
- pub new_edge: own!(Edge),
- pub vertex: own!(Vertex),
-}
-
pub struct OperatorErr<T, E> {
pub op: T,
pub err: E,
@@ -817,121 +801,35 @@ impl<'brand, 'arena, V> Dcel<'brand, 'arena, V> {
pub fn melf(
&mut self,
- shell: ptr!(Shell),
vertices: [ptr!(Vertex); 2],
- old_loop: ptr!(Loop),
- ) -> Melf<'brand, 'arena, V> {
- // before:
- // > >
- // a0 \ / a2
- // v1 v2
- // b0 / \ b2
- // < <
- //
- // after:
- // > >
- // a0 \ a1 -> / a2
- // v1 v2
- // b0 / <- b1 \ b2
- // < <
- //
-
- let (edge, [a1, b1]) = Edge::create(shell, self);
- let face = shell.add_new_face(self);
- let new_loop = Loop::new(self); // face.add_new_outer_loop(self);
-
- let [v1, v2] = vertices;
- let [b0, a2] = vertices.map(|v| v.find_outgoing(old_loop, self).unwrap());
-
- let a0 = b0.prev(self);
- let b2 = a2.prev(self);
-
- new_loop.set_face(*face, self);
- face.set_outer_loop(*new_loop, self);
-
- a1.update_origin(v1, self);
- self.follow(a0, a1);
- self.follow(a1, a2);
- old_loop.set_half_edges(a1, self);
- a1.set_loop_(old_loop, self);
-
- b1.update_origin(v2, self);
- self.follow(b2, b1);
- self.follow(b1, b0);
- new_loop.set_half_edges(b1, self);
- new_loop.update_connectivity(self);
- // new_loop.iter_mut_half_edges(self, |x, dcel| x.set_loop_(*new_loop, dcel));
-
- Melf {
- shell,
- vertices,
- old_loop,
- new_loop,
- edge,
- face,
- }
+ loop_: ptr!(Loop),
+ ) -> Result<Kelf<'brand, 'arena, V>, OperatorErr<Melf<'brand, 'arena, V>, MelfError>> {
+ Melf::new(vertices, loop_).apply(self)
+ }
+
+ pub fn kelf(
+ &mut self,
+ edge: own!(Edge),
+ loop_: own!(Loop),
+ face: own!(Face),
+ ) -> Result<Melf<'brand, 'arena, V>, OperatorErr<Kelf<'brand, 'arena, V>, KelfError>> {
+ Kelf::new(edge, loop_, face).apply(self)
}
pub fn mve(
&mut self,
- shell: ptr!(Shell),
- old_edge: ptr!(Edge),
+ edge: ptr!(Edge),
data: V,
- ) -> Mve<'brand, 'arena, V> {
- // before:
- //
- // >
- // / a3
- // a1 ->
- // v1 v2
- // <- b1
- // \ b3
- // <
- //
- // after:
- //
- // >
- // / a3
- // a1 -> a2 ->
- // v1 v v2
- // <- b1 <- b2
- // \ b3
- // <
-
- let (new_edge, [a2, b2]) = Edge::create(shell, self);
- let v = shell.add_new_vertex(data, self);
-
- let [a1, b1] = old_edge.half_edges(self);
- let [v1, v2] = old_edge.vertices(self);
-
- let mut a3 = a1.next(self);
- let mut b3 = b1.prev(self);
-
- if a3.eq(b1, self) {
- a3 = b2;
- }
- if b3.eq(a1, self) {
- b3 = a2;
- }
-
- a2.update_origin(*v, self);
- b1.update_origin(*v, self);
- b2.update_origin(v2, self);
-
- self.follow(a1, a2);
- self.follow(a2, a3);
- self.follow(b3, b2);
- self.follow(b2, b1);
-
- a2.set_loop_(a1.loop_(self), self);
- b2.set_loop_(b1.loop_(self), self);
+ ) -> Result<Kve<'brand, 'arena, V>, OperatorErr<Mve<'brand, 'arena, V>, Infallible>> {
+ Mve::new(edge, data).apply(self)
+ }
- Mve {
- shell,
- old_edge,
- new_edge,
- vertex: v,
- }
+ pub fn kve(
+ &mut self,
+ edge: own!(Edge),
+ vertex: own!(Vertex),
+ ) -> Result<Mve<'brand, 'arena, V>, OperatorErr<Kve<'brand, 'arena, V>, KveError>> {
+ Kve::new(edge, vertex).apply(self)
}
pub fn mekh(
@@ -1029,8 +927,10 @@ fn main() {
let op2 = dcel.mev(*op.loop_, *op.vertices[1], ("E", [4, 0])).unwrap();
let op3 = dcel.mev(*op.loop_, *op2.vertex, ("S", [0, -4])).unwrap();
- dcel.melf(*op.shell, [*op3.vertex, *op.vertices[0]], *op.loop_);
- dcel.melf(*op.shell, [*op.vertices[0], *op2.vertex], *op.loop_);
+ dcel.melf([*op3.vertex, *op.vertices[0]], *op.loop_)
+ .unwrap();
+ dcel.melf([*op.vertices[0], *op2.vertex], *op.loop_)
+ .unwrap();
show("cool_stuff.dot", &dcel);