'use strict'; module.exports = function(math) { var array = require('../../util/array'); var Matrix = math.type.Matrix; /** * Calculate the cross product for two vectors in three dimensional space. * The cross product of `A = [a1, a2, a3]` and `B =[b1, b2, b3]` is defined * as: * * cross(A, B) = [ * a2 * b3 - a3 * b2, * a3 * b1 - a1 * b3, * a1 * b2 - a2 * b1 * ] * * Syntax: * * math.cross(x, y) * * Examples: * * math.cross([1, 1, 0], [0, 1, 1]); // Returns [1, -1, 1] * math.cross([3, -3, 1], [4, 9, 2]); // Returns [-15, -2, 39] * math.cross([2, 3, 4], [5, 6, 7]); // Returns [-3, 6, -3] * * See also: * * dot, multiply * * @param {Array | Matrix} x First vector * @param {Array | Matrix} y Second vector * @return {Array | Matrix} Returns the cross product of `x` and `y` */ math.cross = function cross(x, y) { if (x instanceof Matrix) { if (y instanceof Matrix) { return math.matrix(_cross(x.toArray(), y.toArray())); } else if (Array.isArray(y)) { return math.matrix(_cross(x.toArray(), y)); } } else if (Array.isArray(x)) { if (y instanceof Matrix) { return math.matrix(_cross(x, y.toArray())); } else if (Array.isArray(y)) { return _cross(x, y); } } throw new math.error.UnsupportedTypeError('cross', math['typeof'](x), math['typeof'](y)); }; /** * Calculate the cross product for two arrays * @param {Array} x First vector * @param {Array} y Second vector * @returns {Array} Returns the cross product of x and y * @private */ function _cross(x, y) { var xSize= array.size(x); var ySize = array.size(y); if (xSize.length != 1 || ySize.length != 1 || xSize[0] != 3 || ySize[0] != 3) { throw new RangeError('Vectors with length 3 expected ' + '(Size A = [' + xSize.join(', ') + '], B = [' + ySize.join(', ') + '])'); } return [ math.subtract(math.multiply(x[1], y[2]), math.multiply(x[2], y[1])), math.subtract(math.multiply(x[2], y[0]), math.multiply(x[0], y[2])), math.subtract(math.multiply(x[0], y[1]), math.multiply(x[1], y[0])) ]; } };