SimpleSim Vector
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(function(exports) { | |
/** | |
* Creates a new Vector. | |
* | |
* @param {number} [opt_x = 0] The x location. | |
* @param {number} [opt_y = 0] The y location. | |
* @constructor | |
*/ | |
function Vector(opt_x, opt_y) { | |
var x = opt_x || 0, | |
y = opt_y || 0; | |
this.x = x; | |
this.y = y; | |
} | |
/** | |
* Adds a vector to this vector. | |
* | |
* @param {Object} vector The vector to add. | |
* @returns {Object} This vector. | |
*/ | |
Vector.prototype.add = function(vector) { | |
this.x += vector.x; | |
this.y += vector.y; | |
return this; | |
}; | |
/** | |
* Subtracts a vector from this vector. | |
* | |
* @param {Object} vector The vector to subtract. | |
* @returns {Object} This vector. | |
*/ | |
Vector.prototype.sub = function(vector) { | |
this.x -= vector.x; | |
this.y -= vector.y; | |
return this; | |
}; | |
/** | |
* Multiplies this vector by a passed value. | |
* | |
* @param {number} n Vector will be multiplied by this number. | |
* @returns {Object} This vector. | |
*/ | |
Vector.prototype.mult = function(n) { | |
this.x *= n; | |
this.y *= n; | |
return this; | |
}; | |
/** | |
* Divides this vector by a passed value. | |
* | |
* @param {number} n Vector will be divided by this number. | |
* @returns {Object} This vector. | |
*/ | |
Vector.prototype.div = function(n) { | |
this.x = this.x / n; | |
this.y = this.y / n; | |
return this; | |
}; | |
/** | |
* Calculates the magnitude of this vector. | |
* | |
* @returns {number} The vector's magnitude. | |
*/ | |
Vector.prototype.mag = function() { | |
return Math.sqrt((this.x * this.x) + (this.y * this.y)); | |
}; | |
/** | |
* Limits the vector's magnitude. | |
* | |
* @param {number} opt_high The upper bound of the vector's magnitude | |
* @param {number} opt_low The lower bound of the vector's magnitude. | |
* @returns {Object} This vector. | |
*/ | |
Vector.prototype.limit = function(opt_high, opt_low) { | |
var high = opt_high || null, | |
low = opt_low || null; | |
if (high && this.mag() > high) { | |
this.normalize(); | |
this.mult(high); | |
} | |
if (low && this.mag() < low) { | |
this.normalize(); | |
this.mult(low); | |
} | |
return this; | |
}; | |
/** | |
* Divides a vector by its magnitude to reduce its magnitude to 1. | |
* Typically used to retrieve the direction of the vector for later manipulation. | |
* | |
* @returns {Object} This vector. | |
*/ | |
Vector.prototype.normalize = function() { | |
var m = this.mag(); | |
if (m !== 0) { | |
return this.div(m); | |
} | |
}; | |
/** | |
* Rotates a vector using a passed angle in radians. | |
* | |
* @param {number} radians The angle to rotate in radians. | |
* @returns {Object} This vector. | |
*/ | |
Vector.prototype.rotate = function(radians) { | |
var cos = Math.cos(radians), | |
sin = Math.sin(radians), | |
x = this.x, | |
y = this.y; | |
this.x = x * cos - y * sin; | |
this.y = x * sin + y * cos; | |
return this; | |
}; | |
exports.Vector = Vector; | |
}(exports)); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment