UNPKG

inverse-kinematics

Version:

Inverse kinematics for 2D and 3D applications

100 lines (99 loc) 4.5 kB
var __spreadArray = (this && this.__spreadArray) || function (to, from) { for (var i = 0, il = from.length, j = to.length; i < il; i++, j++) to[j] = from[i]; return to; }; import * as MathUtils from './MathUtils'; var VECTOR_LENGTH = 2; export var combine = function (a, b, operation) { var result = new Array(VECTOR_LENGTH); for (var index = 0; index < VECTOR_LENGTH; index++) { var aElement = a[index]; var bElement = b[index]; result[index] = operation(aElement, bElement); } return fromArray(result); }; export var angle = function (_a) { var x = _a[0], y = _a[1]; return Math.atan2(y, x); }; export var add = function (a, b) { return combine(a, b, function (a, b) { return a + b; }); }; export var map = function (vector, callback) { return vector.map(function (value, index, array) { return callback(value, index, array); }); }; export var maxAbs = function (vector, max) { var isClipped = max * max < sqrEuclideanLength(vector); if (!isClipped) return __spreadArray([], vector); var normalised = normalise(vector); var maxVector = scale(normalised, max); return maxVector; }; export var maxElement = function (a) { return Math.max.apply(Math, a); }; export var abs = function (a) { return [Math.abs(a[0]), Math.abs(a[1])]; }; export var subtract = function (base, subtraction) { return combine(base, subtraction, function (a, b) { return a - b; }); }; export var multiply = function (base, multiplier) { return combine(base, multiplier, function (a, b) { return a * b; }); }; export var dot = function (a, b) { return a[0] * b[0] + a[1] * b[1]; }; export var lerp = function (from, to, amount) { return combine(from, to, function (fromElement, toElement) { return MathUtils.lerp(fromElement, toElement, amount); }); }; export var clamp = function (value, min, max) { return [ MathUtils.clamp(value[0], min[0], max[0]), MathUtils.clamp(value[1], min[1], max[1]), ]; }; export var tangent = function (vector) { return [-vector[1], vector[0]]; }; export var scale = function (base, factor) { return fromArray(base.map(function (element) { return element * factor; })); }; export var divideScalar = function (base, divisor) { return fromArray(base.map(function (element) { return element / divisor; })); }; export var divide = function (base, divisor) { return combine(base, divisor, function (a, b) { return a / b; }); }; export var normalise = function (vector) { var length = euclideanLength(vector); if (length === 0) { return zero(); } return scale(vector, 1 / length); }; export var sqrEuclideanLength = function (vector) { return Math.pow(vector[0], 2) + Math.pow(vector[1], 2); }; export var euclideanLength = function (vector) { return Math.pow(sqrEuclideanLength(vector), 0.5); }; export var sqrEuclideanDistance = function (a, b) { var distance = subtract(a, b); return sqrEuclideanLength(distance); }; export var euclideanDistance = function (a, b) { var distance = subtract(a, b); return euclideanLength(distance); }; export var rotate = function (_a, angleRadians) { var x = _a[0], y = _a[1]; var cos = Math.cos(angleRadians); var sin = Math.sin(angleRadians); return [x * cos - y * sin, x * sin + y * cos]; }; export var zero = function () { return [0, 0]; }; export var flipX = function (vector) { return [-vector[0], vector[1]]; }; export var flipY = function (vector) { return [vector[0], -vector[1]]; }; export var flipAxes = function (vector) { return [-vector[0], -vector[1]]; }; export var pickX = function (vector) { return [vector[0], 0]; }; export var pickY = function (vector) { return [0, vector[1]]; }; export var fromArray = function (array) { if (array.length !== VECTOR_LENGTH) throw new Error("Cannot create V2 from " + array + ", length is " + array.length + ". Length should be " + VECTOR_LENGTH); return array; }; export var valueEquality = function (a, b) { return a[0] === b[0] && a[1] === b[1]; }; export var fromVector2 = function (_a) { var x = _a.x, y = _a.y; return [x, y]; }; export var average = function () { var vectors = []; for (var _i = 0; _i < arguments.length; _i++) { vectors[_i] = arguments[_i]; } var sum = [0, 0]; vectors.forEach(function (vector) { sum = add(sum, vector); }); return divideScalar(sum, vectors.length); }; export var fromPolar = function (radius, angle) { return rotate([radius, 0], angle); };