@foblex/2d
Version:
An Angular library for 2D geometric computations, providing classes and utilities for manipulating points, lines, vectors, rectangles, arcs, and transformations.
95 lines • 15.7 kB
JavaScript
import { PointExtensions } from '../point';
export class RectExtensions {
static initialize(x = 0, y = 0, width = 0, height = 0) {
if (width < 0) {
x = x + width;
width = -width;
}
if (height < 0) {
y = y + height;
height = -height;
}
const gravityCenter = PointExtensions.initialize(x + (width / 2), y + (height / 2));
return { x: x, y: y, width: width, height: height, gravityCenter: gravityCenter };
}
static copy(rect) {
return RectExtensions.initialize(rect.x, rect.y, rect.width, rect.height);
}
static fromElement(element) {
const { x, y, width, height } = element.getBoundingClientRect();
return RectExtensions.initialize(x, y, width, height);
}
static isIncludePoint(rect, point) {
return point.x >= RectExtensions.left(rect) && point.x <= RectExtensions.right(rect) && point.y >= RectExtensions.top(rect) && point.y <= RectExtensions.bottom(rect);
}
static intersectionWithRect(rect1, rect2) {
return !(rect1.x + rect1.width < rect2.x ||
rect2.x + rect2.width < rect1.x ||
rect1.y + rect1.height < rect2.y ||
rect2.y + rect2.height < rect1.y);
}
static left(rect) {
return rect.x;
}
static top(rect) {
return rect.y;
}
static right(rect) {
return rect.x + rect.width;
}
static bottom(rect) {
return rect.y + rect.height;
}
static addPoint(rect, point) {
const rectCopy = RectExtensions.copy(rect);
rectCopy.x += point.x;
rectCopy.y += point.y;
return this.initialize(rectCopy.x, rectCopy.y, rectCopy.width, rectCopy.height);
}
static mult(rect, value) {
const rectCopy = RectExtensions.copy(rect);
rectCopy.x *= value;
rectCopy.y *= value;
rectCopy.width *= value;
rectCopy.height *= value;
return this.initialize(rectCopy.x, rectCopy.y, rectCopy.width, rectCopy.height);
}
static div(rect, value) {
const rectCopy = RectExtensions.copy(rect);
rectCopy.x /= value;
rectCopy.y /= value;
rectCopy.width /= value;
rectCopy.height /= value;
return this.initialize(rectCopy.x, rectCopy.y, rectCopy.width, rectCopy.height);
}
static addPointToSize(rect, point) {
const rectCopy = RectExtensions.copy(rect);
rectCopy.width += point.x;
rectCopy.height += point.y;
return this.initialize(rectCopy.x, rectCopy.y, rectCopy.width, rectCopy.height);
}
static union(rects) {
if (!rects || rects.length === 0) {
return null;
}
return rects.reduce((result, rect) => {
const minX = Math.min(result.x, rect.x);
const minY = Math.min(result.y, rect.y);
const maxX = Math.max(result.x + result.width, rect.x + rect.width);
const maxY = Math.max(result.y + result.height, rect.y + rect.height);
return RectExtensions.initialize(minX, minY, maxX - minX, maxY - minY);
}, rects[0]);
}
static elementTransform(rect, element) {
const matrix = element.getBoundingClientRect();
const position = PointExtensions.sub(rect, PointExtensions.initialize(matrix.left, matrix.top));
return RectExtensions.initialize(position.x, position.y, rect.width, rect.height);
}
static updateIsNotFinite(rect) {
if (!Number.isFinite(rect.width) || !Number.isFinite(rect.height) || !Number.isFinite(rect.x) || !Number.isFinite(rect.y)) {
return RectExtensions.initialize(0, 0, 0, 0);
}
return rect;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjdC5leHRlbnNpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvZm9ibGV4MmQvc3JjL3JlY3QvcmVjdC5leHRlbnNpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBVSxlQUFlLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFbkQsTUFBTSxPQUFPLGNBQWM7SUFFbEIsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFZLENBQUMsRUFBRSxJQUFZLENBQUMsRUFBRSxRQUFnQixDQUFDLEVBQUUsU0FBaUIsQ0FBQztRQUUxRixJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUU7WUFDYixDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztZQUNkLEtBQUssR0FBRyxDQUFDLEtBQUssQ0FBQztTQUNoQjtRQUNELElBQUksTUFBTSxHQUFHLENBQUMsRUFBRTtZQUNkLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDO1lBQ2YsTUFBTSxHQUFHLENBQUMsTUFBTSxDQUFDO1NBQ2xCO1FBQ0QsTUFBTSxhQUFhLEdBQUcsZUFBZSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFcEYsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxDQUFDO0lBQ3BGLENBQUM7SUFFTSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQVc7UUFDNUIsT0FBTyxjQUFjLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FB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QztJQUVNLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxJQUFXO1FBQ3pDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUN6SCxPQUFPLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDOUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElSZWN0IH0gZnJvbSAnLi9pLXJlY3QnO1xuaW1wb3J0IHsgSVBvaW50LCBQb2ludEV4dGVuc2lvbnMgfSBmcm9tICcuLi9wb2ludCc7XG5cbmV4cG9ydCBjbGFzcyBSZWN0RXh0ZW5zaW9ucyB7XG5cbiAgcHVibGljIHN0YXRpYyBpbml0aWFsaXplKHg6IG51bWJlciA9IDAsIHk6IG51bWJlciA9IDAsIHdpZHRoOiBudW1iZXIgPSAwLCBoZWlnaHQ6IG51bWJlciA9IDApOiBJUmVjdCB7XG5cbiAgICBpZiAod2lkdGggPCAwKSB7XG4gICAgICB4ID0geCArIHdpZHRoO1xuICAgICAgd2lkdGggPSAtd2lkdGg7XG4gICAgfVxuICAgIGlmIChoZWlnaHQgPCAwKSB7XG4gICAgICB5ID0geSArIGhlaWdodDtcbiAgICAgIGhlaWdodCA9IC1oZWlnaHQ7XG4gICAgfVxuICAgIGNvbnN0IGdyYXZpdHlDZW50ZXIgPSBQb2ludEV4dGVuc2lvbnMuaW5pdGlhbGl6ZSh4ICsgKHdpZHRoIC8gMiksIHkgKyAoaGVpZ2h0IC8gMikpO1xuXG4gICAgcmV0dXJuIHsgeDogeCwgeTogeSwgd2lkdGg6IHdpZHRoLCBoZWlnaHQ6IGhlaWdodCwgZ3Jhdml0eUNlbnRlcjogZ3Jhdml0eUNlbnRlciB9O1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBjb3B5KHJlY3Q6IElSZWN0KTogSVJlY3Qge1xuICAgIHJldHVybiBSZWN0RXh0ZW5zaW9ucy5pbml0aWFsaXplKHJlY3QueCwgcmVjdC55LCByZWN0LndpZHRoLCByZWN0LmhlaWdodCk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGZyb21FbGVtZW50KGVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgU1ZHRWxlbWVudCk6IElSZWN0IHtcbiAgICBjb25zdCB7IHgsIHksIHdpZHRoLCBoZWlnaHQgfSA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgcmV0dXJuIFJlY3RFeHRlbnNpb25zLmluaXRpYWxpemUoeCwgeSwgd2lkdGgsIGhlaWdodCk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzSW5jbHVkZVBvaW50KHJlY3Q6IElSZWN0LCBwb2ludDogSVBvaW50KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHBvaW50LnggPj0gUmVjdEV4dGVuc2lvbnMubGVmdChyZWN0KSAmJiBwb2ludC54IDw9IFJlY3RFeHRlbnNpb25zLnJpZ2h0KHJlY3QpICYmIHBvaW50LnkgPj0gUmVjdEV4dGVuc2lvbnMudG9wKHJlY3QpICYmIHBvaW50LnkgPD0gUmVjdEV4dGVuc2lvbnMuYm90dG9tKHJlY3QpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpbnRlcnNlY3Rpb25XaXRoUmVjdChyZWN0MTogSVJlY3QsIHJlY3QyOiBJUmVjdCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhKHJlY3QxLnggKyByZWN0MS53aWR0aCA8IHJlY3QyLnggfHxcbiAgICAgIHJlY3QyLnggKyByZWN0Mi53aWR0aCA8IHJlY3QxLnggfHxcbiAgICAgIHJlY3QxLnkgKyByZWN0MS5oZWlnaHQgPCByZWN0Mi55IHx8XG4gICAgICByZWN0Mi55ICsgcmVjdDIuaGVpZ2h0IDwgcmVjdDEueSk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGxlZnQocmVjdDogSVJlY3QpOiBudW1iZXIge1xuICAgIHJldHVybiByZWN0Lng7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHRvcChyZWN0OiBJUmVjdCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHJlY3QueTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgcmlnaHQocmVjdDogSVJlY3QpOiBudW1iZXIge1xuICAgIHJldHVybiByZWN0LnggKyByZWN0LndpZHRoO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBib3R0b20ocmVjdDogSVJlY3QpOiBudW1iZXIge1xuICAgIHJldHVybiByZWN0LnkgKyByZWN0LmhlaWdodDtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgYWRkUG9pbnQocmVjdDogSVJlY3QsIHBvaW50OiBJUG9pbnQpOiBJUmVjdCB7XG4gICAgY29uc3QgcmVjdENvcHkgPSBSZWN0RXh0ZW5zaW9ucy5jb3B5KHJlY3QpO1xuICAgIHJlY3RDb3B5LnggKz0gcG9pbnQueDtcbiAgICByZWN0Q29weS55ICs9IHBvaW50Lnk7XG4gICAgcmV0dXJuIHRoaXMuaW5pdGlhbGl6ZShyZWN0Q29weS54LCByZWN0Q29weS55LCByZWN0Q29weS53aWR0aCwgcmVjdENvcHkuaGVpZ2h0KTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgbXVsdChyZWN0OiBJUmVjdCwgdmFsdWU6IG51bWJlcik6IElSZWN0IHtcbiAgICBjb25zdCByZWN0Q29weSA9IFJlY3RFeHRlbnNpb25zLmNvcHkocmVjdCk7XG4gICAgcmVjdENvcHkueCAqPSB2YWx1ZTtcbiAgICByZWN0Q29weS55ICo9IHZhbHVlO1xuICAgIHJlY3RDb3B5LndpZHRoICo9IHZhbHVlO1xuICAgIHJlY3RDb3B5LmhlaWdodCAqPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcy5pbml0aWFsaXplKHJlY3RDb3B5LngsIHJlY3RDb3B5LnksIHJlY3RDb3B5LndpZHRoLCByZWN0Q29weS5oZWlnaHQpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBkaXYocmVjdDogSVJlY3QsIHZhbHVlOiBudW1iZXIpOiBJUmVjdCB7XG4gICAgY29uc3QgcmVjdENvcHkgPSBSZWN0RXh0ZW5zaW9ucy5jb3B5KHJlY3QpO1xuICAgIHJlY3RDb3B5LnggLz0gdmFsdWU7XG4gICAgcmVjdENvcHkueSAvPSB2YWx1ZTtcbiAgICByZWN0Q29weS53aWR0aCAvPSB2YWx1ZTtcbiAgICByZWN0Q29weS5oZWlnaHQgLz0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXMuaW5pdGlhbGl6ZShyZWN0Q29weS54LCByZWN0Q29weS55LCByZWN0Q29weS53aWR0aCwgcmVjdENvcHkuaGVpZ2h0KTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgYWRkUG9pbnRUb1NpemUocmVjdDogSVJlY3QsIHBvaW50OiBJUG9pbnQpOiBJUmVjdCB7XG4gICAgY29uc3QgcmVjdENvcHkgPSBSZWN0RXh0ZW5zaW9ucy5jb3B5KHJlY3QpO1xuICAgIHJlY3RDb3B5LndpZHRoICs9IHBvaW50Lng7XG4gICAgcmVjdENvcHkuaGVpZ2h0ICs9IHBvaW50Lnk7XG4gICAgcmV0dXJuIHRoaXMuaW5pdGlhbGl6ZShyZWN0Q29weS54LCByZWN0Q29weS55LCByZWN0Q29weS53aWR0aCwgcmVjdENvcHkuaGVpZ2h0KTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgdW5pb24ocmVjdHM6IElSZWN0W10pOiBJUmVjdCB8IG51bGwge1xuICAgIGlmICghcmVjdHMgfHwgcmVjdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHJlY3RzLnJlZHVjZSgocmVzdWx0OiBJUmVjdCwgcmVjdCkgPT4ge1xuICAgICAgY29uc3QgbWluWCA9IE1hdGgubWluKHJlc3VsdC54LCByZWN0LngpO1xuICAgICAgY29uc3QgbWluWSA9IE1hdGgubWluKHJlc3VsdC55LCByZWN0LnkpO1xuICAgICAgY29uc3QgbWF4WCA9IE1hdGgubWF4KHJlc3VsdC54ICsgcmVzdWx0LndpZHRoLCByZWN0LnggKyByZWN0LndpZHRoKTtcbiAgICAgIGNvbnN0IG1heFkgPSBNYXRoLm1heChyZXN1bHQueSArIHJlc3VsdC5oZWlnaHQsIHJlY3QueSArIHJlY3QuaGVpZ2h0KTtcbiAgICAgIHJldHVybiBSZWN0RXh0ZW5zaW9ucy5pbml0aWFsaXplKG1pblgsIG1pblksIG1heFggLSBtaW5YLCBtYXhZIC0gbWluWSk7XG4gICAgfSwgcmVjdHNbMF0pO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBlbGVtZW50VHJhbnNmb3JtKHJlY3Q6IElSZWN0LCBlbGVtZW50OiBIVE1MRWxlbWVudCB8IFNWR0VsZW1lbnQpOiBJUmVjdCB7XG4gICAgY29uc3QgbWF0cml4ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBwb3NpdGlvbiA9IFBvaW50RXh0ZW5zaW9ucy5zdWIocmVjdCwgUG9pbnRFeHRlbnNpb25zLmluaXRpYWxpemUobWF0cml4LmxlZnQsIG1hdHJpeC50b3ApKTtcbiAgICByZXR1cm4gUmVjdEV4dGVuc2lvbnMuaW5pdGlhbGl6ZShwb3NpdGlvbi54LCBwb3NpdGlvbi55LCByZWN0LndpZHRoLCByZWN0LmhlaWdodCk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHVwZGF0ZUlzTm90RmluaXRlKHJlY3Q6IElSZWN0KTogSVJlY3Qge1xuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHJlY3Qud2lkdGgpIHx8ICFOdW1iZXIuaXNGaW5pdGUocmVjdC5oZWlnaHQpIHx8ICFOdW1iZXIuaXNGaW5pdGUocmVjdC54KSB8fCAhTnVtYmVyLmlzRmluaXRlKHJlY3QueSkpIHtcbiAgICAgIHJldHVybiBSZWN0RXh0ZW5zaW9ucy5pbml0aWFsaXplKDAsIDAsIDAsIDApO1xuICAgIH1cbiAgICByZXR1cm4gcmVjdDtcbiAgfVxufVxuIl19