goog.provide("goog.math.Rect"); goog.require("goog.asserts"); goog.require("goog.math.Box"); goog.require("goog.math.Coordinate"); goog.require("goog.math.IRect"); goog.require("goog.math.Size"); goog.math.Rect = function(x, y, w, h) { this.left = x; this.top = y; this.width = w; this.height = h; }; goog.math.Rect.prototype.clone = function() { return new goog.math.Rect(this.left, this.top, this.width, this.height); }; goog.math.Rect.prototype.toBox = function() { var right = this.left + this.width; var bottom = this.top + this.height; return new goog.math.Box(this.top, right, bottom, this.left); }; goog.math.Rect.createFromPositionAndSize = function(position, size) { return new goog.math.Rect(position.x, position.y, size.width, size.height); }; goog.math.Rect.createFromBox = function(box) { return new goog.math.Rect(box.left, box.top, box.right - box.left, box.bottom - box.top); }; if (goog.DEBUG) { goog.math.Rect.prototype.toString = function() { return "(" + this.left + ", " + this.top + " - " + this.width + "w x " + this.height + "h)"; }; } goog.math.Rect.equals = function(a, b) { if (a == b) { return true; } if (!a || !b) { return false; } return a.left == b.left && a.width == b.width && a.top == b.top && a.height == b.height; }; goog.math.Rect.prototype.intersection = function(rect) { var x0 = Math.max(this.left, rect.left); var x1 = Math.min(this.left + this.width, rect.left + rect.width); if (x0 <= x1) { var y0 = Math.max(this.top, rect.top); var y1 = Math.min(this.top + this.height, rect.top + rect.height); if (y0 <= y1) { this.left = x0; this.top = y0; this.width = x1 - x0; this.height = y1 - y0; return true; } } return false; }; goog.math.Rect.intersection = function(a, b) { var x0 = Math.max(a.left, b.left); var x1 = Math.min(a.left + a.width, b.left + b.width); if (x0 <= x1) { var y0 = Math.max(a.top, b.top); var y1 = Math.min(a.top + a.height, b.top + b.height); if (y0 <= y1) { return new goog.math.Rect(x0, y0, x1 - x0, y1 - y0); } } return null; }; goog.math.Rect.intersects = function(a, b) { return a.left <= b.left + b.width && b.left <= a.left + a.width && a.top <= b.top + b.height && b.top <= a.top + a.height; }; goog.math.Rect.prototype.intersects = function(rect) { return goog.math.Rect.intersects(this, rect); }; goog.math.Rect.difference = function(a, b) { var intersection = goog.math.Rect.intersection(a, b); if (!intersection || !intersection.height || !intersection.width) { return [a.clone()]; } var result = []; var top = a.top; var height = a.height; var ar = a.left + a.width; var ab = a.top + a.height; var br = b.left + b.width; var bb = b.top + b.height; if (b.top > a.top) { result.push(new goog.math.Rect(a.left, a.top, a.width, b.top - a.top)); top = b.top; height -= b.top - a.top; } if (bb < ab) { result.push(new goog.math.Rect(a.left, bb, a.width, ab - bb)); height = bb - top; } if (b.left > a.left) { result.push(new goog.math.Rect(a.left, top, b.left - a.left, height)); } if (br < ar) { result.push(new goog.math.Rect(br, top, ar - br, height)); } return result; }; goog.math.Rect.prototype.difference = function(rect) { return goog.math.Rect.difference(this, rect); }; goog.math.Rect.prototype.boundingRect = function(rect) { var right = Math.max(this.left + this.width, rect.left + rect.width); var bottom = Math.max(this.top + this.height, rect.top + rect.height); this.left = Math.min(this.left, rect.left); this.top = Math.min(this.top, rect.top); this.width = right - this.left; this.height = bottom - this.top; }; goog.math.Rect.boundingRect = function(a, b) { if (!a || !b) { return null; } var newRect = new goog.math.Rect(a.left, a.top, a.width, a.height); newRect.boundingRect(b); return newRect; }; goog.math.Rect.prototype.contains = function(another) { if (another instanceof goog.math.Coordinate) { return another.x >= this.left && another.x <= this.left + this.width && another.y >= this.top && another.y <= this.top + this.height; } else { return this.left <= another.left && this.left + this.width >= another.left + another.width && this.top <= another.top && this.top + this.height >= another.top + another.height; } }; goog.math.Rect.prototype.squaredDistance = function(point) { var dx = point.x < this.left ? this.left - point.x : Math.max(point.x - (this.left + this.width), 0); var dy = point.y < this.top ? this.top - point.y : Math.max(point.y - (this.top + this.height), 0); return dx * dx + dy * dy; }; goog.math.Rect.prototype.distance = function(point) { return Math.sqrt(this.squaredDistance(point)); }; goog.math.Rect.prototype.getSize = function() { return new goog.math.Size(this.width, this.height); }; goog.math.Rect.prototype.getTopLeft = function() { return new goog.math.Coordinate(this.left, this.top); }; goog.math.Rect.prototype.getCenter = function() { return new goog.math.Coordinate(this.left + this.width / 2, this.top + this.height / 2); }; goog.math.Rect.prototype.getBottomRight = function() { return new goog.math.Coordinate(this.left + this.width, this.top + this.height); }; goog.math.Rect.prototype.ceil = function() { this.left = Math.ceil(this.left); this.top = Math.ceil(this.top); this.width = Math.ceil(this.width); this.height = Math.ceil(this.height); return this; }; goog.math.Rect.prototype.floor = function() { this.left = Math.floor(this.left); this.top = Math.floor(this.top); this.width = Math.floor(this.width); this.height = Math.floor(this.height); return this; }; goog.math.Rect.prototype.round = function() { this.left = Math.round(this.left); this.top = Math.round(this.top); this.width = Math.round(this.width); this.height = Math.round(this.height); return this; }; goog.math.Rect.prototype.translate = function(tx, opt_ty) { if (tx instanceof goog.math.Coordinate) { this.left += tx.x; this.top += tx.y; } else { this.left += goog.asserts.assertNumber(tx); if (typeof opt_ty === "number") { this.top += opt_ty; } } return this; }; goog.math.Rect.prototype.scale = function(sx, opt_sy) { var sy = typeof opt_sy === "number" ? opt_sy : sx; this.left *= sx; this.width *= sx; this.top *= sy; this.height *= sy; return this; }; //# sourceMappingURL=goog.math.rect.js.map