# HG changeset patch # User alfadur # Date 1541183448 -10800 # Node ID d0b0d61b7d5eea3625d8e7b8b938e842ee29fbe7 # Parent dbaa125a0fe91606df4f1b969c9b1d02f8db5a40 add polygons diff -r dbaa125a0fe9 -r d0b0d61b7d5e rust/integral-geometry/src/lib.rs --- a/rust/integral-geometry/src/lib.rs Fri Nov 02 20:46:17 2018 +0300 +++ b/rust/integral-geometry/src/lib.rs Fri Nov 02 21:30:48 2018 +0300 @@ -325,6 +325,51 @@ } } +pub struct Polygon { + vertices: Vec +} + +impl Polygon { + pub fn new(vertices: &[Point]) -> Self { + let mut v = Vec::with_capacity(vertices.len() + 1); + v.extend_from_slice(vertices); + if !v.is_empty() { + let start = v[0]; + v.push(start); + } + Self { vertices: v } + } + + pub fn edges_count(&self) -> usize { + self.vertices.len() - 1 + } + + pub fn get_edge(&self, index: usize) -> Line { + Line::new(self.vertices[index], self.vertices[index + 1]) + } + + pub fn iter<'a>(&'a self) -> impl Iterator + 'a { + (&self.vertices[..self.edges_count()]).iter().cloned() + } + + pub fn iter_edges<'a>(&'a self) -> impl Iterator + 'a { + (&self.vertices[0..self.edges_count()]) + .iter() + .zip(&self.vertices[1..]) + .map(|(s, e)| Line::new(*s, *e)) + } +} + +impl From> for Polygon { + fn from(mut v: Vec) -> Self { + if !v.is_empty() && v[0] != v[v.len() - 1] { + let start = v[0]; + v.push(start) + } + Self { vertices: v } + } +} + #[derive(PartialEq, Eq, Clone, Copy, Debug)] pub struct Line { pub start: Point,