UNPKG

suvat

Version:

A small TypeScript/JavaScript library for solving SUVAT equations.

61 lines (60 loc) 2.19 kB
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; }