+#[derive(Debug, Default)]
+pub struct Grid<T> {
+ pub size: Dimension<usize>,
+ pub cell_size: Dimension<usize>,
+ pub cells: Vec<Vec<T>>,
+}
+
+////////// WALL REGION /////////////////////////////////////////////////////////
+
+#[derive(Debug)]
+pub struct WallRegion {
+ edges: Vec<Rc<WallEdge>>,
+}
+
+impl WallRegion {
+ pub fn new(points: Vec<Point<f64>>) -> Rc<Self> {
+ let mut edges = vec!();
+
+ for i in 0..points.len() {
+ let edge = Rc::new(WallEdge {
+ index: i,
+ p1: points[i],
+ p2: points[(i + 1) % points.len()],
+ });
+ edges.push(edge);
+ }
+
+ Rc::new(WallRegion { edges })
+ }
+
+ #[allow(dead_code)]
+ fn next(&self, index: usize) -> Rc<WallEdge> {
+ let index = (index + 1) % self.edges.len();
+ Rc::clone(&self.edges[index])
+ }
+
+ #[allow(dead_code)]
+ fn previous(&self, index: usize) -> Rc<WallEdge> {
+ let index = (index + self.edges.len() + 1) % self.edges.len();
+ Rc::clone(&self.edges[index])
+ }
+}
+
+////////// WALL EDGE ///////////////////////////////////////////////////////////
+
+#[derive(Debug, Default)]
+struct WallEdge {
+ index: usize,
+ pub p1: Point<f64>,
+ pub p2: Point<f64>,