pub fn disk(radius: u8) -> Self {
        let radius_squared = u32::from(radius).pow(2);
        let half_widths_per_height = std::iter::successors(
            Some((-i16::from(radius), 0u8)),
            |&(last_height, last_half_width)| {
                if last_height == i16::from(radius) {
                    return None;
                };
                let next_height = last_height + 1;
                let height_squared = (u32::from(next_height.unsigned_abs())).pow(2);
                let next_half_width = if next_height <= 0 {
                    // upper part of the circle => increasing width
                    (u32::from(last_half_width)..)
                        .find(|x| (x + 1).pow(2) + height_squared > radius_squared)?
                } else {
                    // lower part of the circle => decreasing width
                    (0u32..=last_half_width.into())
                        .rev()
                        .find(|&x| x.pow(2) + height_squared <= radius_squared)?
                };
                Some((next_height, next_half_width.try_into().unwrap()))
            },
        );
        let cap = half_widths_per_height
            .clone()
            .map(|(_, half_width)| 2 * usize::from(half_width) + 1)
            .sum();
        let mut elements = Vec::with_capacity(cap);
        let points = half_widths_per_height.flat_map(|(y, half_width)| {
            (-i16::from(half_width)..=i16::from(half_width)).map(move |x| Point::new(x, y))
        });
        elements.extend(points);
        Self::new(elements)
    }
Creates a disk-shaped mask containing all points with `L2` norm at most `radius`.

When computing distances using the L2 norm we take the ceiling of the true values.
This means that using the L2 norm gives the same results as the `L1` norm for `radius <= 2`.

# Example
```
# extern crate image;
# #[macro_use]
# extern crate imageproc;
# fn main() {
use imageproc::morphology::Mask;

// For radius <= 2, Mask::disk(radius) is the same as Mask::diamond(radius).
let disk_2 = gray_image!(
0,   0, 255,   0,   0;
0, 231, 204, 101,   0;
149, 193, 188, 137, 199;
0, 222, 182, 114,   0;
0,   0, 217,   0,   0
);
assert_eq!(Mask::disk(2), Mask::from_image(&disk_2, 2, 2));

// Mask::disk(3) is a filled circle of radius 3.
let disk_3 = gray_image!(
0,   0,   0, 255,   0,   0,   0;
0, 255, 255, 255, 255, 255,   0;
0, 255, 255, 255, 255, 255,   0;
255, 255, 255, 255, 255, 255, 255;
0, 255, 255, 255, 255, 255,   0;
0, 255, 255, 255, 255, 255,   0;
0,   0,   0, 255,   0,   0,   0
);
assert_eq!(Mask::disk(3), Mask::from_image(&disk_3, 3, 3));
# }
```
src/morphology.rs