cione-comp-lib
Version:
`$ yarn add cione-comp-lib` 或者 `$ npm i cione-comp-lib -S`
203 lines (202 loc) • 5.63 kB
JavaScript
import { translate, scale, create } from "./matrix.mjs";
import Point from "./Point.mjs";
var mathMin = Math.min;
var mathMax = Math.max;
var lt = new Point();
var rb = new Point();
var lb = new Point();
var rt = new Point();
var minTv = new Point();
var maxTv = new Point();
var BoundingRect = function() {
function BoundingRect2(x, y, width, height) {
if (width < 0) {
x = x + width;
width = -width;
}
if (height < 0) {
y = y + height;
height = -height;
}
this.x = x;
this.y = y;
this.width = width;
this.height = height;
}
BoundingRect2.prototype.union = function(other) {
var x = mathMin(other.x, this.x);
var y = mathMin(other.y, this.y);
if (isFinite(this.x) && isFinite(this.width)) {
this.width = mathMax(other.x + other.width, this.x + this.width) - x;
} else {
this.width = other.width;
}
if (isFinite(this.y) && isFinite(this.height)) {
this.height = mathMax(other.y + other.height, this.y + this.height) - y;
} else {
this.height = other.height;
}
this.x = x;
this.y = y;
};
BoundingRect2.prototype.applyTransform = function(m) {
BoundingRect2.applyTransform(this, this, m);
};
BoundingRect2.prototype.calculateTransform = function(b) {
var a = this;
var sx = b.width / a.width;
var sy = b.height / a.height;
var m = create();
translate(m, m, [-a.x, -a.y]);
scale(m, m, [sx, sy]);
translate(m, m, [b.x, b.y]);
return m;
};
BoundingRect2.prototype.intersect = function(b, mtv) {
if (!b) {
return false;
}
if (!(b instanceof BoundingRect2)) {
b = BoundingRect2.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;
var overlap = !(ax1 < bx0 || bx1 < ax0 || ay1 < by0 || by1 < ay0);
if (mtv) {
var dMin = Infinity;
var dMax = 0;
var d0 = Math.abs(ax1 - bx0);
var d1 = Math.abs(bx1 - ax0);
var d2 = Math.abs(ay1 - by0);
var d3 = Math.abs(by1 - ay0);
var dx = Math.min(d0, d1);
var dy = Math.min(d2, d3);
if (ax1 < bx0 || bx1 < ax0) {
if (dx > dMax) {
dMax = dx;
if (d0 < d1) {
Point.set(maxTv, -d0, 0);
} else {
Point.set(maxTv, d1, 0);
}
}
} else {
if (dx < dMin) {
dMin = dx;
if (d0 < d1) {
Point.set(minTv, d0, 0);
} else {
Point.set(minTv, -d1, 0);
}
}
}
if (ay1 < by0 || by1 < ay0) {
if (dy > dMax) {
dMax = dy;
if (d2 < d3) {
Point.set(maxTv, 0, -d2);
} else {
Point.set(maxTv, 0, d3);
}
}
} else {
if (dx < dMin) {
dMin = dx;
if (d2 < d3) {
Point.set(minTv, 0, d2);
} else {
Point.set(minTv, 0, -d3);
}
}
}
}
if (mtv) {
Point.copy(mtv, overlap ? minTv : maxTv);
}
return overlap;
};
BoundingRect2.prototype.contain = function(x, y) {
var rect = this;
return x >= rect.x && x <= rect.x + rect.width && y >= rect.y && y <= rect.y + rect.height;
};
BoundingRect2.prototype.clone = function() {
return new BoundingRect2(this.x, this.y, this.width, this.height);
};
BoundingRect2.prototype.copy = function(other) {
BoundingRect2.copy(this, other);
};
BoundingRect2.prototype.plain = function() {
return {
x: this.x,
y: this.y,
width: this.width,
height: this.height
};
};
BoundingRect2.prototype.isFinite = function() {
return isFinite(this.x) && isFinite(this.y) && isFinite(this.width) && isFinite(this.height);
};
BoundingRect2.prototype.isZero = function() {
return this.width === 0 || this.height === 0;
};
BoundingRect2.create = function(rect) {
return new BoundingRect2(rect.x, rect.y, rect.width, rect.height);
};
BoundingRect2.copy = function(target, source) {
target.x = source.x;
target.y = source.y;
target.width = source.width;
target.height = source.height;
};
BoundingRect2.applyTransform = function(target, source, m) {
if (!m) {
if (target !== source) {
BoundingRect2.copy(target, source);
}
return;
}
if (m[1] < 1e-5 && m[1] > -1e-5 && m[2] < 1e-5 && m[2] > -1e-5) {
var sx = m[0];
var sy = m[3];
var tx = m[4];
var ty = m[5];
target.x = source.x * sx + tx;
target.y = source.y * sy + ty;
target.width = source.width * sx;
target.height = source.height * sy;
if (target.width < 0) {
target.x += target.width;
target.width = -target.width;
}
if (target.height < 0) {
target.y += target.height;
target.height = -target.height;
}
return;
}
lt.x = lb.x = source.x;
lt.y = rt.y = source.y;
rb.x = rt.x = source.x + source.width;
rb.y = lb.y = source.y + source.height;
lt.transform(m);
rt.transform(m);
rb.transform(m);
lb.transform(m);
target.x = mathMin(lt.x, rb.x, lb.x, rt.x);
target.y = mathMin(lt.y, rb.y, lb.y, rt.y);
var maxX = mathMax(lt.x, rb.x, lb.x, rt.x);
var maxY = mathMax(lt.y, rb.y, lb.y, rt.y);
target.width = maxX - target.x;
target.height = maxY - target.y;
};
return BoundingRect2;
}();
var BoundingRect$1 = BoundingRect;
export { BoundingRect$1 as default };