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