@techmely/utils
Version:
Collection of helpful JavaScript / TypeScript utils
117 lines (112 loc) • 2.28 kB
JavaScript
/*!
* @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
};