UNPKG

trigonometry-calculator

Version:

Completely solve trigonometry equations for angles and sides

63 lines (55 loc) 7.71 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; exports.trigCalculator = trigCalculator; var _trigonometryEquations = require('trigonometry-equations'); /** * Completely solve for any unknown angles or sides of a triangle * @param {object} angles - angle indices and numerical values * @param {object} sides - side indices and numerical values * @return {object} error key with the issue description as the value * @return {object} input with additional key-values pairs of solutions */ function trigCalculator() { var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref$angles = _ref.angles, angles = _ref$angles === undefined ? {} : _ref$angles, _ref$sides = _ref.sides, sides = _ref$sides === undefined ? {} : _ref$sides; var angleKeys = Object.keys(angles).length; var sideKeys = Object.keys(sides).length; var otherSides = function otherSides(side) { return Object.keys(sides).filter(function (e) { return e !== side; }); }; var sum = function sum(previous, current) { return sides[previous] + sides[current]; }; var sideInequality = function sideInequality(bool, key) { return bool && sides[key] < otherSides(key).reduce(sum); }; var validSides = sideKeys > 1 && Object.keys(sides).reduce(sideInequality, true); var pairs = [0, 1, 2].filter(function (e) { return angles[e] && sides[e]; }); var solution = null; if (sideKeys === 3 && validSides) { solution = (0, _trigonometryEquations.angleRule)((0, _trigonometryEquations.cosineRule)((0, _trigonometryEquations.cosineRule)({ angles: angles, sides: sides }))); } else if (sideKeys === 2 && angleKeys === 1) { var ambiguous = (0, _trigonometryEquations.ambiguousCaseRule)({ angles: angles, sides: sides }); solution = { angles: angles, sides: sides }; if (pairs.length < 1) solution = (0, _trigonometryEquations.cosineRule)(solution); solution = (0, _trigonometryEquations.angleRule)((0, _trigonometryEquations.sineRule)(solution)); if (pairs.length >= 1) solution = (0, _trigonometryEquations.sineRule)(solution); solution = _extends({}, solution, ambiguous); } else if (sideKeys === 1 && angleKeys === 2) { solution = (0, _trigonometryEquations.sineRule)((0, _trigonometryEquations.sineRule)((0, _trigonometryEquations.angleRule)({ angles: angles, sides: sides }))); } else { solution = { error: 'trigCalculator expects a valid pair of angles or sides' }; } return solution; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6WyJ0cmlnQ2FsY3VsYXRvciIsImFuZ2xlcyIsInNpZGVzIiwiYW5nbGVLZXlzIiwiT2JqZWN0Iiwia2V5cyIsImxlbmd0aCIsInNpZGVLZXlzIiwib3RoZXJTaWRlcyIsImZpbHRlciIsImUiLCJzaWRlIiwic3VtIiwicHJldmlvdXMiLCJjdXJyZW50Iiwic2lkZUluZXF1YWxpdHkiLCJib29sIiwia2V5IiwicmVkdWNlIiwidmFsaWRTaWRlcyIsInBhaXJzIiwic29sdXRpb24iLCJhbWJpZ3VvdXMiLCJlcnJvciJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7UUFjZ0JBLGMsR0FBQUEsYzs7QUFkaEI7O0FBT0E7Ozs7Ozs7QUFPTyxTQUFTQSxjQUFULEdBQTJEO0FBQUEsaUZBQUosRUFBSTtBQUFBLHlCQUFoQ0MsTUFBZ0M7QUFBQSxNQUFoQ0EsTUFBZ0MsK0JBQXZCLEVBQXVCO0FBQUEsd0JBQW5CQyxLQUFtQjtBQUFBLE1BQW5CQSxLQUFtQiw4QkFBWCxFQUFXOztBQUNoRSxNQUFNQyxZQUFZQyxPQUFPQyxJQUFQLENBQVlKLE1BQVosRUFBb0JLLE1BQXRDO0FBQ0EsTUFBTUMsV0FBV0gsT0FBT0MsSUFBUCxDQUFZSCxLQUFaLEVBQW1CSSxNQUFwQztBQUNBLE1BQU1FLGFBQWEsU0FBYkEsVUFBYTtBQUFBLFdBQVFKLE9BQU9DLElBQVAsQ0FBWUgsS0FBWixFQUFtQk8sTUFBbkIsQ0FBMEI7QUFBQSxhQUFLQyxNQUFNQyxJQUFYO0FBQUEsS0FBMUIsQ0FBUjtBQUFBLEdBQW5CO0FBQ0EsTUFBTUMsTUFBTSxTQUFOQSxHQUFNLENBQUNDLFFBQUQsRUFBV0MsT0FBWDtBQUFBLFdBQXVCWixNQUFNVyxRQUFOLElBQWtCWCxNQUFNWSxPQUFOLENBQXpDO0FBQUEsR0FBWjtBQUNBLE1BQU1DLGlCQUFpQixTQUFqQkEsY0FBaUIsQ0FBQ0MsSUFBRCxFQUFPQyxHQUFQO0FBQUEsV0FBZUQsUUFBUWQsTUFBTWUsR0FBTixJQUFhVCxXQUFXUyxHQUFYLEVBQWdCQyxNQUFoQixDQUF1Qk4sR0FBdkIsQ0FBcEM7QUFBQSxHQUF2QjtBQUNBLE1BQU1PLGFBQWFaLFdBQVcsQ0FBWCxJQUFnQkgsT0FBT0MsSUFBUCxDQUFZSCxLQUFaLEVBQW1CZ0IsTUFBbkIsQ0FBMEJILGNBQTFCLEVBQTBDLElBQTFDLENBQW5DO0FBQ0EsTUFBTUssUUFBUSxDQUFDLENBQUQsRUFBSSxDQUFKLEVBQU8sQ0FBUCxFQUFVWCxNQUFWLENBQWlCO0FBQUEsV0FBS1IsT0FBT1MsQ0FBUCxLQUFhUixNQUFNUSxDQUFOLENBQWxCO0FBQUEsR0FBakIsQ0FBZDtBQUNBLE1BQUlXLFdBQVcsSUFBZjs7QUFFQSxNQUFJZCxhQUFhLENBQWIsSUFBa0JZLFVBQXRCLEVBQWtDO0FBQ2hDRSxlQUFXLHNDQUFVLHVDQUFXLHVDQUFXLEVBQUVwQixjQUFGLEVBQVVDLFlBQVYsRUFBWCxDQUFYLENBQVYsQ0FBWDtBQUNELEdBRkQsTUFFTyxJQUFJSyxhQUFhLENBQWIsSUFBa0JKLGNBQWMsQ0FBcEMsRUFBdUM7QUFDNUMsUUFBTW1CLFlBQVksOENBQWtCLEVBQUVyQixjQUFGLEVBQVVDLFlBQVYsRUFBbEIsQ0FBbEI7QUFDQW1CLGVBQVcsRUFBRXBCLGNBQUYsRUFBVUMsWUFBVixFQUFYO0FBQ0EsUUFBSWtCLE1BQU1kLE1BQU4sR0FBZSxDQUFuQixFQUFzQmUsV0FBVyx1Q0FBV0EsUUFBWCxDQUFYO0FBQ3RCQSxlQUFXLHNDQUFVLHFDQUFTQSxRQUFULENBQVYsQ0FBWDtBQUNBLFFBQUlELE1BQU1kLE1BQU4sSUFBZ0IsQ0FBcEIsRUFBdUJlLFdBQVcscUNBQVNBLFFBQVQsQ0FBWDtBQUN2QkEsNEJBQWdCQSxRQUFoQixFQUE2QkMsU0FBN0I7QUFDRCxHQVBNLE1BT0EsSUFBSWYsYUFBYSxDQUFiLElBQWtCSixjQUFjLENBQXBDLEVBQXVDO0FBQzVDa0IsZUFBVyxxQ0FBUyxxQ0FBUyxzQ0FBVSxFQUFFcEIsY0FBRixFQUFVQyxZQUFWLEVBQVYsQ0FBVCxDQUFULENBQVg7QUFDRCxHQUZNLE1BRUE7QUFDTG1CLGVBQVcsRUFBRUUsT0FBTyx3REFBVCxFQUFYO0FBQ0Q7O0FBRUQsU0FBT0YsUUFBUDtBQUNEIiwiZmlsZSI6ImluZGV4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgYW1iaWd1b3VzQ2FzZVJ1bGUsXG4gIGFuZ2xlUnVsZSxcbiAgY29zaW5lUnVsZSxcbiAgc2luZVJ1bGVcbn0gZnJvbSAndHJpZ29ub21ldHJ5LWVxdWF0aW9ucydcblxuLyoqXG4qIENvbXBsZXRlbHkgc29sdmUgZm9yIGFueSB1bmtub3duIGFuZ2xlcyBvciBzaWRlcyBvZiBhIHRyaWFuZ2xlXG4qIEBwYXJhbSB7b2JqZWN0fSBhbmdsZXMgLSBhbmdsZSBpbmRpY2VzIGFuZCBudW1lcmljYWwgdmFsdWVzXG4qIEBwYXJhbSB7b2JqZWN0fSBzaWRlcyAtIHNpZGUgaW5kaWNlcyBhbmQgbnVtZXJpY2FsIHZhbHVlc1xuKiBAcmV0dXJuIHtvYmplY3R9IGVycm9yIGtleSB3aXRoIHRoZSBpc3N1ZSBkZXNjcmlwdGlvbiBhcyB0aGUgdmFsdWVcbiogQHJldHVybiB7b2JqZWN0fSBpbnB1dCB3aXRoIGFkZGl0aW9uYWwga2V5LXZhbHVlcyBwYWlycyBvZiBzb2x1dGlvbnNcbiovXG5leHBvcnQgZnVuY3Rpb24gdHJpZ0NhbGN1bGF0b3IgKHsgYW5nbGVzID0ge30sIHNpZGVzID0ge30gfSA9IHt9KSB7XG4gIGNvbnN0IGFuZ2xlS2V5cyA9IE9iamVjdC5rZXlzKGFuZ2xlcykubGVuZ3RoXG4gIGNvbnN0IHNpZGVLZXlzID0gT2JqZWN0LmtleXMoc2lkZXMpLmxlbmd0aFxuICBjb25zdCBvdGhlclNpZGVzID0gc2lkZSA9PiBPYmplY3Qua2V5cyhzaWRlcykuZmlsdGVyKGUgPT4gZSAhPT0gc2lkZSlcbiAgY29uc3Qgc3VtID0gKHByZXZpb3VzLCBjdXJyZW50KSA9PiBzaWRlc1twcmV2aW91c10gKyBzaWRlc1tjdXJyZW50XVxuICBjb25zdCBzaWRlSW5lcXVhbGl0eSA9IChib29sLCBrZXkpID0+IGJvb2wgJiYgc2lkZXNba2V5XSA8IG90aGVyU2lkZXMoa2V5KS5yZWR1Y2Uoc3VtKVxuICBjb25zdCB2YWxpZFNpZGVzID0gc2lkZUtleXMgPiAxICYmIE9iamVjdC5rZXlzKHNpZGVzKS5yZWR1Y2Uoc2lkZUluZXF1YWxpdHksIHRydWUpXG4gIGNvbnN0IHBhaXJzID0gWzAsIDEsIDJdLmZpbHRlcihlID0+IGFuZ2xlc1tlXSAmJiBzaWRlc1tlXSlcbiAgbGV0IHNvbHV0aW9uID0gbnVsbFxuXG4gIGlmIChzaWRlS2V5cyA9PT0gMyAmJiB2YWxpZFNpZGVzKSB7XG4gICAgc29sdXRpb24gPSBhbmdsZVJ1bGUoY29zaW5lUnVsZShjb3NpbmVSdWxlKHsgYW5nbGVzLCBzaWRlcyB9KSkpXG4gIH0gZWxzZSBpZiAoc2lkZUtleXMgPT09IDIgJiYgYW5nbGVLZXlzID09PSAxKSB7XG4gICAgY29uc3QgYW1iaWd1b3VzID0gYW1iaWd1b3VzQ2FzZVJ1bGUoeyBhbmdsZXMsIHNpZGVzIH0pXG4gICAgc29sdXRpb24gPSB7IGFuZ2xlcywgc2lkZXMgfVxuICAgIGlmIChwYWlycy5sZW5ndGggPCAxKSBzb2x1dGlvbiA9IGNvc2luZVJ1bGUoc29sdXRpb24pXG4gICAgc29sdXRpb24gPSBhbmdsZVJ1bGUoc2luZVJ1bGUoc29sdXRpb24pKVxuICAgIGlmIChwYWlycy5sZW5ndGggPj0gMSkgc29sdXRpb24gPSBzaW5lUnVsZShzb2x1dGlvbilcbiAgICBzb2x1dGlvbiA9IHsgLi4uc29sdXRpb24sIC4uLmFtYmlndW91cyB9XG4gIH0gZWxzZSBpZiAoc2lkZUtleXMgPT09IDEgJiYgYW5nbGVLZXlzID09PSAyKSB7XG4gICAgc29sdXRpb24gPSBzaW5lUnVsZShzaW5lUnVsZShhbmdsZVJ1bGUoeyBhbmdsZXMsIHNpZGVzIH0pKSlcbiAgfSBlbHNlIHtcbiAgICBzb2x1dGlvbiA9IHsgZXJyb3I6ICd0cmlnQ2FsY3VsYXRvciBleHBlY3RzIGEgdmFsaWQgcGFpciBvZiBhbmdsZXMgb3Igc2lkZXMnIH1cbiAgfVxuXG4gIHJldHVybiBzb2x1dGlvblxufVxuIl19