trigonometry-calculator
Version:
Completely solve trigonometry equations for angles and sides
63 lines (55 loc) • 7.71 kB
JavaScript
;
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