dsmc 0.1.1

Digitalservo Motion Control Library
Documentation
use std::ops::AddAssign;

use num_traits::{Float, FloatConst};

use crate::trajectory::TrajectoryProfile;

pub fn generate<T: Float + FloatConst + AddAssign>(distance: T, samples: usize) -> Vec<TrajectoryProfile<T>> {

    let mut t = T::zero();
    let dt: T = T::one() / T::from(samples - 1).unwrap();
    let pi: T = FloatConst::PI();

    let gain = distance * T::from(0.5).unwrap();

    let mut trajectory = Vec::<TrajectoryProfile<T>>::with_capacity(samples);

    for _ in 0..samples {
        let s = gain * (T::one() - (pi * t).cos());
        let v = gain * pi * (pi * t).sin();
        let a = gain * pi * pi * (pi * t).cos();
        trajectory.push(TrajectoryProfile { s, v, a });
        t += dt;
    }

    trajectory
}