From c7039f0fc2d49dd0501db8f201e66a915d189ac1 Mon Sep 17 00:00:00 2001 From: Akshay Date: Sun, 14 Mar 2021 12:35:34 +0530 Subject: add symmetry options --- src/app.rs | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 53 insertions(+), 7 deletions(-) (limited to 'src/app.rs') diff --git a/src/app.rs b/src/app.rs index bcc9c3a..13f8732 100644 --- a/src/app.rs +++ b/src/app.rs @@ -38,6 +38,12 @@ struct Grid { color: Color, } +#[derive(Debug, Default, Copy, Clone)] +struct Symmetry { + x: Option, + y: Option, +} + impl Grid { fn new() -> Self { Self { @@ -99,6 +105,44 @@ impl<'ctx> AppState<'ctx> { self.grid.enabled = !self.grid.enabled; } + fn cycle_symmetry(&mut self) { + let Symmetry { x, y } = self.symmetry; + self.symmetry = match (x, y) { + (None, None) => Symmetry { + x: Some(self.width() / 2), + y: None, + }, + (_, None) => Symmetry { + x: None, + y: Some(self.height() / 2), + }, + (None, y) => Symmetry { + x: Some(self.width() / 2), + y, + }, + (Some(_), Some(_)) => Symmetry { x: None, y: None }, + } + } + + fn apply_symmetry(&self, figure: &[MapPoint]) -> Vec { + let Symmetry { x, y } = self.symmetry; + match (x, y) { + (None, None) => vec![], + (Some(line), None) => self.pixmap.mirror_figure(figure, line, Axis::X), + (None, Some(line)) => self.pixmap.mirror_figure(figure, line, Axis::Y), + (Some(x), Some(y)) => { + let along_x = self.pixmap.mirror_figure(figure, x, Axis::X); + let along_y = self.pixmap.mirror_figure(figure, y, Axis::Y); + let reflected = self.pixmap.reflect_figure(figure, (x, y).into()); + along_x + .into_iter() + .chain(along_y) + .chain(reflected) + .collect() + } + } + } + fn paint_point>( &mut self, center: P, @@ -106,21 +150,24 @@ impl<'ctx> AppState<'ctx> { ) -> Result, ()> { let radius = self.brush_size as u32; let center = self.idx_at_coord(center).ok_or(())?; - let mut circle_modify_record = vec![]; - for point in self.pixmap.get_circle(center, radius) { + let mut modify_record = vec![]; + let circle = self.pixmap.get_circle(center, radius); + let sym_circle = self.apply_symmetry(&circle); + for point in circle.into_iter().chain(sym_circle) { let old_val = self.pixmap.set(point, val); - circle_modify_record.push(ModifyRecord::new(point, old_val, val)); + modify_record.push(ModifyRecord::new(point, old_val, val)); } - Ok(circle_modify_record) + Ok(modify_record) } fn paint_line>(&mut self, start: P, end: P) -> Result, ()> { let start = self.idx_at_coord(start).ok_or(())?; let end = self.idx_at_coord(end).ok_or(())?; - let line_coords = self.pixmap.get_line(start, end); + let line = self.pixmap.get_line(start, end); + let sym_line = self.apply_symmetry(&line); let mut line_modify_record = vec![]; let val = self.active_color; - for point in line_coords { + for point in line.into_iter().chain(sym_line) { let circle_around_point = self.pixmap.get_circle(point, self.brush_size as u32); for c in circle_around_point { let old_val = self.pixmap.set(c, val); @@ -292,7 +339,6 @@ impl<'ctx> AppState<'ctx> { self.canvas.present(); let mut event_pump = self.context.event_pump().unwrap(); - 'running: loop { let mouse = event_pump.mouse_state(); for event in event_pump.poll_iter() { -- cgit v1.2.3