| /** |
| * @module echarts/core/BoundingRect |
| */ |
| import * as vec2 from './vector'; |
| import * as matrix from './matrix'; |
| var v2ApplyTransform = vec2.applyTransform; |
| var mathMin = Math.min; |
| var mathMax = Math.max; |
| /** |
| * @alias module:echarts/core/BoundingRect |
| */ |
| |
| function BoundingRect(x, y, width, height) { |
| if (width < 0) { |
| x = x + width; |
| width = -width; |
| } |
| |
| if (height < 0) { |
| y = y + height; |
| height = -height; |
| } |
| /** |
| * @type {number} |
| */ |
| |
| |
| this.x = x; |
| /** |
| * @type {number} |
| */ |
| |
| this.y = y; |
| /** |
| * @type {number} |
| */ |
| |
| this.width = width; |
| /** |
| * @type {number} |
| */ |
| |
| this.height = height; |
| } |
| |
| BoundingRect.prototype = { |
| constructor: BoundingRect, |
| |
| /** |
| * @param {module:echarts/core/BoundingRect} other |
| */ |
| union: function (other) { |
| var x = mathMin(other.x, this.x); |
| var y = mathMin(other.y, this.y); |
| this.width = mathMax(other.x + other.width, this.x + this.width) - x; |
| this.height = mathMax(other.y + other.height, this.y + this.height) - y; |
| this.x = x; |
| this.y = y; |
| }, |
| |
| /** |
| * @param {Array.<number>} m |
| * @methods |
| */ |
| applyTransform: function () { |
| var lt = []; |
| var rb = []; |
| var lb = []; |
| var rt = []; |
| return function (m) { |
| // In case usage like this |
| // el.getBoundingRect().applyTransform(el.transform) |
| // And element has no transform |
| if (!m) { |
| return; |
| } |
| |
| lt[0] = lb[0] = this.x; |
| lt[1] = rt[1] = this.y; |
| rb[0] = rt[0] = this.x + this.width; |
| rb[1] = lb[1] = this.y + this.height; |
| v2ApplyTransform(lt, lt, m); |
| v2ApplyTransform(rb, rb, m); |
| v2ApplyTransform(lb, lb, m); |
| v2ApplyTransform(rt, rt, m); |
| this.x = mathMin(lt[0], rb[0], lb[0], rt[0]); |
| this.y = mathMin(lt[1], rb[1], lb[1], rt[1]); |
| var maxX = mathMax(lt[0], rb[0], lb[0], rt[0]); |
| var maxY = mathMax(lt[1], rb[1], lb[1], rt[1]); |
| this.width = maxX - this.x; |
| this.height = maxY - this.y; |
| }; |
| }(), |
| |
| /** |
| * Calculate matrix of transforming from self to target rect |
| * @param {module:zrender/core/BoundingRect} b |
| * @return {Array.<number>} |
| */ |
| calculateTransform: function (b) { |
| var a = this; |
| var sx = b.width / a.width; |
| var sy = b.height / a.height; |
| var m = matrix.create(); // 矩阵右乘 |
| |
| matrix.translate(m, m, [-a.x, -a.y]); |
| matrix.scale(m, m, [sx, sy]); |
| matrix.translate(m, m, [b.x, b.y]); |
| return m; |
| }, |
| |
| /** |
| * @param {(module:echarts/core/BoundingRect|Object)} b |
| * @return {boolean} |
| */ |
| intersect: function (b) { |
| if (!b) { |
| return false; |
| } |
| |
| if (!(b instanceof BoundingRect)) { |
| // Normalize negative width/height. |
| b = BoundingRect.create(b); |
| } |
| |
| var a = this; |
| var ax0 = a.x; |
| var ax1 = a.x + a.width; |
| var ay0 = a.y; |
| var ay1 = a.y + a.height; |
| var bx0 = b.x; |
| var bx1 = b.x + b.width; |
| var by0 = b.y; |
| var by1 = b.y + b.height; |
| return !(ax1 < bx0 || bx1 < ax0 || ay1 < by0 || by1 < ay0); |
| }, |
| contain: function (x, y) { |
| var rect = this; |
| return x >= rect.x && x <= rect.x + rect.width && y >= rect.y && y <= rect.y + rect.height; |
| }, |
| |
| /** |
| * @return {module:echarts/core/BoundingRect} |
| */ |
| clone: function () { |
| return new BoundingRect(this.x, this.y, this.width, this.height); |
| }, |
| |
| /** |
| * Copy from another rect |
| */ |
| copy: function (other) { |
| this.x = other.x; |
| this.y = other.y; |
| this.width = other.width; |
| this.height = other.height; |
| }, |
| plain: function () { |
| return { |
| x: this.x, |
| y: this.y, |
| width: this.width, |
| height: this.height |
| }; |
| } |
| }; |
| /** |
| * @param {Object|module:zrender/core/BoundingRect} rect |
| * @param {number} rect.x |
| * @param {number} rect.y |
| * @param {number} rect.width |
| * @param {number} rect.height |
| * @return {module:zrender/core/BoundingRect} |
| */ |
| |
| BoundingRect.create = function (rect) { |
| return new BoundingRect(rect.x, rect.y, rect.width, rect.height); |
| }; |
| |
| export default BoundingRect; |