Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
'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]))
    ];
  }
};
New to GrepCode? Check out our FAQ X