#![deny(missing_docs)]
pub use rand;
pub use generic_array;
pub use generic_array::typenum;
use generic_array::{GenericArray, ArrayLength};
use generic_array::functional::FunctionalSequence;
use generic_array::sequence::GenericSequence;
use rand::Rng;
use rand::distributions::{Distribution, Standard};
const PI2: f64 = 2.0 * std::f64::consts::PI;
#[derive(Clone, Copy, Debug)]
pub struct UnitSinusoid {
pub frequency: f64,
pub phase: f64,
}
impl Distribution<UnitSinusoid> for Standard {
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> UnitSinusoid {
let frequency: f64 = rng.gen_range(1.0, 10.0);
let phase = rng.gen_range(0.0, frequency.recip());
UnitSinusoid { frequency, phase }
}
}
impl UnitSinusoid {
fn haversin(theta: f64) -> f64 {
(1.0 - theta.cos()) / 2.0
}
pub fn evaluate(self, t: f64) -> f64 {
Self::haversin(PI2 * self.frequency * (t + self.phase))
}
}
#[derive(Clone, Copy, Debug)]
pub struct Meander1D(pub UnitSinusoid, pub UnitSinusoid, pub UnitSinusoid);
impl Meander1D {
pub fn evaluate(self, t: f64) -> f64 {
( (self.0).evaluate(t)
+ (self.1).evaluate(t)
+ (self.2).evaluate(t)
) / 3.0
}
}
impl Distribution<Meander1D> for Standard {
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Meander1D {
Meander1D(rng.gen(), rng.gen(), rng.gen())
}
}
#[derive(Clone, Debug)]
pub struct Meander<D: ArrayLength<Meander1D>> {
pub curves: GenericArray<Meander1D, D>,
}
impl<D: ArrayLength<Meander1D>> Distribution<Meander<D>> for Standard {
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Meander<D> {
Meander {
curves: <GenericArray<_, _> as GenericSequence<_>>::generate(|_| rng.gen()),
}
}
}
impl<D: ArrayLength<Meander1D> + ArrayLength<f64>> Meander<D> {
pub fn evaluate(&self, t: f64) -> GenericArray<f64, D> {
(&self).curves.clone().map(|c| c.evaluate(t))
}
pub fn time_steps<'a>(&'a self, dt: f64) -> impl Iterator<Item=GenericArray<f64, D>> + 'a {
(0..).map(move |i| self.evaluate(i as f64 * dt))
}
pub fn into_time_steps(self, dt: f64) -> impl Iterator<Item=GenericArray<f64, D>> {
(0..).map(move |i| self.evaluate(i as f64 * dt))
}
}