UNPKG

@techmely/utils

Version:

Collection of helpful JavaScript / TypeScript utils

117 lines (112 loc) 2.28 kB
/*! * @techmely/utils * Copyright(c) 2021-2024 Techmely <techmely.creation@gmail.com> * MIT Licensed */ import { isArray } from "./chunk-BD32CMSL.mjs"; import { clamp, lerp } from "./chunk-DNS23JKA.mjs"; // src/vector.ts function neg(A) { return [-A[0], -A[1]]; } function add(A, B) { return [A[0] + B[0], A[1] + B[1]]; } function sub(A, B) { return [A[0] - B[0], A[1] - B[1]]; } function vec(A, B) { return [B[0] - A[0], B[1] - A[1]]; } function mul(A, n) { return [A[0] * n, A[1] * n]; } function div(A, n) { return [A[0] / n, A[1] / n]; } function per(A) { return [A[1], -A[0]]; } function dpr(A, B) { return A[0] * B[0] + A[1] * B[1]; } function len(A) { return Math.hypot(A[0], A[1]); } function len2(A) { return A[0] * A[0] + A[1] * A[1]; } function dist2(A, B) { return len2(sub(A, B)); } function uni(A) { return div(A, len(A)); } function dist(A, B) { return Math.hypot(A[1] - B[1], A[0] - B[0]); } function med(A, B) { return mul(add(A, B), 0.5); } function rotAround(A, C, r) { const s = Math.sin(r); const c = Math.cos(r); const px = A[0] - C[0]; const py = A[1] - C[1]; const nx = px * c - py * s; const ny = px * s + py * c; return [nx + C[0], ny + C[1]]; } function lrp(A, B, t) { return add(A, mul(vec(A, B), t)); } function isLeft(p1, pc, p2) { return (pc[0] - p1[0]) * (p2[1] - p1[1]) - (p2[0] - p1[0]) * (pc[1] - p1[1]); } function clockwise(p1, pc, p2) { return isLeft(p1, pc, p2) > 0; } function isEqual(a, b) { return a[0] === b[0] && a[1] === b[1]; } function toPointsArray(points) { if (isArray(points[0])) { return points.map(([x, y, pressure = 0.5]) => [x, y, pressure]); } return points.map(({ x, y, pressure = 0.5 }) => [x, y, pressure]); } function getStrokeRadius(size, thinning, easing, pressure = 0.5) { if (!thinning) { return size / 2; } const newPressure = clamp(easing(pressure), 0, 1); return (thinning < 0 ? lerp(size, size + size * clamp(thinning, -0.95, -0.05), newPressure) : lerp(size - size * clamp(thinning, 0.05, 0.95), size, newPressure)) / 2; } export { neg, add, sub, vec, mul, div, per, dpr, len, len2, dist2, uni, dist, med, rotAround, lrp, isLeft, clockwise, isEqual, toPointsArray, getStrokeRadius };