Files
Bubberstation/tgui/packages/common/vector.ts

52 lines
1.3 KiB
TypeScript

/**
* N-dimensional vector manipulation functions.
*
* Vectors are plain number arrays, i.e. [x, y, z].
*
* @file
* @copyright 2020 Aleksej Komarov
* @license MIT
*/
import { map, reduce, zip } from './collections';
const ADD = (a: number, b: number): number => a + b;
const SUB = (a: number, b: number): number => a - b;
const MUL = (a: number, b: number): number => a * b;
const DIV = (a: number, b: number): number => a / b;
export type Vector = number[];
export const vecAdd = (...vecs: Vector[]): Vector => {
return map(zip(...vecs), (x) => reduce(x, ADD));
};
export const vecSubtract = (...vecs: Vector[]): Vector => {
return map(zip(...vecs), (x) => reduce(x, SUB));
};
export const vecMultiply = (...vecs: Vector[]): Vector => {
return map(zip(...vecs), (x) => reduce(x, MUL));
};
export const vecDivide = (...vecs: Vector[]): Vector => {
return map(zip(...vecs), (x) => reduce(x, DIV));
};
export const vecScale = (vec: Vector, n: number): Vector => {
return map(vec, (x) => x * n);
};
export const vecInverse = (vec: Vector): Vector => {
return map(vec, (x) => -x);
};
export const vecLength = (vec: Vector): number => {
return Math.sqrt(reduce(vecMultiply(vec, vec), ADD));
};
export const vecNormalize = (vec: Vector): Vector => {
const length = vecLength(vec);
return map(vec, (c) => c / length);
};