diff options
-rw-r--r-- | .gitignore | 3 | ||||
-rw-r--r-- | 1.svg | 81 | ||||
-rw-r--r-- | Cargo.lock | 7 | ||||
-rw-r--r-- | Cargo.toml | 1 | ||||
-rw-r--r-- | Utah teapot (solid) - 852078.zip | bin | 917444 -> 0 bytes | |||
-rwxr-xr-x | conv.sh | 8 | ||||
-rw-r--r-- | src/main.rs | 191 | ||||
-rw-r--r-- | utahteapot/LICENSE.txt | 1 | ||||
-rw-r--r-- | utahteapot/README.txt | 1 | ||||
-rw-r--r-- | utahteapot/files/utahteapot.stl | bin | 471984 -> 0 bytes | |||
-rw-r--r-- | utahteapot/images/teapot_stl.jpg | bin | 194795 -> 0 bytes | |||
-rw-r--r-- | utahteapot/images/utahteapot.png | bin | 249715 -> 0 bytes | |||
-rw-r--r-- | x.dot | 40 | ||||
-rw-r--r-- | x.svg | 227 |
14 files changed, 143 insertions, 417 deletions
@@ -1 +1,4 @@ /target +*.png +*.dot +*.gif @@ -1,81 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" - "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<!-- Generated by graphviz version 9.0.0 (0) - --> -<!-- Title: DCEL Pages: 1 --> -<svg width="53pt" height="192pt" - viewBox="0.00 0.00 52.90 192.03" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> -<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 188.03)"> -<title>DCEL</title> -<polygon fill="white" stroke="none" points="-4,4 -4,-188.03 48.9,-188.03 48.9,4 -4,4"/> -<!-- 0 --> -<g id="node1" class="node"> -<title>0</title> -<ellipse fill="none" stroke="black" cx="22.15" cy="-166.03" rx="18" ry="18"/> -<text text-anchor="middle" x="22.15" y="-160.98" font-family="Times,serif" font-size="14.00">0</text> -</g> -<!-- edge_0 --> -<g id="node3" class="node"> -<title>edge_0</title> -<ellipse fill="black" stroke="black" cx="1.15" cy="-95.17" rx="0.36" ry="0.36"/> -</g> -<!-- 0->edge_0 --> -<g id="edge1" class="edge"> -<title>0->edge_0</title> -<path fill="none" stroke="black" d="M17.18,-148.56C11.36,-129.29 2.37,-99.54 1.27,-95.9"/> -<text text-anchor="middle" x="14.53" y="-116.73" font-family="Times,serif" font-size="14.00">0</text> -</g> -<!-- 1 --> -<g id="node2" class="node"> -<title>1</title> -<ellipse fill="none" stroke="black" cx="21.15" cy="-21.15" rx="21.15" ry="21.15"/> -<text text-anchor="middle" x="21.15" y="-16.1" font-family="Times,serif" font-size="14.00">far</text> -</g> -<!-- edge_1 --> -<g id="node4" class="node"> -<title>edge_1</title> -<ellipse fill="black" stroke="black" cx="43.15" cy="-95.17" rx="0.36" ry="0.36"/> -</g> -<!-- 1->edge_1 --> -<g id="edge3" class="edge"> -<title>1->edge_1</title> -<path fill="none" stroke="black" d="M27.13,-41.89C33.18,-61.87 41.81,-90.38 43.01,-94.35"/> -<text text-anchor="middle" x="41.53" y="-63.51" font-family="Times,serif" font-size="14.00">1</text> -</g> -<!-- edge_0->1 --> -<g id="edge2" class="edge"> -<title>edge_0->1</title> -<path fill="none" stroke="black" d="M1.28,-94.35C2.19,-91.06 7.72,-70.95 12.72,-52.78"/> -<polygon fill="black" stroke="black" points="16.04,-53.92 15.32,-43.35 9.29,-52.06 16.04,-53.92"/> -</g> -<!-- edge_0->edge_1 --> -<g id="edge5" class="edge"> -<title>edge_0->edge_1</title> -<path fill="none" stroke="red" d="M13.27,-95.17C18.92,-95.17 25.62,-95.17 31.24,-95.17"/> -<polygon fill="red" stroke="red" points="13.4,-91.67 3.4,-95.17 13.4,-98.67 13.4,-91.67"/> -<polygon fill="red" stroke="red" points="31.24,-98.67 41.24,-95.17 31.24,-91.67 31.24,-98.67"/> -<text text-anchor="middle" x="22.15" y="-101.37" font-family="Times,serif" font-size="14.00">twin</text> -</g> -<!-- edge_0->edge_1 --> -<g id="edge6" class="edge"> -<title>edge_0->edge_1</title> -<path fill="none" stroke="green" d="M1.22,-94.54C1.57,-91.72 3.41,-80.15 10.53,-75.67 19.28,-70.17 25.03,-70.17 33.78,-75.67 36.67,-77.49 38.69,-80.48 40.1,-83.58"/> -<polygon fill="green" stroke="green" points="36.68,-84.35 42.69,-93.08 43.44,-82.51 36.68,-84.35"/> -<text text-anchor="middle" x="22.15" y="-78.87" font-family="Times,serif" font-size="14.00">next</text> -</g> -<!-- edge_1->0 --> -<g id="edge4" class="edge"> -<title>edge_1->0</title> -<path fill="none" stroke="black" d="M43.04,-95.9C42.14,-98.9 35.87,-119.64 30.44,-137.63"/> -<polygon fill="black" stroke="black" points="27.11,-136.53 27.57,-147.11 33.81,-138.55 27.11,-136.53"/> -</g> -<!-- edge_1->edge_0 --> -<g id="edge7" class="edge"> -<title>edge_1->edge_0</title> -<path fill="none" stroke="green" d="M43.1,-95.8C42.8,-98.61 41.19,-110.17 34.15,-114.67 25.17,-120.42 19.14,-120.42 10.15,-114.67 7.3,-112.84 5.33,-109.85 3.99,-106.75"/> -<polygon fill="green" stroke="green" points="7.43,-106.1 1.58,-97.26 0.65,-107.82 7.43,-106.1"/> -<text text-anchor="middle" x="22.15" y="-123.87" font-family="Times,serif" font-size="14.00">next</text> -</g> -</g> -</svg> @@ -3,6 +3,12 @@ version = 3 [[package]] +name = "anyhow" +version = "1.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "080e9890a082662b09c1ad45f567faeeb47f22b5fb23895fbe1e651e718e25ca" + +[[package]] name = "autocfg" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -24,6 +30,7 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" name = "dcel" version = "0.1.0" dependencies = [ + "anyhow", "either", "ghost-cell", "rand", @@ -6,6 +6,7 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +anyhow = "1.0.79" either = "1.9.0" ghost-cell = "0.2.3" rand = "0.8.5" diff --git a/Utah teapot (solid) - 852078.zip b/Utah teapot (solid) - 852078.zip Binary files differdeleted file mode 100644 index ebf89fb..0000000 --- a/Utah teapot (solid) - 852078.zip +++ /dev/null @@ -0,0 +1,8 @@ +#!/bin/bash +set -e +cargo run +for x in *.dot; do + dot -Kneato -T png $x -o $x.png + ../resize/target/release/resize $x.png 830 827 +done +gifski --fast -r 1 -o dcel.gif *.dot.png 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() ); /* diff --git a/utahteapot/LICENSE.txt b/utahteapot/LICENSE.txt deleted file mode 100644 index 7421e49..0000000 --- a/utahteapot/LICENSE.txt +++ /dev/null @@ -1 +0,0 @@ -This thing was created by Thingiverse user zzubnik, and is licensed under Creative Commons - Public Domain Dedication
\ No newline at end of file diff --git a/utahteapot/README.txt b/utahteapot/README.txt deleted file mode 100644 index 19d4877..0000000 --- a/utahteapot/README.txt +++ /dev/null @@ -1 +0,0 @@ -Utah teapot (solid) by zzubnik on Thingiverse: https://www.thingiverse.com/thing:852078
\ No newline at end of file diff --git a/utahteapot/files/utahteapot.stl b/utahteapot/files/utahteapot.stl Binary files differdeleted file mode 100644 index d225918..0000000 --- a/utahteapot/files/utahteapot.stl +++ /dev/null diff --git a/utahteapot/images/teapot_stl.jpg b/utahteapot/images/teapot_stl.jpg Binary files differdeleted file mode 100644 index 1d091f1..0000000 --- a/utahteapot/images/teapot_stl.jpg +++ /dev/null diff --git a/utahteapot/images/utahteapot.png b/utahteapot/images/utahteapot.png Binary files differdeleted file mode 100644 index ae8f786..0000000 --- a/utahteapot/images/utahteapot.png +++ /dev/null @@ -1,40 +0,0 @@ -digraph DCEL { -node [shape = circle] -0 [label="S", pos="0,0!"] -1 [label="E", pos="9,0!"] -2 [label="P1", pos="6,0!"] -3 [label="P2", pos="3,0!"] -4 [label="B", pos="0,3!"] -edge_0 [pos="1.5,0.2!", shape=point, width=0.01, height=0.01] -0 -> edge_0 [arrowhead=none] -edge_0 -> 3 [label="0"] -edge_0 -> edge_4 [color="green"] -edge_1 [pos="1.5,-0.2!", shape=point, width=0.01, height=0.01] -3 -> edge_1 [arrowhead=none] -edge_1 -> 0 [label="1"] -edge_1 -> edge_0 [color="green"] -edge_2 [pos="7.5,0.2!", shape=point, width=0.01, height=0.01] -2 -> edge_2 [arrowhead=none] -edge_2 -> 1 [label="2"] -edge_2 -> edge_1 [color="green"] -edge_3 [pos="7.5,-0.2!", shape=point, width=0.01, height=0.01] -1 -> edge_3 [arrowhead=none] -edge_3 -> 2 [label="3"] -edge_3 -> edge_5 [color="green"] -edge_4 [pos="4.5,0.2!", shape=point, width=0.01, height=0.01] -3 -> edge_4 [arrowhead=none] -edge_4 -> 2 [label="4"] -edge_4 -> edge_3 [color="green"] -edge_5 [pos="4.5,-0.2!", shape=point, width=0.01, height=0.01] -2 -> edge_5 [arrowhead=none] -edge_5 -> 3 [label="5"] -edge_5 -> edge_1 [color="green"] -edge_6 [pos="0.2,1.5!", shape=point, width=0.01, height=0.01] -4 -> edge_6 [arrowhead=none] -edge_6 -> 0 [label="6"] -edge_6 -> edge_7 [color="green"] -edge_7 [pos="-0.2,1.5!", shape=point, width=0.01, height=0.01] -0 -> edge_7 [arrowhead=none] -edge_7 -> 4 [label="7"] -edge_7 -> edge_6 [color="green"] -} @@ -1,227 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" - "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<!-- Generated by graphviz version 9.0.0 (0) - --> -<!-- Title: DCEL Pages: 1 --> -<svg width="692pt" height="263pt" - viewBox="0.00 0.00 692.00 263.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> -<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 259)"> -<title>DCEL</title> -<polygon fill="white" stroke="none" points="-4,4 -4,-259 688,-259 688,4 -4,4"/> -<!-- 0 --> -<g id="node1" class="node"> -<title>0</title> -<ellipse fill="none" stroke="black" cx="18" cy="-21" rx="18" ry="18"/> -<text text-anchor="middle" x="18" y="-15.95" font-family="Times,serif" font-size="14.00">S</text> -</g> -<!-- edge_0 --> -<g id="node6" class="node"> -<title>edge_0</title> -<ellipse fill="black" stroke="black" cx="126" cy="-35.4" rx="0.36" ry="0.36"/> -</g> -<!-- 0->edge_0 --> -<g id="edge1" class="edge"> -<title>0->edge_0</title> -<path fill="none" stroke="black" d="M36.32,-23.44C65.21,-27.29 118.75,-34.43 125.33,-35.31"/> -</g> -<!-- edge_7 --> -<g id="node13" class="node"> -<title>edge_7</title> -<ellipse fill="black" stroke="black" cx="3.6" cy="-129" rx="0.36" ry="0.36"/> -</g> -<!-- 0->edge_7 --> -<g id="edge22" class="edge"> -<title>0->edge_7</title> -<path fill="none" stroke="black" d="M15.56,-39.32C11.71,-68.21 4.57,-121.75 3.69,-128.33"/> -</g> -<!-- 1 --> -<g id="node2" class="node"> -<title>1</title> -<ellipse fill="none" stroke="black" cx="666" cy="-21" rx="18" ry="18"/> -<text text-anchor="middle" x="666" y="-15.95" font-family="Times,serif" font-size="14.00">E</text> -</g> -<!-- edge_3 --> -<g id="node10" class="node"> -<title>edge_3</title> -<ellipse fill="black" stroke="black" cx="558" cy="-6.6" rx="0.36" ry="0.36"/> -</g> -<!-- 1->edge_3 --> -<g id="edge10" class="edge"> -<title>1->edge_3</title> -<path fill="none" stroke="black" d="M647.68,-18.56C618.79,-14.71 565.25,-7.57 558.67,-6.69"/> -</g> -<!-- 2 --> -<g id="node3" class="node"> -<title>2</title> -<ellipse fill="none" stroke="black" cx="450" cy="-21" rx="20.64" ry="20.64"/> -<text text-anchor="middle" x="450" y="-15.95" font-family="Times,serif" font-size="14.00">P1</text> -</g> -<!-- edge_2 --> -<g id="node9" class="node"> -<title>edge_2</title> -<ellipse fill="black" stroke="black" cx="558" cy="-35.4" rx="0.36" ry="0.36"/> -</g> -<!-- 2->edge_2 --> -<g id="edge7" class="edge"> -<title>2->edge_2</title> -<path fill="none" stroke="black" d="M470.82,-23.78C500.25,-27.7 551.12,-34.48 557.37,-35.32"/> -</g> -<!-- edge_5 --> -<g id="node11" class="node"> -<title>edge_5</title> -<ellipse fill="black" stroke="black" cx="342" cy="-6.6" rx="0.36" ry="0.36"/> -</g> -<!-- 2->edge_5 --> -<g id="edge16" class="edge"> -<title>2->edge_5</title> -<path fill="none" stroke="black" d="M429.18,-18.22C399.75,-14.3 348.88,-7.52 342.63,-6.68"/> -</g> -<!-- 3 --> -<g id="node4" class="node"> -<title>3</title> -<ellipse fill="none" stroke="black" cx="234" cy="-21" rx="20.64" ry="20.64"/> -<text text-anchor="middle" x="234" y="-15.95" font-family="Times,serif" font-size="14.00">P2</text> -</g> -<!-- edge_4 --> -<g id="node7" class="node"> -<title>edge_4</title> -<ellipse fill="black" stroke="black" cx="342" cy="-35.4" rx="0.36" ry="0.36"/> -</g> -<!-- 3->edge_4 --> -<g id="edge13" class="edge"> -<title>3->edge_4</title> -<path fill="none" stroke="black" d="M254.82,-23.78C284.25,-27.7 335.12,-34.48 341.37,-35.32"/> -</g> -<!-- edge_1 --> -<g id="node8" class="node"> -<title>edge_1</title> -<ellipse fill="black" stroke="black" cx="126" cy="-6.6" rx="0.36" ry="0.36"/> -</g> -<!-- 3->edge_1 --> -<g id="edge4" class="edge"> -<title>3->edge_1</title> -<path fill="none" stroke="black" d="M213.18,-18.22C183.75,-14.3 132.88,-7.52 126.63,-6.68"/> -</g> -<!-- 4 --> -<g id="node5" class="node"> -<title>4</title> -<ellipse fill="none" stroke="black" cx="18" cy="-237" rx="18" ry="18"/> -<text text-anchor="middle" x="18" y="-231.95" font-family="Times,serif" font-size="14.00">B</text> -</g> -<!-- edge_6 --> -<g id="node12" class="node"> -<title>edge_6</title> -<ellipse fill="black" stroke="black" cx="32.4" cy="-129" rx="0.36" ry="0.36"/> -</g> -<!-- 4->edge_6 --> -<g id="edge19" class="edge"> -<title>4->edge_6</title> -<path fill="none" stroke="black" d="M20.44,-218.68C24.29,-189.79 31.43,-136.25 32.31,-129.67"/> -</g> -<!-- edge_0->3 --> -<g id="edge2" class="edge"> -<title>edge_0->3</title> -<path fill="none" stroke="black" d="M126.69,-35.31C132.43,-34.54 172.81,-29.16 202.35,-25.22"/> -<polygon fill="black" stroke="black" points="202.49,-28.73 211.94,-23.94 201.56,-21.79 202.49,-28.73"/> -<text text-anchor="middle" x="161.15" y="-33.46" font-family="Times,serif" font-size="14.00">0</text> -</g> -<!-- edge_0->edge_4 --> -<g id="edge3" class="edge"> -<title>edge_0->edge_4</title> -<path fill="none" stroke="green" d="M126.62,-35.4C137.43,-35.4 286.63,-35.4 330.16,-35.4"/> -<polygon fill="green" stroke="green" points="329.9,-38.9 339.9,-35.4 329.9,-31.9 329.9,-38.9"/> -</g> -<!-- edge_4->2 --> -<g id="edge14" class="edge"> -<title>edge_4->2</title> -<path fill="none" stroke="black" d="M342.69,-35.31C348.43,-34.54 388.81,-29.16 418.35,-25.22"/> -<polygon fill="black" stroke="black" points="418.49,-28.73 427.94,-23.94 417.56,-21.79 418.49,-28.73"/> -<text text-anchor="middle" x="377.15" y="-33.46" font-family="Times,serif" font-size="14.00">4</text> -</g> -<!-- edge_4->edge_3 --> -<g id="edge15" class="edge"> -<title>edge_4->edge_3</title> -<path fill="none" stroke="green" d="M342.62,-35.32C353.43,-33.88 502.63,-13.98 546.16,-8.18"/> -<polygon fill="green" stroke="green" points="546.47,-11.67 555.92,-6.88 545.54,-4.73 546.47,-11.67"/> -</g> -<!-- edge_1->0 --> -<g id="edge5" class="edge"> -<title>edge_1->0</title> -<path fill="none" stroke="black" d="M125.31,-6.69C119.41,-7.48 76.93,-13.14 47.22,-17.1"/> -<polygon fill="black" stroke="black" points="47.13,-13.58 37.68,-18.38 48.06,-20.52 47.13,-13.58"/> -<text text-anchor="middle" x="82.89" y="-15.1" font-family="Times,serif" font-size="14.00">1</text> -</g> -<!-- edge_1->edge_0 --> -<g id="edge6" class="edge"> -<title>edge_1->edge_0</title> -<path fill="none" stroke="green" d="M126,-7.31C126,-9.57 126,-16.83 126,-23.4"/> -<polygon fill="green" stroke="green" points="122.5,-23.3 126,-33.3 129.5,-23.3 122.5,-23.3"/> -</g> -<!-- edge_2->1 --> -<g id="edge8" class="edge"> -<title>edge_2->1</title> -<path fill="none" stroke="black" d="M558.69,-35.31C564.59,-34.52 607.07,-28.86 636.78,-24.9"/> -<polygon fill="black" stroke="black" points="636.87,-28.42 646.32,-23.62 635.94,-21.48 636.87,-28.42"/> -<text text-anchor="middle" x="594.36" y="-33.3" font-family="Times,serif" font-size="14.00">2</text> -</g> -<!-- edge_2->edge_1 --> -<g id="edge9" class="edge"> -<title>edge_2->edge_1</title> -<path fill="none" stroke="green" d="M557.3,-35.35C539.95,-34.2 205.69,-11.91 137.92,-7.39"/> -<polygon fill="green" stroke="green" points="138.39,-3.92 128.18,-6.75 137.92,-10.9 138.39,-3.92"/> -</g> -<!-- edge_3->2 --> -<g id="edge11" class="edge"> -<title>edge_3->2</title> -<path fill="none" stroke="black" d="M557.31,-6.69C551.57,-7.46 511.19,-12.84 481.65,-16.78"/> -<polygon fill="black" stroke="black" points="481.51,-13.27 472.06,-18.06 482.44,-20.21 481.51,-13.27"/> -<text text-anchor="middle" x="516.1" y="-14.94" font-family="Times,serif" font-size="14.00">3</text> -</g> -<!-- edge_3->edge_5 --> -<g id="edge12" class="edge"> -<title>edge_3->edge_5</title> -<path fill="none" stroke="green" d="M557.38,-6.6C546.57,-6.6 397.37,-6.6 353.84,-6.6"/> -<polygon fill="green" stroke="green" points="354.1,-3.1 344.1,-6.6 354.1,-10.1 354.1,-3.1"/> -</g> -<!-- edge_5->3 --> -<g id="edge17" class="edge"> -<title>edge_5->3</title> -<path fill="none" stroke="black" d="M341.31,-6.69C335.57,-7.46 295.19,-12.84 265.65,-16.78"/> -<polygon fill="black" stroke="black" points="265.51,-13.27 256.06,-18.06 266.44,-20.21 265.51,-13.27"/> -<text text-anchor="middle" x="300.1" y="-14.94" font-family="Times,serif" font-size="14.00">5</text> -</g> -<!-- edge_5->edge_1 --> -<g id="edge18" class="edge"> -<title>edge_5->edge_1</title> -<path fill="none" stroke="green" d="M341.38,-6.6C330.57,-6.6 181.37,-6.6 137.84,-6.6"/> -<polygon fill="green" stroke="green" points="138.1,-3.1 128.1,-6.6 138.1,-10.1 138.1,-3.1"/> -</g> -<!-- edge_6->0 --> -<g id="edge20" class="edge"> -<title>edge_6->0</title> -<path fill="none" stroke="black" d="M32.31,-128.31C31.52,-122.41 25.86,-79.93 21.9,-50.22"/> -<polygon fill="black" stroke="black" points="25.42,-50.13 20.62,-40.68 18.48,-51.06 25.42,-50.13"/> -<text text-anchor="middle" x="23.73" y="-92.47" font-family="Times,serif" font-size="14.00">6</text> -</g> -<!-- edge_6->edge_7 --> -<g id="edge21" class="edge"> -<title>edge_6->edge_7</title> -<path fill="none" stroke="green" d="M32.32,-128.18C31.32,-123.36 21.49,-121.48 13.61,-122.54"/> -<polygon fill="green" stroke="green" points="11.94,-119.46 4.99,-127.46 15.41,-125.54 11.94,-119.46"/> -</g> -<!-- edge_7->4 --> -<g id="edge23" class="edge"> -<title>edge_7->4</title> -<path fill="none" stroke="black" d="M3.69,-129.69C4.48,-135.59 10.14,-178.07 14.1,-207.78"/> -<polygon fill="black" stroke="black" points="10.58,-207.87 15.38,-217.32 17.52,-206.94 10.58,-207.87"/> -<text text-anchor="middle" x="5.52" y="-171.93" font-family="Times,serif" font-size="14.00">7</text> -</g> -<!-- edge_7->edge_6 --> -<g id="edge24" class="edge"> -<title>edge_7->edge_6</title> -<path fill="none" stroke="green" d="M3.68,-129.82C4.68,-134.64 14.51,-136.52 22.39,-135.46"/> -<polygon fill="green" stroke="green" points="24.06,-138.54 31.01,-130.54 20.59,-132.46 24.06,-138.54"/> -</g> -</g> -</svg> |