UNPKG

@foblex/2d

Version:

An Angular library for 2D geometric computations, providing classes and utilities for manipulating points, lines, vectors, rectangles, arcs, and transformations.

49 lines 8.83 kB
export function findClosestAlignment(elements, target, alignThreshold = 10) { let nearestX; let minDistanceX; let nearestY; let minDistanceY; for (const element of elements) { const targetCenterX = target.gravityCenter.x; const targetCenterY = target.gravityCenter.y; const elementRight = element.x + element.width; const elementBottom = element.y + element.height; const elementDistances = { x: [ { value: element.x, distance: target.x - element.x }, { value: elementRight, distance: target.x - elementRight }, { value: element.gravityCenter.x, distance: targetCenterX - element.gravityCenter.x }, { value: element.x, distance: (target.x + target.width) - element.x }, { value: elementRight, distance: (target.x + target.width) - elementRight }, // Right to right ], y: [ { value: element.y, distance: target.y - element.y }, { value: elementBottom, distance: target.y - elementBottom }, { value: element.gravityCenter.y, distance: targetCenterY - element.gravityCenter.y }, { value: element.y, distance: (target.y + target.height) - element.y }, { value: elementBottom, distance: (target.y + target.height) - elementBottom }, // Bottom to bottom ], }; for (const { value, distance } of elementDistances.x) { if (Math.abs(distance) <= alignThreshold) { if (minDistanceX === undefined || Math.abs(distance) < Math.abs(minDistanceX)) { minDistanceX = distance; nearestX = value; } } } for (const { value, distance } of elementDistances.y) { if (Math.abs(distance) <= alignThreshold) { if (minDistanceY === undefined || Math.abs(distance) < Math.abs(minDistanceY)) { minDistanceY = distance; nearestY = value; } } } } return { xResult: { value: nearestX, distance: minDistanceX }, yResult: { value: nearestY, distance: minDistanceY }, }; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmluZC1jbG9zZXN0LWFsaWdubWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2ZvYmxleDJkL3NyYy9yZWN0L2ZpbmQtY2xvc2VzdC1hbGlnbm1lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsTUFBTSxVQUFVLG9CQUFvQixDQUFDLFFBQWlCLEVBQUUsTUFBYSxFQUFFLGlCQUF5QixFQUFFO0lBSWhHLElBQUksUUFBNEIsQ0FBQztJQUNqQyxJQUFJLFlBQWdDLENBQUM7SUFDckMsSUFBSSxRQUE0QixDQUFDO0lBQ2pDLElBQUksWUFBZ0MsQ0FBQztJQUVyQyxLQUFLLE1BQU0sT0FBTyxJQUFJLFFBQVEsRUFBRTtRQUM5QixNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztRQUM3QyxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztRQUU3QyxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUM7UUFDL0MsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDO1FBRWpELE1BQU0sZ0JBQWdCLEdBQUc7WUFDdkIsQ0FBQyxFQUFFO2dCQUNELEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsRUFBRTtnQkFDcEQsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQyxHQUFHLFlBQVksRUFBRTtnQkFDMUQsRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLGFBQWEsR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsRUFBRTtnQkFDckYsRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxFQUFFO2dCQUNyRSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsWUFBWSxFQUFFLEVBQUUsaUJBQWlCO2FBQy9GO1lBQ0QsQ0FBQyxFQUFFO2dCQUNELEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsRUFBRTtnQkFDcEQsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQyxHQUFHLGFBQWEsRUFBRTtnQkFDNUQsRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLGFBQWEsR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsRUFBRTtnQkFDckYsRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxFQUFFO2dCQUN0RSxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsYUFBYSxFQUFFLEVBQUUsbUJBQW1CO2FBQ3BHO1NBQ0YsQ0FBQztRQUVGLEtBQUssTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsSUFBSSxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUU7WUFDcEQsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLGNBQWMsRUFBRTtnQkFDeEMsSUFBSSxZQUFZLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsRUFBRTtvQkFDN0UsWUFBWSxHQUFHLFFBQVEsQ0FBQztvQkFDeEIsUUFBUSxHQUFHLEtBQUssQ0FBQztpQkFDbEI7YUFDRjtTQUNGO1FBRUQsS0FBSyxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxJQUFJLGdCQUFnQixDQUFDLENBQUMsRUFBRTtZQUNwRCxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksY0FBYyxFQUFFO2dCQUN4QyxJQUFJLFlBQVksS0FBSyxTQUFTLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxFQUFFO29CQUM3RSxZQUFZLEdBQUcsUUFBUSxDQUFDO29CQUN4QixRQUFRLEdBQUcsS0FBSyxDQUFDO2lCQUNsQjthQUNGO1NBQ0Y7S0FDRjtJQUVELE9BQU87UUFDTCxPQUFPLEVBQUUsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUU7UUFDcEQsT0FBTyxFQUFFLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFO0tBQ3JELENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSVJlY3QgfSBmcm9tICcuL2ktcmVjdCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kQ2xvc2VzdEFsaWdubWVudChlbGVtZW50czogSVJlY3RbXSwgdGFyZ2V0OiBJUmVjdCwgYWxpZ25UaHJlc2hvbGQ6IG51bWJlciA9IDEwKToge1xuICB4UmVzdWx0OiB7IHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQsIGRpc3RhbmNlOiBudW1iZXIgfCB1bmRlZmluZWQgfSxcbiAgeVJlc3VsdDogeyB2YWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkLCBkaXN0YW5jZTogbnVtYmVyIHwgdW5kZWZpbmVkIH1cbn0ge1xuICBsZXQgbmVhcmVzdFg6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgbGV0IG1pbkRpc3RhbmNlWDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBsZXQgbmVhcmVzdFk6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgbGV0IG1pbkRpc3RhbmNlWTogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cykge1xuICAgIGNvbnN0IHRhcmdldENlbnRlclggPSB0YXJnZXQuZ3Jhdml0eUNlbnRlci54O1xuICAgIGNvbnN0IHRhcmdldENlbnRlclkgPSB0YXJnZXQuZ3Jhdml0eUNlbnRlci55O1xuXG4gICAgY29uc3QgZWxlbWVudFJpZ2h0ID0gZWxlbWVudC54ICsgZWxlbWVudC53aWR0aDtcbiAgICBjb25zdCBlbGVtZW50Qm90dG9tID0gZWxlbWVudC55ICsgZWxlbWVudC5oZWlnaHQ7XG5cbiAgICBjb25zdCBlbGVtZW50RGlzdGFuY2VzID0ge1xuICAgICAgeDogW1xuICAgICAgICB7IHZhbHVlOiBlbGVtZW50LngsIGRpc3RhbmNlOiB0YXJnZXQueCAtIGVsZW1lbnQueCB9LCAvLyBMZWZ0IGVkZ2VcbiAgICAgICAgeyB2YWx1ZTogZWxlbWVudFJpZ2h0LCBkaXN0YW5jZTogdGFyZ2V0LnggLSBlbGVtZW50UmlnaHQgfSwgLy8gUmlnaHQgZWRnZVxuICAgICAgICB7IHZhbHVlOiBlbGVtZW50LmdyYXZpdHlDZW50ZXIueCwgZGlzdGFuY2U6IHRhcmdldENlbnRlclggLSBlbGVtZW50LmdyYXZpdHlDZW50ZXIueCB9LCAvLyBDZW50ZXJcbiAgICAgICAgeyB2YWx1ZTogZWxlbWVudC54LCBkaXN0YW5jZTogKHRhcmdldC54ICsgdGFyZ2V0LndpZHRoKSAtIGVsZW1lbnQueCB9LCAvLyBSaWdodCB0byBsZWZ0XG4gICAgICAgIHsgdmFsdWU6IGVsZW1lbnRSaWdodCwgZGlzdGFuY2U6ICh0YXJnZXQueCArIHRhcmdldC53aWR0aCkgLSBlbGVtZW50UmlnaHQgfSwgLy8gUmlnaHQgdG8gcmlnaHRcbiAgICAgIF0sXG4gICAgICB5OiBbXG4gICAgICAgIHsgdmFsdWU6IGVsZW1lbnQueSwgZGlzdGFuY2U6IHRhcmdldC55IC0gZWxlbWVudC55IH0sIC8vIFRvcCBlZGdlXG4gICAgICAgIHsgdmFsdWU6IGVsZW1lbnRCb3R0b20sIGRpc3RhbmNlOiB0YXJnZXQueSAtIGVsZW1lbnRCb3R0b20gfSwgLy8gQm90dG9tIGVkZ2VcbiAgICAgICAgeyB2YWx1ZTogZWxlbWVudC5ncmF2aXR5Q2VudGVyLnksIGRpc3RhbmNlOiB0YXJnZXRDZW50ZXJZIC0gZWxlbWVudC5ncmF2aXR5Q2VudGVyLnkgfSwgLy8gQ2VudGVyXG4gICAgICAgIHsgdmFsdWU6IGVsZW1lbnQueSwgZGlzdGFuY2U6ICh0YXJnZXQueSArIHRhcmdldC5oZWlnaHQpIC0gZWxlbWVudC55IH0sIC8vIEJvdHRvbSB0byB0b3BcbiAgICAgICAgeyB2YWx1ZTogZWxlbWVudEJvdHRvbSwgZGlzdGFuY2U6ICh0YXJnZXQueSArIHRhcmdldC5oZWlnaHQpIC0gZWxlbWVudEJvdHRvbSB9LCAvLyBCb3R0b20gdG8gYm90dG9tXG4gICAgICBdLFxuICAgIH07XG5cbiAgICBmb3IgKGNvbnN0IHsgdmFsdWUsIGRpc3RhbmNlIH0gb2YgZWxlbWVudERpc3RhbmNlcy54KSB7XG4gICAgICBpZiAoTWF0aC5hYnMoZGlzdGFuY2UpIDw9IGFsaWduVGhyZXNob2xkKSB7XG4gICAgICAgIGlmIChtaW5EaXN0YW5jZVggPT09IHVuZGVmaW5lZCB8fCBNYXRoLmFicyhkaXN0YW5jZSkgPCBNYXRoLmFicyhtaW5EaXN0YW5jZVgpKSB7XG4gICAgICAgICAgbWluRGlzdGFuY2VYID0gZGlzdGFuY2U7XG4gICAgICAgICAgbmVhcmVzdFggPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgeyB2YWx1ZSwgZGlzdGFuY2UgfSBvZiBlbGVtZW50RGlzdGFuY2VzLnkpIHtcbiAgICAgIGlmIChNYXRoLmFicyhkaXN0YW5jZSkgPD0gYWxpZ25UaHJlc2hvbGQpIHtcbiAgICAgICAgaWYgKG1pbkRpc3RhbmNlWSA9PT0gdW5kZWZpbmVkIHx8IE1hdGguYWJzKGRpc3RhbmNlKSA8IE1hdGguYWJzKG1pbkRpc3RhbmNlWSkpIHtcbiAgICAgICAgICBtaW5EaXN0YW5jZVkgPSBkaXN0YW5jZTtcbiAgICAgICAgICBuZWFyZXN0WSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB4UmVzdWx0OiB7IHZhbHVlOiBuZWFyZXN0WCwgZGlzdGFuY2U6IG1pbkRpc3RhbmNlWCB9LFxuICAgIHlSZXN1bHQ6IHsgdmFsdWU6IG5lYXJlc3RZLCBkaXN0YW5jZTogbWluRGlzdGFuY2VZIH0sXG4gIH07XG59XG4iXX0=