UNPKG

@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
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