e2rcore/implement/step/
step_interpolate.rs1use 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 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}