use std::f64::consts::TAU;
pub struct FibonacciLattice {
epsilon: f64,
}
impl FibonacciLattice {
pub fn new(epsilon: f64) -> FibonacciLattice {
FibonacciLattice { epsilon }
}
pub fn square_iter(&self, n: usize) -> impl Iterator<Item = (f64, f64)> {
const PHI: f64 = 1.618033988749895;
(0..n).map(move |i| {
(
i as f64 / PHI % 1.,
(i as f64 + self.epsilon) / ((n - 1) as f64 + 2. * self.epsilon),
)
})
}
pub fn disk_iter(&self, n: usize) -> impl Iterator<Item = (f64, f64)> {
self.square_iter(n).map(|(x, y)| (x * TAU, y.sqrt()))
}
pub fn sphere_iter(&self, n: usize) -> impl Iterator<Item = (f64, f64)> {
self.square_iter(n)
.map(|(x, y)| (x * TAU, (1. - 2. * y).acos()))
}
}
impl Default for FibonacciLattice {
fn default() -> Self {
FibonacciLattice { epsilon: 0.5 }
}
}