use std::fmt; use crate::bitmap::{mirror_figure, reflect_figure, Axis, MapPoint}; #[derive(Debug, Default, Copy, Clone)] pub struct Symmetry { pub x: Option, pub y: Option, } impl Symmetry { pub fn apply(self, figure: &[MapPoint]) -> Vec { let Symmetry { x, y } = self; match (x, y) { (None, None) => vec![], (Some(line), None) => mirror_figure(figure, line, Axis::X), (None, Some(line)) => mirror_figure(figure, line, Axis::Y), (Some(x), Some(y)) => { let along_x = mirror_figure(figure, x, Axis::X); let along_y = mirror_figure(figure, y, Axis::Y); let reflected = reflect_figure(figure, (y, x).into()); along_x .into_iter() .chain(along_y) .chain(reflected) .collect() } } } } impl fmt::Display for Symmetry { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { let Symmetry { x, y } = self; match (x, y) { (None, None) => write!(f, "OFF"), (Some(_), None) => write!(f, "HOR"), (None, Some(_)) => write!(f, "VER"), (Some(_), Some(_)) => write!(f, "RAD"), } } }