217 ArcPoints::new(radius) |
217 ArcPoints::new(radius) |
218 .map(&mut |p: Point| self.fill_circle_lines(x, y, p.x, p.y, &f)) |
218 .map(&mut |p: Point| self.fill_circle_lines(x, y, p.x, p.y, &f)) |
219 .sum() |
219 .sum() |
220 } |
220 } |
221 |
221 |
|
222 fn fill_row(&mut self, center: Point, offset: Point, value: T) -> usize { |
|
223 let row_index = center.y + offset.y; |
|
224 if self.is_valid_y(row_index) { |
|
225 let from_x = cmp::max(0, center.x - offset.x) as usize; |
|
226 let to_x = cmp::min(self.width() - 1, (center.x + offset.x) as usize); |
|
227 self.pixels[row_index as usize][from_x..=to_x] |
|
228 .iter_mut().for_each(|v| *v = value); |
|
229 to_x - from_x + 1 |
|
230 } else { |
|
231 0 |
|
232 } |
|
233 } |
|
234 |
|
235 pub fn fill_circle(&mut self, center: Point, radius: i32, value: T) -> usize { |
|
236 let transforms = |
|
237 [[0, 1, 1, 0], [0, 1, -1, 0], |
|
238 [1, 0, 0, 1], [1, 0, 0, -1]]; |
|
239 ArcPoints::new(radius).map(|vector| { |
|
240 transforms.iter().map(|m| |
|
241 self.fill_row(center, vector.transform(m), value) |
|
242 ).sum::<usize>() |
|
243 }).sum() |
|
244 } |
|
245 |
222 pub fn draw_thick_line(&mut self, from: Point, to: Point, radius: i32, value: T) -> usize { |
246 pub fn draw_thick_line(&mut self, from: Point, to: Point, radius: i32, value: T) -> usize { |
223 let mut result = 0; |
247 let mut result = 0; |
224 |
248 |
225 for vector in ArcPoints::new(radius) { |
249 for vector in ArcPoints::new(radius) { |
226 for delta in EquidistantPoints::new(vector) { |
250 for delta in EquidistantPoints::new(vector) { |