Source: css3d.vector3.js

/**
 * CSS 3D engine
 *
 * @category    css3d
 * @package     css3d.vector3
 * @author      Jan Fischer, bitWorking <info@bitworking.de>
 * @copyright   2014 Jan Fischer
 * @license     http://www.opensource.org/licenses/mit-license.html  MIT License
 */

/**
 * 
 * @name css3d.vector3
 * @class
 * @param {Number} x
 * @param {Number} y
 * @param {Number} z
 * @returns {css3d.vector3}
 */
css3d.vector3 = (function(css3d)
{
    /**
     * 
     * @param {Number} x
     * @param {Number} y
     * @param {Number} z
     * @returns {css3d.vector3}
     */
    var vector3 = function(x, y, z)
    {
        /**
         * x value
         * @type {Number}
         * @memberof! css3d.vector3
         * @instance
         */
        this.x = x || 0;
        /**
         * y value
         * @type {Number}
         * @memberof! css3d.vector3
         * @instance
         */ 
        this.y = y || 0;
        /**
         * z value
         * @type {Number}
         * @memberof! css3d.vector3
         * @instance
         */
        this.z = z || 0;
    };
    
    /**
     * 
     * @memberof! css3d.vector3
     * @instance
     * @param {Number} x
     * @param {Number} y
     * @param {Number} z
     * @returns {css3d.vector3}
     */
    vector3.prototype.set = function(x, y, z)
    {
	this.x = x || 0;
        this.y = y || 0;
        this.z = z || 0;
        return this;
    };

    /**
     * 
     * @memberof! css3d.vector3
     * @instance
     * @returns {Number}
     */
    vector3.prototype.magnitude = function()
    {
	return Math.sqrt((this.x*this.x)+(this.y*this.y)+(this.z*this.z));
    };

    /**
     * 
     * @memberof! css3d.vector3
     * @instance
     * @returns {css3d.vector3}
     */
    vector3.prototype.normalize = function()
    {
        var m = this.magnitude();
        if (m !== 0) {
            this.x /= m;
            this.y /= m;
            this.z /= m;
        }
        return this;
    };

    /**
     * 
     * @memberof! css3d.vector3
     * @instance
     * @param {css3d.vector3} b
     * @returns {Number}
     */
    vector3.prototype.dot = function(b)
    {
        return (this.x * b.x) + (this.y * b.y) + (this.z * b.z);
    };
    
    /**
     * 
     * @memberof! css3d.vector3
     * @instance
     * @param {css3d.vector3} a
     * @param {css3d.vector3} b
     * @returns {Number}
     */
    vector3.prototype.dot2 = function(a, b)
    {        
        return (a.x * b.x) + (a.y * b.y) + (a.z * b.z);        
    };

    /**
     * A vector which is perpendicular to both of the vectors
     * 
     * @memberof! css3d.vector3
     * @instance
     * @param {css3d.vector3} a
     * @param {css3d.vector3} b
     * @returns {css3d.vector3}
     */
    vector3.prototype.cross = function(a, b)
    {
        var c = new css3d.vector3(
            a.y*b.z - a.z*b.y,
            a.z*b.x - a.x*b.z,
            a.x*b.y - a.y*b.x
        );
        return c;
    };

    /**
     * 
     * @memberof! css3d.vector3
     * @instance
     * @param {css3d.vector3} b
     * @returns {css3d.vector3}
     */
    vector3.prototype.sub = function(b)
    {
        this.x -= b.x;
        this.y -= b.y;
        this.z -= b.z;
        return this;
    };
    
    /**
     * 
     * @memberof! css3d.vector3
     * @instance
     * @param {css3d.vector3} a
     * @param {css3d.vector3} b
     * @returns {css3d.vector3}
     */
    vector3.prototype.sub2 = function(a, b)
    {
        var c = new css3d.vector3(
            a.x - b.x,
            a.y - b.y,
            a.z - b.z
        );
        return c;
    };

    /**
     * 
     * @memberof! css3d.vector3
     * @instance
     * @param {Array} matrix4
     * @returns {css3d.vector4}
     */
    vector3.prototype.transform = function(matrix4)
    {
        return new css3d.vector4(
            this.x * matrix4[0] + this.y * matrix4[1] + this.z * matrix4[2] + matrix4[3],
            this.x * matrix4[4] + this.y * matrix4[5] + this.z * matrix4[6] + matrix4[7],
            this.x * matrix4[8] + this.y * matrix4[9] + this.z * matrix4[10] + matrix4[11],
            this.x * matrix4[12] + this.y * matrix4[13] + this.z * matrix4[14] + matrix4[15]
        );
    };

    /**
     * 
     * @memberof! css3d.vector3
     * @instance
     * @returns {css3d.vector3}
     */
    vector3.prototype.clone = function()
    {
        return new css3d.vector3(this.x, this.y, this.z);
    };

    /**
     * 
     * @memberof! css3d.vector3
     * @instance
     * @returns {String}
     */
    vector3.prototype.toString = function()
    {
        return this.x.toFixed(2)+','+this.y.toFixed(2)+','+this.z.toFixed(2);
    };

    /**
     * 
     * @memberof! css3d.vector3
     * @instance
     * @returns {Boolean}
     */
    vector3.prototype.isZero = function()
    {
        return (this.x == 0 && this.y == 0 && this.z == 0);
    };
    
    vector3.prototype.distance = function(a, b)
    {
        return Math.sqrt(Math.pow(a.x - b.x, 2) + Math.pow(a.y - b.y, 2) + Math.pow(a.z - b.z, 2));
    };

    return vector3;

}(css3d));