36 lines
1.2 KiB
JavaScript
36 lines
1.2 KiB
JavaScript
import { cond, sub, pow, divide, multiply, add, block, set, lessThan, proc, abs } from '../base';
|
|
const VELOCITY_EPS = 5;
|
|
|
|
function decay(clock, state, config) {
|
|
const lastTime = cond(state.time, state.time, clock);
|
|
const deltaTime = sub(clock, lastTime); // v0 = v / 1000
|
|
// v = v0 * powf(deceleration, dt);
|
|
// v = v * 1000;
|
|
// x0 = x;
|
|
// x = x0 + v0 * deceleration * (1 - powf(deceleration, dt)) / (1 - deceleration)
|
|
|
|
const kv = pow(config.deceleration, deltaTime);
|
|
const kx = divide(multiply(config.deceleration, sub(1, kv)), sub(1, config.deceleration));
|
|
const v0 = divide(state.velocity, 1000);
|
|
const v = multiply(v0, kv, 1000);
|
|
const x = add(state.position, multiply(v0, kx));
|
|
return block([set(state.position, x), set(state.velocity, v), set(state.time, clock), cond(lessThan(abs(v), VELOCITY_EPS), set(state.finished, 1))]);
|
|
}
|
|
|
|
const procDecay = proc((clock, time, velocity, position, finished, deceleration) => decay(clock, {
|
|
time,
|
|
velocity,
|
|
position,
|
|
finished
|
|
}, {
|
|
deceleration
|
|
}));
|
|
export default ((clock, {
|
|
time,
|
|
velocity,
|
|
position,
|
|
finished
|
|
}, {
|
|
deceleration
|
|
}) => procDecay(clock, time, velocity, position, finished, deceleration));
|
|
//# sourceMappingURL=decay.js.map
|