@design-automation/mobius-inline-funcs
Version:
Mobius Spatial Information Model
49 lines • 3.56 kB
JavaScript
import * as vectors from '../../libs/vectors';
import { getArrDepth } from '../../libs/arrs';
// ================================================================================================
/**
* Calculate the angle (0 to PI) between two vectors.
* \n
* The inner (smaller) angle is always returned, which will always be smaller than or equal to PI.
* \n
* Overloaded with 4 cases.
* \n
* - v1 can be one vector, and v2 can be one vector.
* - v1 can be a list of vectors, and v2 can be one vector.
* - v1 can be one vector, and v2 can be a list of vectors.
* - v1 can be a list of vectors, and v2 can be a list of vectors. These lists should have the **same size**.
* @param v1 The first vector or list of vectors.
* @param v2 The second vector or list of vectors.
* @returns An angle in radians.
*/
export function vecAng(v1, v2) {
// overloaded case
const depth1 = getArrDepth(v1);
const depth2 = getArrDepth(v2);
if (depth1 === 2 || depth2 === 2) {
if (depth2 === 1) {
// only v1 is Txyz[]
return v1.map(v1_val => vectors.vecAng(v1_val, v2));
}
else if (depth1 === 1) {
// only v2 is Txyz[]
return v2.map(v2_val => vectors.vecAng(v1, v2_val));
}
else {
// both v1 and v2 are Txyz[], they must be equal length
if (v1.length === v2.length) {
const angs = [];
for (let i = 0; i < v1.length; i++) {
angs.push(vectors.vecAng(v1[i], v2[i]));
}
return angs;
}
else {
throw new Error('Error calculating angle between two lists of vectors: The two lists must be of equal length.');
}
}
}
// normal case, both v1 and v2 are Txyz
return vectors.vecAng(v1, v2);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVjQW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2lubGluZS92ZWMvdmVjQW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sb0JBQW9CLENBQUM7QUFFOUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTlDLG1HQUFtRztBQUNuRzs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNGLE1BQU0sVUFBVSxNQUFNLENBQUMsRUFBZSxFQUFFLEVBQWU7SUFDcEQsa0JBQWtCO0lBQ2xCLE1BQU0sTUFBTSxHQUFXLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN2QyxNQUFNLE1BQU0sR0FBVyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDdkMsSUFBSSxNQUFNLEtBQUssQ0FBQyxJQUFJLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDOUIsSUFBSSxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ2Qsb0JBQW9CO1lBQ3BCLE9BQVEsRUFBYSxDQUFDLEdBQUcsQ0FBRSxNQUFNLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBYyxFQUFFLEVBQVUsQ0FBVyxDQUFDLENBQUM7U0FDOUY7YUFBTSxJQUFJLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDckIsb0JBQW9CO1lBQ3BCLE9BQVEsRUFBYSxDQUFDLEdBQUcsQ0FBRSxNQUFNLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBVSxFQUFFLE1BQWMsQ0FBVyxDQUFDLENBQUM7U0FDOUY7YUFBTTtZQUNILHVEQUF1RDtZQUN2RCxJQUFJLEVBQUUsQ0FBQyxNQUFNLEtBQUssRUFBRSxDQUFDLE1BQU0sRUFBRTtnQkFDekIsTUFBTSxJQUFJLEdBQWEsRUFBRSxDQUFDO2dCQUMxQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtvQkFDaEMsSUFBSSxDQUFDLElBQUksQ0FBRSxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFTLENBQVcsQ0FBRSxDQUFDO2lCQUN2RTtnQkFDRCxPQUFPLElBQUksQ0FBQzthQUNmO2lCQUFNO2dCQUNILE1BQU0sSUFBSSxLQUFLLENBQ1gsOEZBQThGLENBQUMsQ0FBQzthQUN2RztTQUNKO0tBQ0o7SUFDRCx1Q0FBdUM7SUFDdkMsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQVUsRUFBRSxFQUFVLENBQVcsQ0FBQztBQUM1RCxDQUFDIn0=