function vec2(a,b){ this.a = a this.b = b } vec2.prototype.magnitude = function(){ return this.b-this.a } vec2.prototype.length = function(){ return abs(this.b-this.a) } vec2.prototype.dist = function(){ return dist(0,this.a,0,this.b) } vec2.prototype.clone = function(){ return new vec2(this.a, this.b) } vec2.prototype.abs = function(){ if (this.b < this.a) { this.invert() } return this } vec2.prototype.invert = function(){ this.a = this.a ^ this.b this.b = this.a ^ this.b this.a = this.a ^ this.b return this } vec2.prototype.midpoint = function(){ return lerp(0.5, this.a, this.b) } vec2.prototype.eq = function(v){ return this.a == v.a && this.b == v.b } vec2.prototype.add = function(n){ this.a += n this.b += n return this } vec2.prototype.sub = function(n){ this.a -= n this.b -= n return this } vec2.prototype.mul = function(n){ this.a *= n this.b *= n return this } vec2.prototype.div = function(n){ this.a /= n this.b /= n return this } vec2.prototype.setPosition = function(n){ var len = this.length() this.a = n this.b = n + len } vec2.prototype.setLength = function(n){ this.b = this.a + n } vec2.prototype.normalize = function(){ var dim = max(this.a, this.b) this.a = this.a/dim this.b = this.b/dim return this } vec2.prototype.contains = function(n){ return this.a <= n && n <= this.b } vec2.prototype.containsDisc = function(n,r){ return this.a <= n-r && n+r <= this.b } vec2.prototype.clamp = function(n){ return clamp(n, this.a, this.b) } vec2.prototype.clampDisc = function(n,r){ return clamp(n, this.a+r, this.b-r) } vec2.prototype.intersects = function(v){ if (this.a < v.a) { return (v.a < this.b && this.b <= v.b) || (this.a < v.b && v.b <= this.b) } else if (this.a == v.a) { return true } else if (this.a > v.a) { return (this.a < v.b && v.b <= this.b) || (v.a < this.b && this.b <= v.b) } } vec2.prototype.union = function(v){ if (this.intersects(v)) { return new vec2( min(this.a,v.a), max(this.b, v.b) ) } } vec2.prototype.intersection = function(v){ if (this.intersects(v)) { return new vec2( max(this.a,v.a), min(this.b, v.b) ) } } vec2.prototype.toString = function(){ return "[" + ~~this.a + " " + ~~this.b + "]" } vec2.prototype.serialize = function(){ return [ ~~this.a, ~~this.b ] } vec2.prototype.quantize = function(n){ n = n || 10 this.a = quantize(this.a, n) this.b = quantize(this.b, n) }