// A utility library for vector (coordinate) operations. exports.mult = function(vec, scal){ for (let i = 0; i < vec.length; i++) vec[i] = scal*vec[i]; return vec; } exports.elem = function(orig, vec, op){ if (orig.length > vec.length) throw "Vector length mismatch"; if (orig.length && isNaN(orig[0])) throw "orig vec has a NaN"; if (vec.length && isNaN(vec[0])) throw "new vec has a NaN"; let comb = []; for (let i = 0; i < orig.length; i++){ comb.push(op(vec[i],orig[i])); } return comb; } exports.equals = function(orig, vec){ for (let i = 0; i < orig.length; i++){ if (orig[i] != vec[i]) return false; } return true; } exports.add = function(orig, vec){ return exports.elem(orig, vec, (a,b) => a+b); } exports.sub = function(orig, vec){ return exports.elem(orig, vec, (a,b) => a-b); } exports.dot = function(orig,vec){ return exports.elem(orig, vec, (a,b) => a*b); } exports.tileToChar = function(orig){ return exports.dot(orig, [8,16]); } exports.charToTile = function(orig){ return exports.dot(orig, [1/8, 1/16]).map(a => Math.floor(a)); } exports.norm = function(orig){ let sum = orig.reduce( (acc, cur) => acc+cur ); return exports.dot(orig, 1/sum); }