Object.prototype.addProperty = function ( name, getter, setter) { this.__defineGetter__(name,getter) if (setter) { this.__defineSetter__(name,setter) } } Object.prototype.isPropertyEnumerable = function (name) { return this.propertyIsEnumerable(name); } Object.defineProperty( Object.prototype, "addProperty", {enumerable: false}); Object.defineProperty( Object.prototype, "isPropertyEnumerable", {enumerable: false}); function Point (x, y) { this.x = x this.y = y this.getlength = function () { return Math.sqrt(this.x*this.x + this.y*this.y) } this.addProperty('length',this.getlength) this.add = function (v) { return Point (this.x+v.x, this.y+v.y) } this.clone = function () { return Point (this.x, this.y) } this.equals = function (toCompare) { return (this.x==toCompare.x && this.y==toCompare.y) } this.normalize = function (length) { x = this.x/((this.length*1.0))*length y = this.y/((this.length*1.0))*length this.x = x this.y = y } this.offset = function (dx, dy) { this.x += dx this.y += dy } this.subtract = function (v) { return Point(this.x-v.x, this.y-v.y) } this.toString = function () { return "(x="+this.x+", y="+this.y+")" } } Point.distance = function (pt1, pt2) { return Math.sqrt((pt2.x-pt1.x)*(pt2.x-pt1.x) + (pt2.y-pt1.y)*(pt2.y-pt1.y)) } Point.interpolate = function (pt1, pt2, f) { return Point(ave (pt1.x, pt2.x, f), ave (pt1.y, pt2.y, f) ) } Point.polar = function (len, angle) { return Point(len*Math.cos(angle), len*Math.sin(angle)) } function Rectangle (x, y, width, height) { this.x = x this.y = y this.width = width this.height = height this.getbottom = function () { return this.y+this.height; } this.getbottomRight = function () { return Point(this.x + this.width, this.y + this.height) } this.getsize = function () { return Point(this.width, this.height) } this.getleft = function () { return this.x } this.getright = function () { return this.x + this.width } this.gettop = function () { return this.y } this.gettopLeft = function () { return Point(this.x, this.y) } this.addProperty('bottom',this.getbottom); this.addProperty('bottomRight',this.getbottomRight); this.addProperty('size',this.getsize); this.addProperty('left',this.getleft); this.addProperty('right',this.getright); this.addProperty('top',this.gettop); this.addProperty('topLeft',this.gettopLeft); this.clone = function () { return Rectangle(this.x, this.y, this.width, this.height); } this.contains = function (x, y) { return ((x>this.x && x(this.y && ythis.x && pt.xthis.y && pt.ythis.x && rect.rightthis.y && rect.bottomx && bottom>y) { return Rectangle(x, y, right-x, bottom-y) } else { return Rectangle (0, 0, 0, 0) } } this.intersects = function (toIntersect) { x = Math.max(this.x, toIntersect.x); y = Math.max(this.y, toIntersect.y); right = Math.min(this.right, toIntersect.right) bottom = Math.min(this.bottom, toIntersect.bottom) if (right>x && bottom>y) { return true } else { return false } } this.isEmpty = function () { if (this.width<=0) { return true } else if (this.height<=0) { return true } else { return false } } this.offset = function (dx, dy) { this.x += dx; this.y += dy; } this.offsetPoint = function (pt) { this.x += pt.x; this.y += pt.y; } this.setEmpty = function () { this.x = 0; this.y = 0; this.width = 0; this.height = 0; } this.toString = function () { return "(x="+this.x+", y="+this.y+", w="+this.width+", h="+this.height+")" } this.union = function (toUnion) { x = Math.min(this.x, toUnion.x); y = Math.min(this.y, toUnion.y); right = Math.max(this.right, toUnion.right) bottom = Math.max(this.bottom, toUnion.bottom) return Rectangle(x, y, right-x, bottom-y) } } function radianToDegree(angle) { return angle * (180.0 / Math.PI); } function degreeToRadian(angle) { return Math.PI * angle / 180.0; } function Matrix(a, b, c, d, tx, ty) { this.elements = [a||1, c||0, tx||0, b||0, d||1, ty||0]; this.__defineGetter__("a", function() { return this.elements[0]; }); this.__defineSetter__("a", function(n) { this.elements[0]=n; }); this.__defineGetter__("b", function() { return this.elements[3]; }); this.__defineSetter__("b", function(n) { this.elements[3]=n; }); this.__defineGetter__("c", function() { return this.elements[1]; }); this.__defineSetter__("c", function(n) { this.elements[1]=n; }); this.__defineGetter__("d", function() { return this.elements[4]; }); this.__defineSetter__("d", function(n) { this.elements[4]=n; }); this.__defineGetter__("tx", function() { return this.elements[2]; }); this.__defineSetter__("tx", function(n) { this.elements[2]=n; }); this.__defineGetter__("ty", function() { return this.elements[5]; }); this.__defineSetter__("ty", function(n) { this.elements[5]=n; }); this.clone = function() { }; this.concat = function(m) { }; this.identity = function() { this.elements = [1, 0, 0, 1, 0, 0]; }; this.scale = function(sx, sy) { if (sx && !sy) { sy = sx; } if (sx && sy) { this.elements[0] *= sx; this.elements[1] *= sy; this.elements[3] *= sx; this.elements[4] *= sy; } }; this.translate = function(dx, dy) { this.elements[2] = dx * this.elements[0] + dy * this.elements[1] + this.elements[2]; this.elements[5] = dx * this.elements[3] + dy * this.elements[4] + this.elements[5]; }; this.angle = 0; // faster but dumber method this.rotate = function(angle) { this.angle += angle; r = radianToDegree(angle); c = Math.cos(angle); s = Math.sin(angle); temp1 = this.elements[0]; temp2 = this.elements[1]; this.elements[0] = c * temp1 + s * temp2; this.elements[1] = -s * temp1 + c * temp2; temp1 = this.elements[3]; temp2 = this.elements[4]; this.elements[3] = c * temp1 + s * temp2; this.elements[4] = -s * temp1 + c * temp2; }; } function ColorTransform(redMultiplier, greenMultiplier, blueMultiplier, alphaMultiplier, redOffset, greenOffset, blueOffset, alphaOffset) { this.redMultiplier=redMultiplier==undefined?1:redMultiplier; this.greenMultiplier=greenMultiplier==undefined?1:greenMultiplier; this.blueMultiplier=blueMultiplier==undefined?1:blueMultiplier; this.alphaMultiplier=alphaMultiplier==undefined?1:alphaMultiplier; this.redOffset=redOffset || 0; this.greenOffset=greenOffset || 0; this.blueOffset=blueOffset || 0; this.alphaOffset=alphaOffset || 0; this.concat = function (second) { this.redMultiplier=this.redMultiplier*second.redMultiplier; this.greenMultiplier=this.greenMultiplier*second.greenMultiplier; this.blueMultiplier=this.blueMultiplier*second.blueMultiplier; this.alphaMultiplier=this.alphaMultiplier*second.alphaMultiplier; this.redOffset=this.redOffset+second.redOffset; this.greenOffset=this.redOffset+second.greenOffset; this.blueOffset=this.redOffset+second.blueOffset; this.alphaOffset=this.redOffset+second.alphaOffset; } this.toString = function () { return "(redMultiplier="+this.redMultiplier+", greenMultiplier="+this.greenMultiplier+ ", blueMultiplier="+this.blueMultiplier+", alphaMultiplier="+this.alphaMultiplier+ ", redOffset="+this.redOffset+", greenOffset="+this.greenOffset+ ", blueOffset="+this.blueOffset+", alphaOffset="+this.alphaOffset+")" } }