112 lines
1.6 KiB
JavaScript
112 lines
1.6 KiB
JavaScript
|
(function(global){ 'use strict';
|
||
|
|
||
|
var Vector = function(x, y){
|
||
|
this.x = x || 0;
|
||
|
this.y = y || 0;
|
||
|
};
|
||
|
|
||
|
Vector.prototype = {
|
||
|
|
||
|
clone: function(){
|
||
|
return new Vector(this.x, this.y);
|
||
|
},
|
||
|
|
||
|
add: function(vec){
|
||
|
this.x += vec.x;
|
||
|
this.y += vec.y;
|
||
|
return this;
|
||
|
},
|
||
|
|
||
|
sub: function(vec){
|
||
|
this.x -= vec.x;
|
||
|
this.y -= vec.y;
|
||
|
return this;
|
||
|
},
|
||
|
|
||
|
subVal: function(val){
|
||
|
this.x -= val;
|
||
|
this.y -= val;
|
||
|
return this;
|
||
|
},
|
||
|
|
||
|
mult: function(mul){
|
||
|
this.x *= mul;
|
||
|
this.y *= mul;
|
||
|
return this;
|
||
|
},
|
||
|
|
||
|
div: function(div){
|
||
|
if (div === 0) {
|
||
|
return this;
|
||
|
}
|
||
|
this.x /= div;
|
||
|
this.y /= div;
|
||
|
return this;
|
||
|
},
|
||
|
|
||
|
mag: function(){
|
||
|
return Math.sqrt(
|
||
|
this.x * this.x +
|
||
|
this.y * this.y
|
||
|
);
|
||
|
},
|
||
|
|
||
|
limit: function(max){
|
||
|
if (this.mag() > max) {
|
||
|
this.normalize();
|
||
|
this.mult(max);
|
||
|
}
|
||
|
return this;
|
||
|
},
|
||
|
|
||
|
normalize: function(){
|
||
|
var mag = this.mag();
|
||
|
if (mag === 0) {
|
||
|
return this;
|
||
|
}
|
||
|
this.div(mag);
|
||
|
return this;
|
||
|
},
|
||
|
|
||
|
heading: function(){
|
||
|
return Math.atan2(this.y, this.x);
|
||
|
},
|
||
|
|
||
|
set: function(vec){
|
||
|
this.x = vec.x;
|
||
|
this.y = vec.y;
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
};
|
||
|
|
||
|
Vector.add = function(vec1, vec2){
|
||
|
return vec1.clone().add(vec2.clone());
|
||
|
};
|
||
|
|
||
|
Vector.sub = function(vec1, vec2){
|
||
|
return vec1.clone().sub(vec2.clone());
|
||
|
};
|
||
|
|
||
|
Vector.mult = function(vec, mult){
|
||
|
return vec.clone().mult(mult);
|
||
|
};
|
||
|
|
||
|
Vector.div = function(vec, div){
|
||
|
return vec.clone().div(div);
|
||
|
};
|
||
|
|
||
|
// Ripped from processing
|
||
|
Vector.random2D = function(){
|
||
|
var angle = Math.random(0, 1) * Math.PI * 2;
|
||
|
return new Vector(Math.cos(angle), Math.sin(angle));
|
||
|
};
|
||
|
|
||
|
Vector.coerce = function(obj){
|
||
|
return new Vector(obj.x, obj.y);
|
||
|
};
|
||
|
|
||
|
global.Vector = Vector;
|
||
|
|
||
|
})(this);
|