UNPKG

@foblex/2d

Version:

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

35 lines 5.98 kB
import { PointExtensions } from '../point'; export class VectorExtensions { static initialize(x = 0, y = 0) { return PointExtensions.initialize(x, y); } static fromPoints(p1, p2) { return VectorExtensions.initialize(p2.x - p1.x, p2.y - p1.y); } static vectorLength(v) { return Math.sqrt(VectorExtensions.magnitudeSquared(v)); } static magnitudeSquared(v) { return v.x * v.x + v.y * v.y; } static dotProduct(v1, v2) { return v1.x * v2.x + v1.y * v2.y; } static crossProduct(v1, v2) { return v1.x * v2.y - v1.y * v2.x; } static subtract(v1, v2) { return VectorExtensions.initialize(v1.x - v2.x, v1.y - v2.y); } static add(v1, v2) { return VectorExtensions.initialize(v1.x + v2.x, v1.y + v2.y); } static scale(v, value) { return VectorExtensions.initialize(v.x * value, v.y * value); } static angle(v1, v2) { const radians = Math.acos(Math.max(-1, Math.min(VectorExtensions.dotProduct(v1, v2) / (VectorExtensions.vectorLength(v1) * VectorExtensions.vectorLength(v2)), 1))); return (VectorExtensions.crossProduct(v1, v2) < 0.0) ? -radians : radians; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVjdG9yLmV4dGVuc2lvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9mb2JsZXgyZC9zcmMvdmVjdG9yL3ZlY3Rvci5leHRlbnNpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBVSxlQUFlLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFbkQsTUFBTSxPQUFPLGdCQUFnQjtJQUVwQixNQUFNLENBQUMsVUFBVSxDQUFDLElBQVksQ0FBQyxFQUFFLElBQVksQ0FBQztRQUNuRCxPQUFPLGVBQWUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFTSxNQUFNLENBQUMsVUFBVSxDQUFDLEVBQVUsRUFBRSxFQUFVO1FBQzdDLE9BQU8sZ0JBQWdCLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRU0sTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFVO1FBQ25DLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFTSxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBVTtRQUN2QyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVNLE1BQU0sQ0FBQyxVQUFVLENBQUMsRUFBVyxFQUFFLEVBQVc7UUFDL0MsT0FBTyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFTSxNQUFNLENBQUMsWUFBWSxDQUFDLEVBQVcsRUFBRSxFQUFXO1FBQ2pELE9BQU8sRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRU0sTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFXLEVBQUUsRUFBVztRQUM3QyxPQUFPLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVNLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBVyxFQUFFLEVBQVc7UUFDeEMsT0FBTyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFFTSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQVUsRUFBRSxLQUFhO1FBQzNDLE9BQU8sZ0JBQWdCLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVNLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBVyxFQUFFLEVBQVc7UUFDMUMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEssT0FBTyxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7SUFDNUUsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSVZlY3RvciB9IGZyb20gJy4vaS12ZWN0b3InO1xuaW1wb3J0IHsgSVBvaW50LCBQb2ludEV4dGVuc2lvbnMgfSBmcm9tICcuLi9wb2ludCc7XG5cbmV4cG9ydCBjbGFzcyBWZWN0b3JFeHRlbnNpb25zIHtcblxuICBwdWJsaWMgc3RhdGljIGluaXRpYWxpemUoeDogbnVtYmVyID0gMCwgeTogbnVtYmVyID0gMCk6IElWZWN0b3Ige1xuICAgIHJldHVybiBQb2ludEV4dGVuc2lvbnMuaW5pdGlhbGl6ZSh4LCB5KTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVBvaW50cyhwMTogSVBvaW50LCBwMjogSVBvaW50KTogSVZlY3RvciB7XG4gICAgcmV0dXJuIFZlY3RvckV4dGVuc2lvbnMuaW5pdGlhbGl6ZShwMi54IC0gcDEueCwgcDIueSAtIHAxLnkpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyB2ZWN0b3JMZW5ndGgodjogSVZlY3Rvcik6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGguc3FydChWZWN0b3JFeHRlbnNpb25zLm1hZ25pdHVkZVNxdWFyZWQodikpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBtYWduaXR1ZGVTcXVhcmVkKHY6IElWZWN0b3IpOiBudW1iZXIge1xuICAgIHJldHVybiB2LnggKiB2LnggKyB2LnkgKiB2Lnk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGRvdFByb2R1Y3QodjE6IElWZWN0b3IsIHYyOiBJVmVjdG9yKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdjEueCAqIHYyLnggKyB2MS55ICogdjIueTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgY3Jvc3NQcm9kdWN0KHYxOiBJVmVjdG9yLCB2MjogSVZlY3Rvcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHYxLnggKiB2Mi55IC0gdjEueSAqIHYyLng7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHN1YnRyYWN0KHYxOiBJVmVjdG9yLCB2MjogSVZlY3Rvcik6IElWZWN0b3Ige1xuICAgIHJldHVybiBWZWN0b3JFeHRlbnNpb25zLmluaXRpYWxpemUodjEueCAtIHYyLngsIHYxLnkgLSB2Mi55KTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgYWRkKHYxOiBJVmVjdG9yLCB2MjogSVZlY3Rvcik6IElWZWN0b3Ige1xuICAgIHJldHVybiBWZWN0b3JFeHRlbnNpb25zLmluaXRpYWxpemUodjEueCArIHYyLngsIHYxLnkgKyB2Mi55KTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgc2NhbGUodjogSVZlY3RvciwgdmFsdWU6IG51bWJlcik6IElWZWN0b3Ige1xuICAgIHJldHVybiBWZWN0b3JFeHRlbnNpb25zLmluaXRpYWxpemUodi54ICogdmFsdWUsIHYueSAqIHZhbHVlKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgYW5nbGUodjE6IElWZWN0b3IsIHYyOiBJVmVjdG9yKTogbnVtYmVyIHtcbiAgICBjb25zdCByYWRpYW5zID0gTWF0aC5hY29zKE1hdGgubWF4KC0xLCBNYXRoLm1pbihWZWN0b3JFeHRlbnNpb25zLmRvdFByb2R1Y3QodjEsIHYyKSAvIChWZWN0b3JFeHRlbnNpb25zLnZlY3Rvckxlbmd0aCh2MSkgKiBWZWN0b3JFeHRlbnNpb25zLnZlY3Rvckxlbmd0aCh2MikpLCAxKSkpO1xuICAgIHJldHVybiAoVmVjdG9yRXh0ZW5zaW9ucy5jcm9zc1Byb2R1Y3QodjEsIHYyKSA8IDAuMCkgPyAtcmFkaWFucyA6IHJhZGlhbnM7XG4gIH1cbn1cbiJdfQ==