pub fn generate_square_grid(rows: usize, cols: usize) -> Vec<[f64; 2]> {
(0..rows)
.scan(0.0, |y, _| {
let current = *y;
*y += 1.0;
Some(current)
})
.flat_map(|y| {
(0..cols)
.scan(0.0, |x, _| {
let current = *x;
*x += 1.0;
Some(current)
})
.map(move |x| [x, y])
})
.collect()
}
pub fn generate_triangular_grid(n_target: usize) -> Vec<[f64; 2]> {
const U: [f64; 2] = [1.0, 0.0];
let v = [0.5, (3.0_f64).sqrt() / 2.0];
(0_i32..)
.flat_map(|layer| {
(-layer..=layer)
.flat_map(move |q| (-layer..=layer).map(move |r| (q, r)))
.filter(move |&(q, r)| {
(q + r).abs() <= layer
&& (q.abs() == layer
|| r.abs() == layer
|| (q + r).abs() == layer
|| layer == 0)
})
.map(|(q, r)| {
let q = f64::from(q);
let r = f64::from(r);
[q * U[0] + r * v[0], q * U[1] + r * v[1]]
})
})
.take(n_target)
.collect()
}
pub fn generate_moser_spindle() -> Vec<[f64; 2]> {
let alpha = (5.0 / 6.0_f64).acos();
let r = 3.0_f64.sqrt();
let d1_angle = -alpha / 2.0;
let d2_angle = alpha / 2.0;
let a = [0.0, 0.0];
let d1 = [r * d1_angle.cos(), r * d1_angle.sin()];
let d2 = [r * d2_angle.cos(), r * d2_angle.sin()];
let pi_6 = std::f64::consts::PI / 6.0;
let b1 = [(d1_angle + pi_6).cos(), (d1_angle + pi_6).sin()];
let c1 = [(d1_angle - pi_6).cos(), (d1_angle - pi_6).sin()];
let b2 = [(d2_angle - pi_6).cos(), (d2_angle - pi_6).sin()];
let c2 = [(d2_angle + pi_6).cos(), (d2_angle + pi_6).sin()];
vec![a, b1, c1, d1, b2, c2, d2]
}