graph_algo_ptas/data_structure/
dot_renderer.rs

1//! Implements the dot GraphWalker trait for LinkGraph to allow dot creation
2//! ```
3//! use std::fs::File;
4//! use graph_algo_ptas::data_structure::link_graph::LinkGraph;
5//!
6//! let g = LinkGraph::new(); // the graph to render
7//! let mut o = File::create("circle.dot").unwrap(); // or any implementation std::io::Write
8//! dot::render(&g, &mut o).unwrap();
9//! ```
10
11use crate::data_structure::graph_dcel::GraphDCEL;
12use crate::data_structure::link_graph::{LinkDart, LinkGraph, LinkVertex};
13use dot::{Edges, GraphWalk, Id, Labeller, Nodes};
14
15impl<'a> GraphWalk<'a, LinkVertex, LinkDart> for LinkGraph {
16    fn nodes(&'a self) -> Nodes<'a, LinkVertex> {
17        self.get_vertexes().collect()
18    }
19
20    fn edges(&'a self) -> Edges<'a, LinkDart> {
21        self.get_darts().collect()
22    }
23
24    fn source(&'a self, edge: &LinkDart) -> LinkVertex {
25        self.dart_target(&self.twin(edge))
26    }
27
28    fn target(&'a self, edge: &LinkDart) -> LinkVertex {
29        self.dart_target(edge)
30    }
31}
32
33impl<'a> Labeller<'a, LinkVertex, LinkDart> for LinkGraph {
34    fn graph_id(&'a self) -> Id<'a> {
35        Id::new("Test").unwrap()
36    }
37
38    fn node_id(&'a self, vertex: &LinkVertex) -> Id<'a> {
39        let x = vertex.get_id() as u32;
40        let name = format!("N{}", x.clone());
41        let id = Id::new(name);
42        id.unwrap()
43    }
44}
45
46#[cfg(test)]
47mod tests {
48    use crate::data_structure::link_graph::LinkGraph;
49    use crate::utils::single_face::generate_single_face;
50    use std::borrow::Borrow;
51    use std::fs::File;
52
53    #[test]
54    fn test_two_vertices() {
55        let mut f = File::create("two_vertices.dot").unwrap();
56
57        let mut lg = LinkGraph::new();
58        lg.new_vertex();
59        lg.new_vertex();
60
61        dot::render(lg.borrow(), &mut f).unwrap()
62    }
63
64    #[test]
65    fn circle() {
66        let mut f = File::create("circle.dot").unwrap();
67
68        let cg = generate_single_face(3);
69
70        dot::render(cg.borrow(), &mut f).unwrap()
71    }
72}