193 lines
6.3 KiB
JavaScript
193 lines
6.3 KiB
JavaScript
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
|