mirror of
https://github.com/SPLURT-Station/S.P.L.U.R.T-Station-13.git
synced 2025-12-10 09:54:52 +00:00
49 lines
1.0 KiB
JavaScript
49 lines
1.0 KiB
JavaScript
/**
|
|
* 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, zipWith } from './collections';
|
|
|
|
const ADD = (a, b) => a + b;
|
|
const SUB = (a, b) => a - b;
|
|
const MUL = (a, b) => a * b;
|
|
const DIV = (a, b) => a / b;
|
|
|
|
export const vecAdd = (...vecs) => {
|
|
return reduce((a, b) => zipWith(ADD)(a, b))(vecs);
|
|
};
|
|
|
|
export const vecSubtract = (...vecs) => {
|
|
return reduce((a, b) => zipWith(SUB)(a, b))(vecs);
|
|
};
|
|
|
|
export const vecMultiply = (...vecs) => {
|
|
return reduce((a, b) => zipWith(MUL)(a, b))(vecs);
|
|
};
|
|
|
|
export const vecDivide = (...vecs) => {
|
|
return reduce((a, b) => zipWith(DIV)(a, b))(vecs);
|
|
};
|
|
|
|
export const vecScale = (vec, n) => {
|
|
return map(x => x * n)(vec);
|
|
};
|
|
|
|
export const vecInverse = vec => {
|
|
return map(x => -x)(vec);
|
|
};
|
|
|
|
export const vecLength = vec => {
|
|
return Math.sqrt(reduce(ADD)(zipWith(MUL)(vec, vec)));
|
|
};
|
|
|
|
export const vecNormalize = vec => {
|
|
return vecDivide(vec, vecLength(vec));
|
|
};
|