e2rcore/implement/step/
step_interpolate.rs

1use interface::i_interpolate::IInterpolate;
2use interface::i_step::Step;
3
4pub fn step_delta< T, V >( s: & mut Step, step_delta: f64, interp: & mut T ) -> V where T : IInterpolate< V >, V: Clone
5{
6    if s._current_val >= s._range_val.1 {
7        return interp.interp_current()
8    }
9    //clamp values to constraints
10    let a = s._current_val + step_delta;
11    let b = if a < s._range_val.0 {
12        s._range_val.0
13    }else if a > s._range_val.1 {
14        s._range_val.1
15    }else {
16        a
17    };
18    let c = b - s._range_val.0;
19    let total_steps = interp.num_steps();
20    let fraction = c / ( s._range_val.1 - s._range_val.0 );
21    let calc_steps = ( fraction * total_steps as f64 ) as u64;
22    let mut ret = interp.interp_current();
23    s._current_val = if s._current_val + c > s._range_val.1 {
24        s._range_val.1
25    } else {
26        s._current_val + c
27    };
28
29    for _ in 0..calc_steps as usize {
30        match interp.next() {
31            None => { break; },
32            Some( o ) => { ret = o; },
33        }
34    }
35    ret
36}