inverse-kinematics
Version:
Inverse kinematics for 2D and 3D applications
100 lines (99 loc) • 4.5 kB
JavaScript
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); };