@foblex/2d
Version:
An Angular library for 2D geometric computations, providing classes and utilities for manipulating points, lines, vectors, rectangles, arcs, and transformations.
69 lines • 11.8 kB
JavaScript
export class PointExtensions {
static castToPoint(value) {
return value || PointExtensions.initialize();
}
static initialize(x = 0, y = 0) {
return { x: x, y: y };
}
static copy(point) {
return PointExtensions.initialize(point.x, point.y);
}
static isEqual(point1, point2) {
return point1.x === point2.x && point1.y === point2.y;
}
static sum(point1, point2) {
return { x: (point1.x + point2.x), y: (point1.y + point2.y) };
}
static sub(point1, point2) {
return { x: (point1.x - point2.x), y: (point1.y - point2.y) };
}
static div(point, value) {
return { x: (point.x / value), y: (point.y / value) };
}
static mult(point, value) {
return { x: (point.x * value), y: (point.y * value) };
}
static interpolatePoints(point1, point2, t) {
const oneMinusT = 1.0 - t;
return PointExtensions.initialize(point1.x * oneMinusT + point2.x * t, point1.y * oneMinusT + point2.y * t);
}
static roundTo(point, size) {
const xCount = Math.trunc(point.x / size);
const yCount = Math.trunc(point.y / size);
return { x: xCount * size, y: yCount * size };
}
static hypotenuse(point1, point2) {
const a = (point2.x - point1.x);
const b = (point2.y - point1.y);
return Math.abs(Math.sqrt(a * a + b * b));
}
static distance(point1, point2) {
const dx = point1.x - point2.x;
const dy = point1.y - point2.y;
return Math.sqrt(dx * dx + dy * dy);
}
static getMinimum(point1, point2) {
return PointExtensions.initialize(Math.min(point1.x, point2.x), Math.min(point1.y, point2.y));
}
static getMaximum(point1, point2) {
return PointExtensions.initialize(Math.max(point1.x, point2.x), Math.max(point1.y, point2.y));
}
static matrixTransform(point, element) {
let result = PointExtensions.initialize(point.x, point.y);
let matrix = element.getScreenCTM();
if (matrix) {
const svgPoint = element.createSVGPoint();
svgPoint.x = point.x;
svgPoint.y = point.y;
result = svgPoint.matrixTransform(matrix.inverse());
}
return result;
}
static elementTransform(point, element) {
let result = PointExtensions.initialize(point.x, point.y);
let matrix = element.getBoundingClientRect();
result = PointExtensions.sub(result, PointExtensions.initialize(matrix.left, matrix.top));
return result;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9pbnQuZXh0ZW5zaW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2ZvYmxleDJkL3NyYy9wb2ludC9wb2ludC5leHRlbnNpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUlBLE1BQU0sT0FBTyxlQUFlO0lBRW5CLE1BQU0sQ0FBQyxXQUFXLENBQUMsS0FBaUI7UUFDekMsT0FBTyxLQUFLLElBQUksZUFBZSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQy9DLENBQUM7SUFFTSxNQUFNLENBQUMsVUFBVSxDQUFDLElBQVksQ0FBQyxFQUFFLElBQVksQ0FBQztRQUNuRCxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVNLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBYTtRQUM5QixPQUFPLGVBQWUsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVNLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBYyxFQUFFLE1BQWM7UUFDbEQsT0FBTyxNQUFNLENBQUMsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFTSxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQWMsRUFBRSxNQUFjO1FBQzlDLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ2hFLENBQUM7SUFFTSxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQWMsRUFBRSxNQUFjO1FBQzlDLE9BQU8sRUFBRSxDQUFDLEVB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TSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFMUYsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSVBvaW50IH0gZnJvbSAnLi9pLXBvaW50JztcblxuZXhwb3J0IHR5cGUgUG9pbnRJbnB1dCA9IElQb2ludCB8IG51bGwgfCB1bmRlZmluZWQ7XG5cbmV4cG9ydCBjbGFzcyBQb2ludEV4dGVuc2lvbnMge1xuXG4gIHB1YmxpYyBzdGF0aWMgY2FzdFRvUG9pbnQodmFsdWU6IFBvaW50SW5wdXQpOiBJUG9pbnQge1xuICAgIHJldHVybiB2YWx1ZSB8fCBQb2ludEV4dGVuc2lvbnMuaW5pdGlhbGl6ZSgpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpbml0aWFsaXplKHg6IG51bWJlciA9IDAsIHk6IG51bWJlciA9IDApOiBJUG9pbnQge1xuICAgIHJldHVybiB7IHg6IHgsIHk6IHkgfTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgY29weShwb2ludDogSVBvaW50KTogSVBvaW50IHtcbiAgICByZXR1cm4gUG9pbnRFeHRlbnNpb25zLmluaXRpYWxpemUocG9pbnQueCwgcG9pbnQueSk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzRXF1YWwocG9pbnQxOiBJUG9pbnQsIHBvaW50MjogSVBvaW50KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHBvaW50MS54ID09PSBwb2ludDIueCAmJiBwb2ludDEueSA9PT0gcG9pbnQyLnk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHN1bShwb2ludDE6IElQb2ludCwgcG9pbnQyOiBJUG9pbnQpOiBJUG9pbnQge1xuICAgIHJldHVybiB7IHg6IChwb2ludDEueCArIHBvaW50Mi54KSwgeTogKHBvaW50MS55ICsgcG9pbnQyLnkpIH07XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHN1Yihwb2ludDE6IElQb2ludCwgcG9pbnQyOiBJUG9pbnQpOiBJUG9pbnQge1xuICAgIHJldHVybiB7IHg6IChwb2ludDEueCAtIHBvaW50Mi54KSwgeTogKHBvaW50MS55IC0gcG9pbnQyLnkpIH07XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGRpdihwb2ludDogSVBvaW50LCB2YWx1ZTogbnVtYmVyKTogSVBvaW50IHtcbiAgICByZXR1cm4geyB4OiAocG9pbnQueCAvIHZhbHVlKSwgeTogKHBvaW50LnkgLyB2YWx1ZSkgfTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgbXVsdChwb2ludDogSVBvaW50LCB2YWx1ZTogbnVtYmVyKTogSVBvaW50IHtcbiAgICByZXR1cm4geyB4OiAocG9pbnQueCAqIHZhbHVlKSwgeTogKHBvaW50LnkgKiB2YWx1ZSkgfTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaW50ZXJwb2xhdGVQb2ludHMocG9pbnQxOiBJUG9pbnQsIHBvaW50MjogSVBvaW50LCB0OiBudW1iZXIpOiBJUG9pbnQge1xuICAgIGNvbnN0IG9uZU1pbnVzVCA9IDEuMCAtIHQ7XG5cbiAgICByZXR1cm4gUG9pbnRFeHRlbnNpb25zLmluaXRpYWxpemUoXG4gICAgICBwb2ludDEueCAqIG9uZU1pbnVzVCArIHBvaW50Mi54ICogdCxcbiAgICAgIHBvaW50MS55ICogb25lTWludXNUICsgcG9pbnQyLnkgKiB0XG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgcm91bmRUbyhwb2ludDogSVBvaW50LCBzaXplOiBudW1iZXIpOiBJUG9pbnQge1xuICAgIGNvbnN0IHhDb3VudCA9IE1hdGgudHJ1bmMocG9pbnQueCAvIHNpemUpO1xuICAgIGNvbnN0IHlDb3VudCA9IE1hdGgudHJ1bmMocG9pbnQueSAvIHNpemUpO1xuICAgIHJldHVybiB7IHg6IHhDb3VudCAqIHNpemUsIHk6IHlDb3VudCAqIHNpemUgfTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaHlwb3RlbnVzZShwb2ludDE6IElQb2ludCwgcG9pbnQyOiBJUG9pbnQpOiBudW1iZXIge1xuICAgIGNvbnN0IGEgPSAocG9pbnQyLnggLSBwb2ludDEueCk7XG4gICAgY29uc3QgYiA9IChwb2ludDIueSAtIHBvaW50MS55KTtcbiAgICByZXR1cm4gTWF0aC5hYnMoTWF0aC5zcXJ0KGEgKiBhICsgYiAqIGIpKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZGlzdGFuY2UocG9pbnQxOiBJUG9pbnQsIHBvaW50MjogSVBvaW50KTogbnVtYmVyIHtcbiAgICBjb25zdCBkeCA9IHBvaW50MS54IC0gcG9pbnQyLng7XG4gICAgY29uc3QgZHkgPSBwb2ludDEueSAtIHBvaW50Mi55O1xuICAgIHJldHVybiBNYXRoLnNxcnQoZHggKiBkeCArIGR5ICogZHkpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBnZXRNaW5pbXVtKHBvaW50MTogSVBvaW50LCBwb2ludDI6IElQb2ludCk6IElQb2ludCB7XG4gICAgcmV0dXJuIFBvaW50RXh0ZW5zaW9ucy5pbml0aWFsaXplKFxuICAgICAgTWF0aC5taW4ocG9pbnQxLngsIHBvaW50Mi54KSxcbiAgICAgIE1hdGgubWluKHBvaW50MS55LCBwb2ludDIueSlcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBnZXRNYXhpbXVtKHBvaW50MTogSVBvaW50LCBwb2ludDI6IElQb2ludCk6IElQb2ludCB7XG4gICAgcmV0dXJuIFBvaW50RXh0ZW5zaW9ucy5pbml0aWFsaXplKFxuICAgICAgTWF0aC5tYXgocG9pbnQxLngsIHBvaW50Mi54KSxcbiAgICAgIE1hdGgubWF4KHBvaW50MS55LCBwb2ludDIueSlcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBtYXRyaXhUcmFuc2Zvcm0ocG9pbnQ6IElQb2ludCwgZWxlbWVudDogU1ZHU1ZHRWxlbWVudCk6IElQb2ludCB7XG5cbiAgICBsZXQgcmVzdWx0OiBJUG9pbnQgPSBQb2ludEV4dGVuc2lvbnMuaW5pdGlhbGl6ZShwb2ludC54LCBwb2ludC55KTtcblxuICAgIGxldCBtYXRyaXggPSBlbGVtZW50LmdldFNjcmVlbkNUTSgpO1xuICAgIGlmIChtYXRyaXgpIHtcbiAgICAgIGNvbnN0IHN2Z1BvaW50ID0gZWxlbWVudC5jcmVhdGVTVkdQb2ludCgpO1xuICAgICAgc3ZnUG9pbnQueCA9IHBvaW50Lng7XG4gICAgICBzdmdQb2ludC55ID0gcG9pbnQueTtcbiAgICAgIHJlc3VsdCA9IHN2Z1BvaW50Lm1hdHJpeFRyYW5zZm9ybShtYXRyaXguaW52ZXJzZSgpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZWxlbWVudFRyYW5zZm9ybShwb2ludDogSVBvaW50LCBlbGVtZW50OiBIVE1MRWxlbWVudCB8IFNWR0VsZW1lbnQpOiBJUG9pbnQge1xuICAgIGxldCByZXN1bHQ6IElQb2ludCA9IFBvaW50RXh0ZW5zaW9ucy5pbml0aWFsaXplKHBvaW50LngsIHBvaW50LnkpO1xuXG4gICAgbGV0IG1hdHJpeCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICByZXN1bHQgPSBQb2ludEV4dGVuc2lvbnMuc3ViKHJlc3VsdCwgUG9pbnRFeHRlbnNpb25zLmluaXRpYWxpemUobWF0cml4LmxlZnQsIG1hdHJpeC50b3ApKTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cbiJdfQ==