suvat
Version:
A small TypeScript/JavaScript library for solving SUVAT equations.
61 lines (60 loc) • 2.19 kB
JavaScript
export const formulas = Object.freeze({
s: Object.freeze({
u(d) { return d.v * d.t - 1 / 2 * d.a * d.t ** 2; },
v(d) { return d.u * d.t + 1 / 2 * d.a * d.t ** 2; },
a(d) { return d.t / 2 * (d.u + d.v); },
t(d) { return (d.v ** 2 - d.u ** 2) / (2 * d.a); },
}),
u: Object.freeze({
s(d) { return d.v - d.a * d.t; },
v(d) { return (d.s - (1 / 2) * d.a * d.t ** 2) / d.t; },
a(d) { return 2 * d.s / d.t - d.v; },
t(d) { return (d.v ** 2 - 2 * d.a * d.s) ** (1 / 2); },
}),
v: Object.freeze({
s(d) { return d.u + d.a * d.t; },
u(d) { return (d.s + (1 / 2) * d.a * d.t ** 2) / d.t; },
a(d) { return 2 * d.s / d.t - d.u; },
t(d) { return (d.u ** 2 + 2 * d.a * d.s) ** (1 / 2); },
}),
a: Object.freeze({
s(d) { return (d.v - d.u) / d.t; },
u(d) { return 2 * (d.v * d.t - d.s) / (d.t ** 2); },
v(d) { return 2 * (d.s - d.u * d.t) / (d.t ** 2); },
t(d) { return (d.v ** 2 - d.u ** 2) / (2 * d.s); },
}),
t: Object.freeze({
s(d) { return (d.v - d.u) / d.a; },
u(d) { return (d.v - (d.v ** 2 - 2 * d.a * d.s) ** (1 / 2)) / d.a; },
v(d) { return ((2 * d.a * d.s + d.u ** 2) ** (1 / 2) - d.u) / d.a; },
a(d) { return (2 * d.s) / (d.u + d.v); },
}),
});
export function complete(data) {
// get unknowns
const unknowns = [];
for (const key of ["s", "u", "v", "a", "t"]) {
if (!Number.isFinite(data[key]))
unknowns.push(key);
}
// already complete
if (unknowns.length === 0)
return data;
// too many unknowns
if (unknowns.length > 2)
return undefined;
const out = { ...data };
if (unknowns.length === 2) {
// 2 unknowns
out[unknowns[0]] = _stripFloat(formulas[unknowns[0]][unknowns[1]](data));
out[unknowns[1]] = _stripFloat(formulas[unknowns[1]][unknowns[0]](data));
}
else {
// 1 unknown
out[unknowns[0]] = _stripFloat(Object.values(formulas[unknowns[0]])[0](data));
}
return out;
}
function _stripFloat(number) {
return Math.round(number * 10000000000) / 10000000000;
}