curvy 2.0.0-alpha.13 → 2.0.0-alpha.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/dist/characteristic/index.mjs +1 -1
  2. package/dist/curve/cubic2d.d.ts +102 -3
  3. package/dist/curve/curve2d.d.ts +81 -0
  4. package/dist/curve/index.mjs +1 -1
  5. package/dist/curve/linear2d.d.ts +122 -3
  6. package/dist/curve/quadratic2d.d.ts +103 -3
  7. package/dist/curve/rationalCubic2d.d.ts +100 -38
  8. package/dist/interval/index.mjs +2 -2
  9. package/dist/matrix/index.mjs +47 -1
  10. package/dist/matrix/index.mjs.map +1 -1
  11. package/dist/matrix/matrix3x3.d.ts +87 -1
  12. package/dist/matrix/matrix4x4.d.ts +57 -6
  13. package/dist/matrix/traits.d.ts +34 -0
  14. package/dist/monotonicity/index.mjs +1 -1
  15. package/dist/monotonicity/monotonicity.d.ts +25 -0
  16. package/dist/number.d.ts +53 -0
  17. package/dist/number.mjs +56 -1
  18. package/dist/number.mjs.map +1 -1
  19. package/dist/path/cubic2d.d.ts +22 -0
  20. package/dist/path/index.mjs +25 -149
  21. package/dist/path/index.mjs.map +1 -1
  22. package/dist/path/linear2d.d.ts +24 -0
  23. package/dist/path/path2d.d.ts +54 -0
  24. package/dist/path/quadratic2d.d.ts +22 -0
  25. package/dist/path/rationalCubic2d.d.ts +21 -0
  26. package/dist/polynomial/index.mjs +2 -2
  27. package/dist/shared/affine2d-Dvna84gc.mjs +332 -0
  28. package/dist/shared/affine2d-Dvna84gc.mjs.map +1 -0
  29. package/dist/shared/{characteristic-BkEr-rr8.mjs → characteristic--7nC4Q_a.mjs} +4 -5
  30. package/dist/shared/characteristic--7nC4Q_a.mjs.map +1 -0
  31. package/dist/shared/{cubic-BL6dpuHh.mjs → cubic-BiGuAnZ0.mjs} +56 -27
  32. package/dist/shared/cubic-BiGuAnZ0.mjs.map +1 -0
  33. package/dist/shared/{interval-Dm35Xhy4.mjs → interval-Dcqpo73t.mjs} +5 -5
  34. package/dist/shared/interval-Dcqpo73t.mjs.map +1 -0
  35. package/dist/shared/{interval2d-AtneyI45.mjs → interval2d-C2Pk66-2.mjs} +3 -3
  36. package/dist/shared/{interval2d-AtneyI45.mjs.map → interval2d-C2Pk66-2.mjs.map} +1 -1
  37. package/dist/shared/matrix3x3.internal-Cod-r7H3.mjs +233 -0
  38. package/dist/shared/matrix3x3.internal-Cod-r7H3.mjs.map +1 -0
  39. package/dist/shared/{matrix4x4-BWmf4lZM.mjs → matrix4x4-BrqgYZCD.mjs} +72 -223
  40. package/dist/shared/matrix4x4-BrqgYZCD.mjs.map +1 -0
  41. package/dist/shared/monotonicity-DNxBoC7F.mjs +64 -0
  42. package/dist/shared/monotonicity-DNxBoC7F.mjs.map +1 -0
  43. package/dist/shared/{quadratic-DPrUsFCp.mjs → quadratic-BmMqkvxx.mjs} +2 -2
  44. package/dist/shared/{quadratic-DPrUsFCp.mjs.map → quadratic-BmMqkvxx.mjs.map} +1 -1
  45. package/dist/shared/{rationalCubic2d-CeHgpNht.mjs → rationalCubic2d-CZSwwKtS.mjs} +591 -125
  46. package/dist/shared/rationalCubic2d-CZSwwKtS.mjs.map +1 -0
  47. package/dist/shared/{rationalCubic2d-H1J2Fjyy.mjs → rationalCubic2d-bveuGqBZ.mjs} +282 -326
  48. package/dist/shared/rationalCubic2d-bveuGqBZ.mjs.map +1 -0
  49. package/dist/shared/{solution-B2JdOZpe.mjs → solution-BW0BBMXI.mjs} +22 -6
  50. package/dist/shared/solution-BW0BBMXI.mjs.map +1 -0
  51. package/dist/shared/{vector2-CSkaMXvp.mjs → vector2-DuA3EmfL.mjs} +5 -3
  52. package/dist/shared/vector2-DuA3EmfL.mjs.map +1 -0
  53. package/dist/shared/{vector2.internal-DP1nTBdS.mjs → vector2.internal-rPnW0RCx.mjs} +10 -5
  54. package/dist/shared/vector2.internal-rPnW0RCx.mjs.map +1 -0
  55. package/dist/shared/{vector3-CR2LPV03.mjs → vector3-oxtggkDp.mjs} +2 -2
  56. package/dist/shared/{vector3-CR2LPV03.mjs.map → vector3-oxtggkDp.mjs.map} +1 -1
  57. package/dist/shared/vector3.internal-CfWHl9SG.mjs +135 -0
  58. package/dist/shared/vector3.internal-CfWHl9SG.mjs.map +1 -0
  59. package/dist/shared/{vector4-PO_7EYd-.mjs → vector4-DGHuCvTV.mjs} +2 -2
  60. package/dist/shared/{vector4-PO_7EYd-.mjs.map → vector4-DGHuCvTV.mjs.map} +1 -1
  61. package/dist/shared/vector4.internal-DH5DzNYO.mjs +116 -0
  62. package/dist/shared/vector4.internal-DH5DzNYO.mjs.map +1 -0
  63. package/dist/solution/index.mjs +1 -1
  64. package/dist/solution/solution.d.ts +16 -0
  65. package/dist/splines/basis2d.d.ts +64 -0
  66. package/dist/splines/bezier2d.d.ts +72 -0
  67. package/dist/splines/cardinal2d.d.ts +78 -0
  68. package/dist/splines/hermite2d.d.ts +76 -0
  69. package/dist/splines/index.mjs +109 -15
  70. package/dist/splines/index.mjs.map +1 -1
  71. package/dist/splines/linear2d.d.ts +65 -0
  72. package/dist/splines/rationalBezier2d.d.ts +76 -0
  73. package/dist/transform/affine2d.d.ts +339 -0
  74. package/dist/transform/affine2d.internal.d.ts +2 -0
  75. package/dist/transform/index.d.ts +3 -0
  76. package/dist/transform/index.mjs +2 -0
  77. package/dist/transform/traits.d.ts +19 -0
  78. package/dist/vector/index.mjs +3 -3
  79. package/dist/vector/vector2.d.ts +49 -0
  80. package/package.json +5 -1
  81. package/dist/shared/characteristic-BkEr-rr8.mjs.map +0 -1
  82. package/dist/shared/cubic-BL6dpuHh.mjs.map +0 -1
  83. package/dist/shared/interval-Dm35Xhy4.mjs.map +0 -1
  84. package/dist/shared/matrix4x4-BWmf4lZM.mjs.map +0 -1
  85. package/dist/shared/monotonicity-BdebFOtv.mjs +0 -34
  86. package/dist/shared/monotonicity-BdebFOtv.mjs.map +0 -1
  87. package/dist/shared/rationalCubic2d-CeHgpNht.mjs.map +0 -1
  88. package/dist/shared/rationalCubic2d-H1J2Fjyy.mjs.map +0 -1
  89. package/dist/shared/solution-B2JdOZpe.mjs.map +0 -1
  90. package/dist/shared/vector2-CSkaMXvp.mjs.map +0 -1
  91. package/dist/shared/vector2.internal-DP1nTBdS.mjs.map +0 -1
  92. package/dist/shared/vector4.internal-BJ1QN2Ck.mjs +0 -246
  93. package/dist/shared/vector4.internal-BJ1QN2Ck.mjs.map +0 -1
@@ -0,0 +1,135 @@
1
+ import { Pipeable, dual } from "../utils.mjs";
2
+ import { coincident } from "../number.mjs";
3
+ //#region src/vector/vector3.internal.ts
4
+ const Vector3TypeId = Symbol.for("curvy/vector3");
5
+ var Vector3Impl = class extends Pipeable {
6
+ [Vector3TypeId] = Vector3TypeId;
7
+ x;
8
+ y;
9
+ z;
10
+ constructor(v0 = 0, v1 = 0, v2 = 0) {
11
+ super();
12
+ this.x = v0;
13
+ this.y = v1;
14
+ this.z = v2;
15
+ }
16
+ get [0]() {
17
+ return this.x;
18
+ }
19
+ get [1]() {
20
+ return this.y;
21
+ }
22
+ get [2]() {
23
+ return this.z;
24
+ }
25
+ get [Symbol.toStringTag]() {
26
+ return `Vector3(${this.x}, ${this.y}, ${this.z})`;
27
+ }
28
+ get [Symbol.for("nodejs.util.inspect.custom")]() {
29
+ return this[Symbol.toStringTag];
30
+ }
31
+ };
32
+ /** @internal */
33
+ const isVector3 = (v) => typeof v === "object" && v !== null && Vector3TypeId in v;
34
+ /** @internal */
35
+ const equals = dual(2, (a, b) => coincident(a.x, b.x) && coincident(a.y, b.y) && coincident(a.z, b.z));
36
+ /** @internal */
37
+ const make = (v0, v1 = v0, v2 = v1) => new Vector3Impl(v0, v1, v2);
38
+ /** @internal */
39
+ const fromTuple = (t) => new Vector3Impl(t[0], t[1], t[2]);
40
+ /** @internal */
41
+ const transpose = (inputs, project) => {
42
+ const a = project(inputs[0]);
43
+ const b = project(inputs[1]);
44
+ const c = project(inputs[2]);
45
+ const result = [];
46
+ for (let i = 0; i < a.length; i++) result.push(make(a[i], b[i], c[i]));
47
+ return result;
48
+ };
49
+ /** @internal */
50
+ const fromSpherical = (r, theta, phi) => new Vector3Impl(r * Math.sin(theta) * Math.cos(phi), r * Math.sin(theta) * Math.sin(phi), r * Math.cos(theta));
51
+ /** @internal */
52
+ const magnitude = (vector) => Math.hypot(vector.x, vector.y, vector.z);
53
+ /** @internal */
54
+ const normalize = (vector) => {
55
+ const m = magnitude(vector);
56
+ return make(vector.x / m, vector.y / m, vector.z / m);
57
+ };
58
+ /** @internal */
59
+ const dot = dual(2, (a, b) => a.x * b.x + a.y * b.y + a.z * b.z);
60
+ /** @internal */
61
+ const cross = dual(2, (a, b) => {
62
+ return make(a.y * b.z - a.z * b.y, a.z * b.x - a.x * b.z, a.x * b.y - a.y * b.x);
63
+ });
64
+ /** @internal */
65
+ const components = (v) => [
66
+ v.x,
67
+ v.y,
68
+ v.z
69
+ ];
70
+ /** @internal */
71
+ const softmax = (v) => {
72
+ const max = Math.max(v.x, v.y, v.z);
73
+ const v0 = Math.exp(v.x - max);
74
+ const v1 = Math.exp(v.y - max);
75
+ const v2 = Math.exp(v.z - max);
76
+ const sum = v0 + v1 + v2;
77
+ return make(v0 / sum, v1 / sum, v2 / sum);
78
+ };
79
+ /** @internal */
80
+ const add = dual(2, (a, b) => make(a.x + b.x, a.y + b.y, a.z + b.z));
81
+ /** @internal */
82
+ const subtract = dual(2, (a, b) => make(a.x - b.x, a.y - b.y, a.z - b.z));
83
+ /** @internal */
84
+ const hadamard = dual(2, (a, b) => make(a.x * b.x, a.y * b.y, a.z * b.z));
85
+ /** @internal */
86
+ const scale = dual(2, (v, s) => s === 1 ? v : make(v.x * s, v.y * s, v.z * s));
87
+ /** @internal */
88
+ const getX = (v) => v.x;
89
+ /** @internal */
90
+ const setX = dual(2, (v, x) => make(x, v.y, v.z));
91
+ /** @internal */
92
+ const mapX = dual(2, (v, f) => make(f(v.x), v.y, v.z));
93
+ /** @internal */
94
+ const getY = (v) => v.y;
95
+ /** @internal */
96
+ const setY = dual(2, (v, y) => make(v.x, y, v.z));
97
+ /** @internal */
98
+ const mapY = dual(2, (v, f) => make(v.x, f(v.y), v.z));
99
+ /** @internal */
100
+ const getZ = (v) => v.z;
101
+ /** @internal */
102
+ const setZ = dual(2, (v, z) => make(v.x, v.y, z));
103
+ /** @internal */
104
+ const mapZ = dual(2, (v, f) => make(v.x, v.y, f(v.z)));
105
+ /** @internal */
106
+ const setR = dual(2, (v, r) => scale(r / magnitude(v))(v));
107
+ /** @internal */
108
+ const mapR = dual(2, (v, f) => {
109
+ const r = magnitude(v);
110
+ return scale(f(r) / r)(v);
111
+ });
112
+ /** @internal */
113
+ const getTheta = (v) => Math.acos(v.z / magnitude(v));
114
+ /** @internal */
115
+ const setTheta = dual(2, (v, theta) => {
116
+ const r = magnitude(v);
117
+ const phi = Math.atan2(v.y, v.x);
118
+ const sinTheta = Math.sin(theta);
119
+ return make(r * sinTheta * Math.cos(phi), r * sinTheta * Math.sin(phi), r * Math.cos(theta));
120
+ });
121
+ /** @internal */
122
+ const mapTheta = dual(2, (v, f) => setTheta(v, f(getTheta(v))));
123
+ /** @internal */
124
+ const getPhi = (v) => Math.atan2(v.y, v.x);
125
+ /** @internal */
126
+ const setPhi = dual(2, (v, phi) => {
127
+ const rho = Math.hypot(v.x, v.y);
128
+ return make(rho * Math.cos(phi), rho * Math.sin(phi), v.z);
129
+ });
130
+ /** @internal */
131
+ const mapPhi = dual(2, (v, f) => setPhi(v, f(getPhi(v))));
132
+ //#endregion
133
+ export { setZ as A, normalize as C, setTheta as D, setR as E, subtract as M, transpose as N, setX as O, mapZ as S, setPhi as T, mapPhi as _, equals as a, mapX as b, getPhi as c, getY as d, getZ as f, make as g, magnitude as h, dot as i, softmax as j, setY as k, getTheta as l, isVector3 as m, components as n, fromSpherical as o, hadamard as p, cross as r, fromTuple as s, add as t, getX as u, mapR as v, scale as w, mapY as x, mapTheta as y };
134
+
135
+ //# sourceMappingURL=vector3.internal-CfWHl9SG.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vector3.internal-CfWHl9SG.mjs","names":[],"sources":["../../src/vector/vector3.internal.ts"],"sourcesContent":["import { dual, Pipeable } from '../utils.ts'\nimport { coincident } from '../number.ts'\nimport type { Vector3 } from './vector3.ts'\n\nexport const Vector3TypeId: unique symbol = Symbol.for('curvy/vector3')\nexport type Vector3TypeId = typeof Vector3TypeId\n\nclass Vector3Impl extends Pipeable implements Vector3 {\n readonly [Vector3TypeId]: Vector3TypeId = Vector3TypeId\n\n readonly x: number\n readonly y: number\n readonly z: number\n\n constructor(v0 = 0, v1 = 0, v2 = 0) {\n super()\n this.x = v0\n this.y = v1\n this.z = v2\n }\n\n get [0]() {\n return this.x\n }\n\n get [1]() {\n return this.y\n }\n\n get [2]() {\n return this.z\n }\n\n get [Symbol.toStringTag]() {\n return `Vector3(${this.x}, ${this.y}, ${this.z})`\n }\n\n get [Symbol.for('nodejs.util.inspect.custom')]() {\n return this[Symbol.toStringTag]\n }\n}\n\n/** @internal */\nexport const isVector3 = (v: unknown): v is Vector3 =>\n typeof v === 'object' && v !== null && Vector3TypeId in v\n\n/** @internal */\nexport const equals = dual<\n (b: Vector3) => (a: Vector3) => boolean,\n (a: Vector3, b: Vector3) => boolean\n>(\n 2,\n (a: Vector3, b: Vector3) => coincident(a.x, b.x) && coincident(a.y, b.y) && coincident(a.z, b.z),\n)\n\n/** @internal */\nexport const make = (v0: number, v1 = v0, v2 = v1): Vector3 => new Vector3Impl(v0, v1, v2)\n\n/** @internal */\nexport const fromTuple = (t: readonly [number, number, number]): Vector3 =>\n new Vector3Impl(t[0], t[1], t[2])\n\n/** @internal */\nexport const transpose = <T, const Channels extends ReadonlyArray<number>>(\n inputs: readonly [T, T, T],\n project: (item: T) => Channels,\n): { readonly [K in keyof Channels]: Vector3 } => {\n const a = project(inputs[0])\n const b = project(inputs[1])\n const c = project(inputs[2])\n const result: Array<Vector3> = []\n for (let i = 0; i < a.length; i++) {\n result.push(make(a[i] as number, b[i] as number, c[i] as number))\n }\n return result as never\n}\n\n/** @internal */\nexport const fromSpherical = (r: number, theta: number, phi: number) =>\n new Vector3Impl(\n r * Math.sin(theta) * Math.cos(phi),\n r * Math.sin(theta) * Math.sin(phi),\n r * Math.cos(theta),\n )\n\n/** @internal */\nexport const magnitude = (vector: Vector3) => Math.hypot(vector.x, vector.y, vector.z)\n\n/** @internal */\nexport const normalize = (vector: Vector3) => {\n const m = magnitude(vector)\n\n return make(vector.x / m, vector.y / m, vector.z / m)\n}\n\n/** @internal */\nexport const dot = dual<(b: Vector3) => (a: Vector3) => number, (a: Vector3, b: Vector3) => number>(\n 2,\n (a: Vector3, b: Vector3) => a.x * b.x + a.y * b.y + a.z * b.z,\n)\n\n/** @internal */\nexport const cross = dual<\n (b: Vector3) => (a: Vector3) => Vector3,\n (a: Vector3, b: Vector3) => Vector3\n>(2, (a: Vector3, b: Vector3) => {\n const x = a.y * b.z - a.z * b.y\n const y = a.z * b.x - a.x * b.z\n const z = a.x * b.y - a.y * b.x\n\n return make(x, y, z)\n})\n\n/** @internal */\nexport const components: (v: Vector3) => [number, number, number] = (v: Vector3) => [v.x, v.y, v.z]\n\n/** @internal */\nexport const softmax = (v: Vector3) => {\n const max = Math.max(v.x, v.y, v.z)\n\n const v0 = Math.exp(v.x - max)\n const v1 = Math.exp(v.y - max)\n const v2 = Math.exp(v.z - max)\n\n const sum = v0 + v1 + v2\n\n return make(v0 / sum, v1 / sum, v2 / sum)\n}\n\n/** @internal */\nexport const add = dual<\n (b: Vector3) => (a: Vector3) => Vector3,\n (a: Vector3, b: Vector3) => Vector3\n>(2, (a: Vector3, b: Vector3) => make(a.x + b.x, a.y + b.y, a.z + b.z))\n\n/** @internal */\nexport const subtract = dual<\n (b: Vector3) => (a: Vector3) => Vector3,\n (a: Vector3, b: Vector3) => Vector3\n>(2, (a: Vector3, b: Vector3) => make(a.x - b.x, a.y - b.y, a.z - b.z))\n\n/** @internal */\nexport const hadamard = dual<\n (b: Vector3) => (a: Vector3) => Vector3,\n (a: Vector3, b: Vector3) => Vector3\n>(2, (a: Vector3, b: Vector3) => make(a.x * b.x, a.y * b.y, a.z * b.z))\n\n/** @internal */\nexport const scale = dual<\n (s: number) => (v: Vector3) => Vector3,\n (v: Vector3, s: number) => Vector3\n>(2, (v: Vector3, s: number) => (s === 1 ? v : make(v.x * s, v.y * s, v.z * s)))\n\n/** @internal */\nexport const getX: (v: Vector3) => number = (v: Vector3) => v.x\n/** @internal */\nexport const setX = dual<\n (x: number) => (v: Vector3) => Vector3,\n (v: Vector3, x: number) => Vector3\n>(2, (v: Vector3, x: number) => make(x, v.y, v.z))\n\n/** @internal */\nexport const mapX = dual<\n (f: (x: number) => number) => (v: Vector3) => Vector3,\n (v: Vector3, f: (x: number) => number) => Vector3\n>(2, (v: Vector3, f: (x: number) => number) => make(f(v.x), v.y, v.z))\n\n/** @internal */\nexport const getY: (v: Vector3) => number = (v: Vector3) => v.y\n/** @internal */\nexport const setY = dual<\n (y: number) => (v: Vector3) => Vector3,\n (v: Vector3, y: number) => Vector3\n>(2, (v: Vector3, y: number) => make(v.x, y, v.z))\n\n/** @internal */\nexport const mapY = dual<\n (f: (y: number) => number) => (v: Vector3) => Vector3,\n (v: Vector3, f: (y: number) => number) => Vector3\n>(2, (v: Vector3, f: (y: number) => number) => make(v.x, f(v.y), v.z))\n\n/** @internal */\nexport const getZ: (v: Vector3) => number = (v: Vector3) => v.z\n/** @internal */\nexport const setZ = dual<\n (z: number) => (v: Vector3) => Vector3,\n (v: Vector3, z: number) => Vector3\n>(2, (v: Vector3, z: number) => make(v.x, v.y, z))\n\n/** @internal */\nexport const mapZ = dual<\n (f: (z: number) => number) => (v: Vector3) => Vector3,\n (v: Vector3, f: (z: number) => number) => Vector3\n>(2, (v: Vector3, f: (z: number) => number) => make(v.x, v.y, f(v.z)))\n\n/** @internal */\nexport const setR = dual<\n (r: number) => (v: Vector3) => Vector3,\n (v: Vector3, r: number) => Vector3\n>(2, (v: Vector3, r: number) => scale(r / magnitude(v))(v))\n\n/** @internal */\nexport const mapR = dual<\n (f: (r: number) => number) => (v: Vector3) => Vector3,\n (v: Vector3, f: (r: number) => number) => Vector3\n>(2, (v: Vector3, f: (r: number) => number) => {\n const r = magnitude(v)\n return scale(f(r) / r)(v)\n})\n\n/** @internal */\nexport const getTheta = (v: Vector3) => Math.acos(v.z / magnitude(v))\n/** @internal */\nexport const setTheta = dual<\n (theta: number) => (v: Vector3) => Vector3,\n (v: Vector3, theta: number) => Vector3\n>(2, (v: Vector3, theta: number) => {\n const r = magnitude(v)\n const phi = Math.atan2(v.y, v.x)\n const sinTheta = Math.sin(theta)\n return make(r * sinTheta * Math.cos(phi), r * sinTheta * Math.sin(phi), r * Math.cos(theta))\n})\n\n/** @internal */\nexport const mapTheta = dual<\n (f: (theta: number) => number) => (v: Vector3) => Vector3,\n (v: Vector3, f: (theta: number) => number) => Vector3\n>(2, (v: Vector3, f: (theta: number) => number) => setTheta(v, f(getTheta(v))))\n\n/** @internal */\nexport const getPhi = (v: Vector3) => Math.atan2(v.y, v.x)\n// setPhi rotates only in the xy plane: preserve z and the xy-projection\n// length ρ = r·sin(θ) = hypot(v.x, v.y). That keeps both r and θ invariant.\n/** @internal */\nexport const setPhi = dual<\n (phi: number) => (v: Vector3) => Vector3,\n (v: Vector3, phi: number) => Vector3\n>(2, (v: Vector3, phi: number) => {\n const rho = Math.hypot(v.x, v.y)\n return make(rho * Math.cos(phi), rho * Math.sin(phi), v.z)\n})\n\n/** @internal */\nexport const mapPhi = dual<\n (f: (phi: number) => number) => (v: Vector3) => Vector3,\n (v: Vector3, f: (phi: number) => number) => Vector3\n>(2, (v: Vector3, f: (phi: number) => number) => setPhi(v, f(getPhi(v))))\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { t as __exportAll } from "./chunk-25Hzd3z8.mjs";
2
- import { C as setZ$1, E as transpose$1, S as setY$1, T as subtract$1, _ as mapZ$1, a as fromTuple$1, b as setW$1, c as getY$1, d as isVector4$1, f as magnitude$1, g as mapY$1, h as mapX$1, i as equals$1, l as getZ$1, m as mapW$1, n as components$1, o as getW$1, p as make$1, r as dot$1, s as getX$1, t as add$1, u as hadamard$1, v as normalize$1, w as softmax$1, x as setX$1, y as scale$1 } from "./vector4.internal-BJ1QN2Ck.mjs";
2
+ import { C as setZ$1, E as transpose$1, S as setY$1, T as subtract$1, _ as mapZ$1, a as fromTuple$1, b as setW$1, c as getY$1, d as isVector4$1, f as magnitude$1, g as mapY$1, h as mapX$1, i as equals$1, l as getZ$1, m as mapW$1, n as components$1, o as getW$1, p as make$1, r as dot$1, s as getX$1, t as add$1, u as hadamard$1, v as normalize$1, w as softmax$1, x as setX$1, y as scale$1 } from "./vector4.internal-DH5DzNYO.mjs";
3
3
  //#region src/vector/vector4.ts
4
4
  var vector4_exports = /* @__PURE__ */ __exportAll({
5
5
  add: () => add,
@@ -168,4 +168,4 @@ const mapW = mapW$1;
168
168
  //#endregion
169
169
  export { transpose as n, vector4_exports as r, make as t };
170
170
 
171
- //# sourceMappingURL=vector4-PO_7EYd-.mjs.map
171
+ //# sourceMappingURL=vector4-DGHuCvTV.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"vector4-PO_7EYd-.mjs","names":["internal.isVector4","internal.equals","internal.make","internal.fromTuple","internal.transpose","internal.magnitude","internal.normalize","internal.dot","internal.components","internal.softmax","internal.add","internal.subtract","internal.hadamard","internal.scale","internal.getX","internal.setX","internal.mapX","internal.getY","internal.setY","internal.mapY","internal.getZ","internal.setZ","internal.mapZ","internal.getW","internal.setW","internal.mapW"],"sources":["../../src/vector/vector4.ts"],"sourcesContent":["import type { FourDimensional } from '../dimensions.ts'\nimport type { Pipeable } from '../utils.ts'\nimport type { Vector4TypeId } from './vector4.internal.ts'\nimport * as internal from './vector4.internal.ts'\n\n/**\n * A 4D vector.\n *\n * All fields are readonly and immutable, and all operations create new instances.\n *\n * @since 1.0.0\n */\nexport interface Vector4 extends Pipeable, FourDimensional<number> {\n readonly [Vector4TypeId]: Vector4TypeId\n}\n\n/**\n * Checks if a value is a `Vector4`.\n *\n * @param v - The value to check.\n * @returns `true` if the value is a `Vector4`, `false` otherwise.\n * @since 1.0.0\n */\nexport const isVector4: (v: unknown) => v is Vector4 = internal.isVector4\n\nexport const equals: {\n /**\n * Checks if two `Vector4` instances are approximately equal within the\n * default absolute tolerance ({@link EPSILON}).\n *\n * @param a - The first vector.\n * @param b - The second vector.\n * @returns `true` when each pair of components is within tolerance.\n * @since 1.1.0\n */\n (a: Vector4, b: Vector4): boolean\n /**\n * Checks if two `Vector4` instances are approximately equal within the\n * default absolute tolerance ({@link EPSILON}).\n *\n * @param b - The second vector.\n * @returns A function that takes the first vector and returns the comparison result.\n * @since 1.1.0\n */\n (b: Vector4): (a: Vector4) => boolean\n} = internal.equals\n\nexport const make: {\n /**\n * Creates a new `Vector4` instance.\n *\n * @param xyzw - The x, y, z, and w components of the vector.\n * @returns A new `Vector4` instance.\n * @since 1.0.0\n */\n (xyzw: number): Vector4\n /**\n * Creates a new `Vector4` instance.\n *\n * @param x - The x component of the vector.\n * @param yzw - The y, z, and w components of the vector.\n * @returns A new `Vector4` instance.\n * @since 1.0.0\n */\n (x: number, yzw: number): Vector4\n /**\n * Creates a new `Vector4` instance.\n *\n * @param x - The x component of the vector.\n * @param y - The y component of the vector.\n * @param zw - The z and w components of the vector.\n * @returns A new `Vector4` instance.\n * @since 1.0.0\n */\n (x: number, y: number, zw: number): Vector4\n /**\n * Creates a new `Vector4` instance.\n *\n * @param x - The x component of the vector.\n * @param y - The y component of the vector.\n * @param z - The z component of the vector.\n * @param w - The w component of the vector.\n * @returns A new `Vector4` instance.\n * @since 1.0.0\n */\n (x: number, y: number, z: number, w: number): Vector4\n} = internal.make\n\n/**\n * Creates a new `Vector4` instance from a `[x, y, z, w]` tuple. Inverse of\n * {@link components}.\n *\n * @param t - The `[x, y, z, w]` tuple.\n * @returns A new `Vector4` instance.\n * @since 2.0.0\n */\nexport const fromTuple: (t: readonly [number, number, number, number]) => Vector4 =\n internal.fromTuple\n\n/**\n * Transposes a 4-tuple of items into one or more `Vector4`s, one per channel\n * extracted by the projection function.\n *\n * For each output channel, takes the corresponding number from each of the\n * four projected items and packs them into a `Vector4` — the data-layout\n * transformation NumPy calls a transpose, FP calls `unzip`, GPUs call a\n * gather, and DSP people inexplicably call deinterleaving.\n *\n * The projection's return-tuple arity determines the number of output\n * vectors, and that arity is preserved in the return type.\n *\n * @example\n * ```ts\n * // Pack the x and y coordinates of four control points into two Vector4s.\n * const [xs, ys] = Vector4.transpose(\n * [p0, p1, p2, p3],\n * (p) => [p.x, p.y],\n * )\n * ```\n *\n * @param inputs - Exactly four items of any type.\n * @param project - A function returning a fixed-arity tuple of numbers — one per output channel.\n * @returns A tuple of `Vector4`s with the same arity as the projection's return tuple.\n * @since 2.0.0\n */\nexport const transpose: <T, const Channels extends ReadonlyArray<number>>(\n inputs: readonly [T, T, T, T],\n project: (item: T) => Channels,\n) => { readonly [K in keyof Channels]: Vector4 } = internal.transpose\n\n/**\n * Gets the magnitude of a `Vector4`.\n *\n * @param vector - The vector to calculate the magnitude of.\n * @returns The magnitude of the vector.\n * @since 1.0.0\n */\nexport const magnitude: (vector: Vector4) => number = internal.magnitude\n\n/**\n * Normalizes a `Vector4`.\n *\n * @param vector - The vector to normalize.\n * @returns A new `Vector4` instance with the same direction as the input vector but with a magnitude of 1.\n * @since 1.0.0\n */\nexport const normalize: (vector: Vector4) => Vector4 = internal.normalize\n\nexport const dot: {\n /**\n * Computes the dot product of two `Vector4` instances.\n *\n * @param a - The first vector.\n * @param b - The second vector.\n * @returns The dot product of the two vectors.\n * @since 1.0.0\n */\n (a: Vector4, b: Vector4): number\n /**\n * Computes the dot product of a `Vector4` instance and another vector.\n *\n * @param b - The second vector.\n * @returns A function that takes the first vector and returns the dot product.\n * @since 1.0.0\n */\n (b: Vector4): (a: Vector4) => number\n} = internal.dot\n\n/**\n * Returns the components of a `Vector4` as an array.\n *\n * @param v - The vector to get the components of.\n * @returns An array containing the x, y, z, and w components of the vector.\n * @since 1.0.0\n */\nexport const components: (v: Vector4) => [number, number, number, number] = internal.components\n\n/**\n * Applies the softmax function to a `Vector4`.\n *\n * @param v - The vector to calculate the softmax of.\n * @returns A new `Vector4` instance representing the softmax of the input vector.\n */\nexport const softmax: (v: Vector4) => Vector4 = internal.softmax\n\n/**\n * Creates a zero vector.\n *\n * @since 1.0.0\n */\nexport const zero = make(0)\n\n/**\n * Creates a unit vector.\n *\n * @since 1.0.0\n */\nexport const unit = make(1)\n\nexport const add: {\n /**\n * Adds two `Vector4` instances.\n *\n * @param a - The first vector.\n * @param b - The second vector.\n * @returns A new `Vector4` instance representing the sum of the two vectors.\n * @since 1.0.0\n */\n (a: Vector4, b: Vector4): Vector4\n\n /**\n * Adds a `Vector4` instance to another vector.\n *\n * @param b - The second vector.\n * @returns A function that takes the first vector and returns the sum.\n * @since 1.0.0\n */\n (b: Vector4): (a: Vector4) => Vector4\n} = internal.add\n\nexport const subtract: {\n /**\n * Subtracts one `Vector4` instance from another.\n *\n * @param a - The first vector.\n * @param b - The second vector.\n * @returns A new `Vector4` instance representing the difference of the two vectors.\n * @since 1.0.0\n */\n (a: Vector4, b: Vector4): Vector4\n /**\n * Subtracts a `Vector4` instance from another vector.\n *\n * @param b - The second vector.\n * @returns A function that takes the first vector and returns the difference.\n * @since 1.0.0\n */\n (b: Vector4): (a: Vector4) => Vector4\n} = internal.subtract\n\nexport const hadamard: {\n /**\n * Computes the Hadamard product of two `Vector4` instances.\n *\n * @param a - The first vector.\n * @param b - The second vector.\n * @returns A new `Vector4` instance representing the Hadamard product of the two vectors.\n * @since 1.0.0\n */\n (a: Vector4, b: Vector4): Vector4\n /**\n * Computes the Hadamard product of a `Vector4` instance and another vector.\n *\n * @param b - The second vector.\n * @returns A function that takes the first vector and returns the Hadamard product.\n * @since 1.0.0\n */\n (b: Vector4): (a: Vector4) => Vector4\n} = internal.hadamard\n\nexport const scale: {\n /**\n * Scales a `Vector4` by a scalar.\n *\n * @param s - The scalar to scale the vector by.\n * @returns A function that takes the vector and returns the scaled vector.\n * @since 1.0.0\n */\n (s: number): (v: Vector4) => Vector4\n /**\n * Scales a `Vector4` by a scalar.\n *\n * @param s - The scalar to scale the vector by.\n * @param v - The vector to scale.\n * @returns A new `Vector4` instance representing the scaled vector.\n * @since 1.0.0\n */\n (v: Vector4, s: number): Vector4\n} = internal.scale\n\n/**\n * Gets the x component of a `Vector4`.\n *\n * @param v - The vector to get the x component of.\n * @returns The x component of the vector.\n * @since 2.0.0\n */\nexport const getX: (v: Vector4) => number = internal.getX\n\nexport const setX: {\n /**\n * Sets the x component of a `Vector4`.\n *\n * @param v - The vector to set the x component of.\n * @param x - The new x component.\n * @returns A new `Vector4` instance with the updated x component.\n * @since 2.0.0\n */\n (v: Vector4, x: number): Vector4\n /**\n * Sets the x component of a `Vector4`.\n *\n * @param x - The new x component.\n * @returns A function that takes a vector and returns the updated vector.\n * @since 2.0.0\n */\n (x: number): (v: Vector4) => Vector4\n} = internal.setX\n\nexport const mapX: {\n /**\n * Returns a new `Vector4` with the x component replaced by `f(v.x)`.\n *\n * @param v - The vector to update.\n * @param f - The function to apply to the x component.\n * @returns A new `Vector4` with the updated x.\n * @since 2.0.0\n */\n (v: Vector4, f: (x: number) => number): Vector4\n /**\n * Returns a new `Vector4` with the x component replaced by `f(v.x)`.\n *\n * @param f - The function to apply to the x component.\n * @returns A function that takes a vector and returns the updated vector.\n * @since 2.0.0\n */\n (f: (x: number) => number): (v: Vector4) => Vector4\n} = internal.mapX\n\n/**\n * Gets the y component of a `Vector4`.\n *\n * @param v - The vector to get the y component of.\n * @returns The y component of the vector.\n * @since 2.0.0\n */\nexport const getY: (v: Vector4) => number = internal.getY\n\nexport const setY: {\n /**\n * Sets the y component of a `Vector4`.\n *\n * @param v - The vector to set the y component of.\n * @param y - The new y component.\n * @returns A new `Vector4` instance with the updated y component.\n * @since 2.0.0\n */\n (v: Vector4, y: number): Vector4\n /**\n * Sets the y component of a `Vector4`.\n *\n * @param y - The new y component.\n * @returns A function that takes a vector and returns the updated vector.\n * @since 2.0.0\n */\n (y: number): (v: Vector4) => Vector4\n} = internal.setY\n\nexport const mapY: {\n /**\n * Returns a new `Vector4` with the y component replaced by `f(v.y)`.\n *\n * @param v - The vector to update.\n * @param f - The function to apply to the y component.\n * @returns A new `Vector4` with the updated y.\n * @since 2.0.0\n */\n (v: Vector4, f: (y: number) => number): Vector4\n /**\n * Returns a new `Vector4` with the y component replaced by `f(v.y)`.\n *\n * @param f - The function to apply to the y component.\n * @returns A function that takes a vector and returns the updated vector.\n * @since 2.0.0\n */\n (f: (y: number) => number): (v: Vector4) => Vector4\n} = internal.mapY\n\n/**\n * Gets the z component of a `Vector4`.\n *\n * @param v - The vector to get the z component of.\n * @returns The z component of the vector.\n * @since 2.0.0\n */\nexport const getZ: (v: Vector4) => number = internal.getZ\n\nexport const setZ: {\n /**\n * Sets the z component of a `Vector4`.\n *\n * @param v - The vector to set the z component of.\n * @param z - The new z component.\n * @returns A new `Vector4` instance with the updated z component.\n * @since 2.0.0\n */\n (v: Vector4, z: number): Vector4\n /**\n * Sets the z component of a `Vector4`.\n *\n * @param z - The new z component.\n * @returns A function that takes a vector and returns the updated vector.\n * @since 2.0.0\n */\n (z: number): (v: Vector4) => Vector4\n} = internal.setZ\n\nexport const mapZ: {\n /**\n * Returns a new `Vector4` with the z component replaced by `f(v.z)`.\n *\n * @param v - The vector to update.\n * @param f - The function to apply to the z component.\n * @returns A new `Vector4` with the updated z.\n * @since 2.0.0\n */\n (v: Vector4, f: (z: number) => number): Vector4\n /**\n * Returns a new `Vector4` with the z component replaced by `f(v.z)`.\n *\n * @param f - The function to apply to the z component.\n * @returns A function that takes a vector and returns the updated vector.\n * @since 2.0.0\n */\n (f: (z: number) => number): (v: Vector4) => Vector4\n} = internal.mapZ\n\n/**\n * Gets the w component of a `Vector4`.\n *\n * @param v - The vector to get the w component of.\n * @returns The w component of the vector.\n * @since 2.0.0\n */\nexport const getW: (v: Vector4) => number = internal.getW\n\nexport const setW: {\n /**\n * Sets the w component of a `Vector4`.\n *\n * @param v - The vector to set the w component of.\n * @param w - The new w component.\n * @returns A new `Vector4` instance with the updated w component.\n * @since 2.0.0\n */\n (v: Vector4, w: number): Vector4\n /**\n * Sets the w component of a `Vector4`.\n *\n * @param w - The new w component.\n * @returns A function that takes a vector and returns the updated vector.\n * @since 2.0.0\n */\n (w: number): (v: Vector4) => Vector4\n} = internal.setW\n\nexport const mapW: {\n /**\n * Returns a new `Vector4` with the w component replaced by `f(v.w)`.\n *\n * @param v - The vector to update.\n * @param f - The function to apply to the w component.\n * @returns A new `Vector4` with the updated w.\n * @since 2.0.0\n */\n (v: Vector4, f: (w: number) => number): Vector4\n /**\n * Returns a new `Vector4` with the w component replaced by `f(v.w)`.\n *\n * @param f - The function to apply to the w component.\n * @returns A function that takes a vector and returns the updated vector.\n * @since 2.0.0\n */\n (f: (w: number) => number): (v: Vector4) => Vector4\n} = internal.mapW\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuBA,MAAa,YAA0CA;AAEvD,MAAa,SAoBTC;AAEJ,MAAa,OAuCTC;;;;;;;;;AAUJ,MAAa,YACXC;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BF,MAAa,YAGsCC;;;;;;;;AASnD,MAAa,YAAyCC;;;;;;;;AAStD,MAAa,YAA0CC;AAEvD,MAAa,MAkBTC;;;;;;;;AASJ,MAAa,aAA+DC;;;;;;;AAQ5E,MAAa,UAAmCC;;;;;;AAOhD,MAAa,OAAO,KAAK,EAAE;;;;;;AAO3B,MAAa,OAAO,KAAK,EAAE;AAE3B,MAAa,MAmBTC;AAEJ,MAAa,WAkBTC;AAEJ,MAAa,WAkBTC;AAEJ,MAAa,QAkBTC;;;;;;;;AASJ,MAAa,OAA+BC;AAE5C,MAAa,OAkBTC;AAEJ,MAAa,OAkBTC;;;;;;;;AASJ,MAAa,OAA+BC;AAE5C,MAAa,OAkBTC;AAEJ,MAAa,OAkBTC;;;;;;;;AASJ,MAAa,OAA+BC;AAE5C,MAAa,OAkBTC;AAEJ,MAAa,OAkBTC;;;;;;;;AASJ,MAAa,OAA+BC;AAE5C,MAAa,OAkBTC;AAEJ,MAAa,OAkBTC"}
1
+ {"version":3,"file":"vector4-DGHuCvTV.mjs","names":["internal.isVector4","internal.equals","internal.make","internal.fromTuple","internal.transpose","internal.magnitude","internal.normalize","internal.dot","internal.components","internal.softmax","internal.add","internal.subtract","internal.hadamard","internal.scale","internal.getX","internal.setX","internal.mapX","internal.getY","internal.setY","internal.mapY","internal.getZ","internal.setZ","internal.mapZ","internal.getW","internal.setW","internal.mapW"],"sources":["../../src/vector/vector4.ts"],"sourcesContent":["import type { FourDimensional } from '../dimensions.ts'\nimport type { Pipeable } from '../utils.ts'\nimport type { Vector4TypeId } from './vector4.internal.ts'\nimport * as internal from './vector4.internal.ts'\n\n/**\n * A 4D vector.\n *\n * All fields are readonly and immutable, and all operations create new instances.\n *\n * @since 1.0.0\n */\nexport interface Vector4 extends Pipeable, FourDimensional<number> {\n readonly [Vector4TypeId]: Vector4TypeId\n}\n\n/**\n * Checks if a value is a `Vector4`.\n *\n * @param v - The value to check.\n * @returns `true` if the value is a `Vector4`, `false` otherwise.\n * @since 1.0.0\n */\nexport const isVector4: (v: unknown) => v is Vector4 = internal.isVector4\n\nexport const equals: {\n /**\n * Checks if two `Vector4` instances are approximately equal within the\n * default absolute tolerance ({@link EPSILON}).\n *\n * @param a - The first vector.\n * @param b - The second vector.\n * @returns `true` when each pair of components is within tolerance.\n * @since 1.1.0\n */\n (a: Vector4, b: Vector4): boolean\n /**\n * Checks if two `Vector4` instances are approximately equal within the\n * default absolute tolerance ({@link EPSILON}).\n *\n * @param b - The second vector.\n * @returns A function that takes the first vector and returns the comparison result.\n * @since 1.1.0\n */\n (b: Vector4): (a: Vector4) => boolean\n} = internal.equals\n\nexport const make: {\n /**\n * Creates a new `Vector4` instance.\n *\n * @param xyzw - The x, y, z, and w components of the vector.\n * @returns A new `Vector4` instance.\n * @since 1.0.0\n */\n (xyzw: number): Vector4\n /**\n * Creates a new `Vector4` instance.\n *\n * @param x - The x component of the vector.\n * @param yzw - The y, z, and w components of the vector.\n * @returns A new `Vector4` instance.\n * @since 1.0.0\n */\n (x: number, yzw: number): Vector4\n /**\n * Creates a new `Vector4` instance.\n *\n * @param x - The x component of the vector.\n * @param y - The y component of the vector.\n * @param zw - The z and w components of the vector.\n * @returns A new `Vector4` instance.\n * @since 1.0.0\n */\n (x: number, y: number, zw: number): Vector4\n /**\n * Creates a new `Vector4` instance.\n *\n * @param x - The x component of the vector.\n * @param y - The y component of the vector.\n * @param z - The z component of the vector.\n * @param w - The w component of the vector.\n * @returns A new `Vector4` instance.\n * @since 1.0.0\n */\n (x: number, y: number, z: number, w: number): Vector4\n} = internal.make\n\n/**\n * Creates a new `Vector4` instance from a `[x, y, z, w]` tuple. Inverse of\n * {@link components}.\n *\n * @param t - The `[x, y, z, w]` tuple.\n * @returns A new `Vector4` instance.\n * @since 2.0.0\n */\nexport const fromTuple: (t: readonly [number, number, number, number]) => Vector4 =\n internal.fromTuple\n\n/**\n * Transposes a 4-tuple of items into one or more `Vector4`s, one per channel\n * extracted by the projection function.\n *\n * For each output channel, takes the corresponding number from each of the\n * four projected items and packs them into a `Vector4` — the data-layout\n * transformation NumPy calls a transpose, FP calls `unzip`, GPUs call a\n * gather, and DSP people inexplicably call deinterleaving.\n *\n * The projection's return-tuple arity determines the number of output\n * vectors, and that arity is preserved in the return type.\n *\n * @example\n * ```ts\n * // Pack the x and y coordinates of four control points into two Vector4s.\n * const [xs, ys] = Vector4.transpose(\n * [p0, p1, p2, p3],\n * (p) => [p.x, p.y],\n * )\n * ```\n *\n * @param inputs - Exactly four items of any type.\n * @param project - A function returning a fixed-arity tuple of numbers — one per output channel.\n * @returns A tuple of `Vector4`s with the same arity as the projection's return tuple.\n * @since 2.0.0\n */\nexport const transpose: <T, const Channels extends ReadonlyArray<number>>(\n inputs: readonly [T, T, T, T],\n project: (item: T) => Channels,\n) => { readonly [K in keyof Channels]: Vector4 } = internal.transpose\n\n/**\n * Gets the magnitude of a `Vector4`.\n *\n * @param vector - The vector to calculate the magnitude of.\n * @returns The magnitude of the vector.\n * @since 1.0.0\n */\nexport const magnitude: (vector: Vector4) => number = internal.magnitude\n\n/**\n * Normalizes a `Vector4`.\n *\n * @param vector - The vector to normalize.\n * @returns A new `Vector4` instance with the same direction as the input vector but with a magnitude of 1.\n * @since 1.0.0\n */\nexport const normalize: (vector: Vector4) => Vector4 = internal.normalize\n\nexport const dot: {\n /**\n * Computes the dot product of two `Vector4` instances.\n *\n * @param a - The first vector.\n * @param b - The second vector.\n * @returns The dot product of the two vectors.\n * @since 1.0.0\n */\n (a: Vector4, b: Vector4): number\n /**\n * Computes the dot product of a `Vector4` instance and another vector.\n *\n * @param b - The second vector.\n * @returns A function that takes the first vector and returns the dot product.\n * @since 1.0.0\n */\n (b: Vector4): (a: Vector4) => number\n} = internal.dot\n\n/**\n * Returns the components of a `Vector4` as an array.\n *\n * @param v - The vector to get the components of.\n * @returns An array containing the x, y, z, and w components of the vector.\n * @since 1.0.0\n */\nexport const components: (v: Vector4) => [number, number, number, number] = internal.components\n\n/**\n * Applies the softmax function to a `Vector4`.\n *\n * @param v - The vector to calculate the softmax of.\n * @returns A new `Vector4` instance representing the softmax of the input vector.\n */\nexport const softmax: (v: Vector4) => Vector4 = internal.softmax\n\n/**\n * Creates a zero vector.\n *\n * @since 1.0.0\n */\nexport const zero = make(0)\n\n/**\n * Creates a unit vector.\n *\n * @since 1.0.0\n */\nexport const unit = make(1)\n\nexport const add: {\n /**\n * Adds two `Vector4` instances.\n *\n * @param a - The first vector.\n * @param b - The second vector.\n * @returns A new `Vector4` instance representing the sum of the two vectors.\n * @since 1.0.0\n */\n (a: Vector4, b: Vector4): Vector4\n\n /**\n * Adds a `Vector4` instance to another vector.\n *\n * @param b - The second vector.\n * @returns A function that takes the first vector and returns the sum.\n * @since 1.0.0\n */\n (b: Vector4): (a: Vector4) => Vector4\n} = internal.add\n\nexport const subtract: {\n /**\n * Subtracts one `Vector4` instance from another.\n *\n * @param a - The first vector.\n * @param b - The second vector.\n * @returns A new `Vector4` instance representing the difference of the two vectors.\n * @since 1.0.0\n */\n (a: Vector4, b: Vector4): Vector4\n /**\n * Subtracts a `Vector4` instance from another vector.\n *\n * @param b - The second vector.\n * @returns A function that takes the first vector and returns the difference.\n * @since 1.0.0\n */\n (b: Vector4): (a: Vector4) => Vector4\n} = internal.subtract\n\nexport const hadamard: {\n /**\n * Computes the Hadamard product of two `Vector4` instances.\n *\n * @param a - The first vector.\n * @param b - The second vector.\n * @returns A new `Vector4` instance representing the Hadamard product of the two vectors.\n * @since 1.0.0\n */\n (a: Vector4, b: Vector4): Vector4\n /**\n * Computes the Hadamard product of a `Vector4` instance and another vector.\n *\n * @param b - The second vector.\n * @returns A function that takes the first vector and returns the Hadamard product.\n * @since 1.0.0\n */\n (b: Vector4): (a: Vector4) => Vector4\n} = internal.hadamard\n\nexport const scale: {\n /**\n * Scales a `Vector4` by a scalar.\n *\n * @param s - The scalar to scale the vector by.\n * @returns A function that takes the vector and returns the scaled vector.\n * @since 1.0.0\n */\n (s: number): (v: Vector4) => Vector4\n /**\n * Scales a `Vector4` by a scalar.\n *\n * @param s - The scalar to scale the vector by.\n * @param v - The vector to scale.\n * @returns A new `Vector4` instance representing the scaled vector.\n * @since 1.0.0\n */\n (v: Vector4, s: number): Vector4\n} = internal.scale\n\n/**\n * Gets the x component of a `Vector4`.\n *\n * @param v - The vector to get the x component of.\n * @returns The x component of the vector.\n * @since 2.0.0\n */\nexport const getX: (v: Vector4) => number = internal.getX\n\nexport const setX: {\n /**\n * Sets the x component of a `Vector4`.\n *\n * @param v - The vector to set the x component of.\n * @param x - The new x component.\n * @returns A new `Vector4` instance with the updated x component.\n * @since 2.0.0\n */\n (v: Vector4, x: number): Vector4\n /**\n * Sets the x component of a `Vector4`.\n *\n * @param x - The new x component.\n * @returns A function that takes a vector and returns the updated vector.\n * @since 2.0.0\n */\n (x: number): (v: Vector4) => Vector4\n} = internal.setX\n\nexport const mapX: {\n /**\n * Returns a new `Vector4` with the x component replaced by `f(v.x)`.\n *\n * @param v - The vector to update.\n * @param f - The function to apply to the x component.\n * @returns A new `Vector4` with the updated x.\n * @since 2.0.0\n */\n (v: Vector4, f: (x: number) => number): Vector4\n /**\n * Returns a new `Vector4` with the x component replaced by `f(v.x)`.\n *\n * @param f - The function to apply to the x component.\n * @returns A function that takes a vector and returns the updated vector.\n * @since 2.0.0\n */\n (f: (x: number) => number): (v: Vector4) => Vector4\n} = internal.mapX\n\n/**\n * Gets the y component of a `Vector4`.\n *\n * @param v - The vector to get the y component of.\n * @returns The y component of the vector.\n * @since 2.0.0\n */\nexport const getY: (v: Vector4) => number = internal.getY\n\nexport const setY: {\n /**\n * Sets the y component of a `Vector4`.\n *\n * @param v - The vector to set the y component of.\n * @param y - The new y component.\n * @returns A new `Vector4` instance with the updated y component.\n * @since 2.0.0\n */\n (v: Vector4, y: number): Vector4\n /**\n * Sets the y component of a `Vector4`.\n *\n * @param y - The new y component.\n * @returns A function that takes a vector and returns the updated vector.\n * @since 2.0.0\n */\n (y: number): (v: Vector4) => Vector4\n} = internal.setY\n\nexport const mapY: {\n /**\n * Returns a new `Vector4` with the y component replaced by `f(v.y)`.\n *\n * @param v - The vector to update.\n * @param f - The function to apply to the y component.\n * @returns A new `Vector4` with the updated y.\n * @since 2.0.0\n */\n (v: Vector4, f: (y: number) => number): Vector4\n /**\n * Returns a new `Vector4` with the y component replaced by `f(v.y)`.\n *\n * @param f - The function to apply to the y component.\n * @returns A function that takes a vector and returns the updated vector.\n * @since 2.0.0\n */\n (f: (y: number) => number): (v: Vector4) => Vector4\n} = internal.mapY\n\n/**\n * Gets the z component of a `Vector4`.\n *\n * @param v - The vector to get the z component of.\n * @returns The z component of the vector.\n * @since 2.0.0\n */\nexport const getZ: (v: Vector4) => number = internal.getZ\n\nexport const setZ: {\n /**\n * Sets the z component of a `Vector4`.\n *\n * @param v - The vector to set the z component of.\n * @param z - The new z component.\n * @returns A new `Vector4` instance with the updated z component.\n * @since 2.0.0\n */\n (v: Vector4, z: number): Vector4\n /**\n * Sets the z component of a `Vector4`.\n *\n * @param z - The new z component.\n * @returns A function that takes a vector and returns the updated vector.\n * @since 2.0.0\n */\n (z: number): (v: Vector4) => Vector4\n} = internal.setZ\n\nexport const mapZ: {\n /**\n * Returns a new `Vector4` with the z component replaced by `f(v.z)`.\n *\n * @param v - The vector to update.\n * @param f - The function to apply to the z component.\n * @returns A new `Vector4` with the updated z.\n * @since 2.0.0\n */\n (v: Vector4, f: (z: number) => number): Vector4\n /**\n * Returns a new `Vector4` with the z component replaced by `f(v.z)`.\n *\n * @param f - The function to apply to the z component.\n * @returns A function that takes a vector and returns the updated vector.\n * @since 2.0.0\n */\n (f: (z: number) => number): (v: Vector4) => Vector4\n} = internal.mapZ\n\n/**\n * Gets the w component of a `Vector4`.\n *\n * @param v - The vector to get the w component of.\n * @returns The w component of the vector.\n * @since 2.0.0\n */\nexport const getW: (v: Vector4) => number = internal.getW\n\nexport const setW: {\n /**\n * Sets the w component of a `Vector4`.\n *\n * @param v - The vector to set the w component of.\n * @param w - The new w component.\n * @returns A new `Vector4` instance with the updated w component.\n * @since 2.0.0\n */\n (v: Vector4, w: number): Vector4\n /**\n * Sets the w component of a `Vector4`.\n *\n * @param w - The new w component.\n * @returns A function that takes a vector and returns the updated vector.\n * @since 2.0.0\n */\n (w: number): (v: Vector4) => Vector4\n} = internal.setW\n\nexport const mapW: {\n /**\n * Returns a new `Vector4` with the w component replaced by `f(v.w)`.\n *\n * @param v - The vector to update.\n * @param f - The function to apply to the w component.\n * @returns A new `Vector4` with the updated w.\n * @since 2.0.0\n */\n (v: Vector4, f: (w: number) => number): Vector4\n /**\n * Returns a new `Vector4` with the w component replaced by `f(v.w)`.\n *\n * @param f - The function to apply to the w component.\n * @returns A function that takes a vector and returns the updated vector.\n * @since 2.0.0\n */\n (f: (w: number) => number): (v: Vector4) => Vector4\n} = internal.mapW\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuBA,MAAa,YAA0CA;AAEvD,MAAa,SAoBTC;AAEJ,MAAa,OAuCTC;;;;;;;;;AAUJ,MAAa,YACXC;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BF,MAAa,YAGsCC;;;;;;;;AASnD,MAAa,YAAyCC;;;;;;;;AAStD,MAAa,YAA0CC;AAEvD,MAAa,MAkBTC;;;;;;;;AASJ,MAAa,aAA+DC;;;;;;;AAQ5E,MAAa,UAAmCC;;;;;;AAOhD,MAAa,OAAO,KAAK,EAAE;;;;;;AAO3B,MAAa,OAAO,KAAK,EAAE;AAE3B,MAAa,MAmBTC;AAEJ,MAAa,WAkBTC;AAEJ,MAAa,WAkBTC;AAEJ,MAAa,QAkBTC;;;;;;;;AASJ,MAAa,OAA+BC;AAE5C,MAAa,OAkBTC;AAEJ,MAAa,OAkBTC;;;;;;;;AASJ,MAAa,OAA+BC;AAE5C,MAAa,OAkBTC;AAEJ,MAAa,OAkBTC;;;;;;;;AASJ,MAAa,OAA+BC;AAE5C,MAAa,OAkBTC;AAEJ,MAAa,OAkBTC;;;;;;;;AASJ,MAAa,OAA+BC;AAE5C,MAAa,OAkBTC;AAEJ,MAAa,OAkBTC"}
@@ -0,0 +1,116 @@
1
+ import { Pipeable, dual } from "../utils.mjs";
2
+ import { coincident } from "../number.mjs";
3
+ //#region src/vector/vector4.internal.ts
4
+ const Vector4TypeId = Symbol.for("curvy/vector4");
5
+ var Vector4Impl = class extends Pipeable {
6
+ [Vector4TypeId] = Vector4TypeId;
7
+ x;
8
+ y;
9
+ z;
10
+ w;
11
+ constructor(v0 = 0, v1 = 0, v2 = 0, v3 = 0) {
12
+ super();
13
+ this.x = v0;
14
+ this.y = v1;
15
+ this.z = v2;
16
+ this.w = v3;
17
+ }
18
+ get [0]() {
19
+ return this.x;
20
+ }
21
+ get [1]() {
22
+ return this.y;
23
+ }
24
+ get [2]() {
25
+ return this.z;
26
+ }
27
+ get [3]() {
28
+ return this.w;
29
+ }
30
+ get [Symbol.toStringTag]() {
31
+ return `Vector4(${this.x}, ${this.y}, ${this.z}, ${this.w})`;
32
+ }
33
+ get [Symbol.for("nodejs.util.inspect.custom")]() {
34
+ return this[Symbol.toStringTag];
35
+ }
36
+ };
37
+ /** @internal */
38
+ const isVector4 = (v) => typeof v === "object" && v !== null && Vector4TypeId in v;
39
+ /** @internal */
40
+ const equals = dual(2, (a, b) => coincident(a.x, b.x) && coincident(a.y, b.y) && coincident(a.z, b.z) && coincident(a.w, b.w));
41
+ /** @internal */
42
+ const make = (v0, v1 = v0, v2 = v1, v3 = v2) => new Vector4Impl(v0, v1, v2, v3);
43
+ /** @internal */
44
+ const fromTuple = (t) => new Vector4Impl(t[0], t[1], t[2], t[3]);
45
+ /** @internal */
46
+ const transpose = (inputs, project) => {
47
+ const a = project(inputs[0]);
48
+ const b = project(inputs[1]);
49
+ const c = project(inputs[2]);
50
+ const d = project(inputs[3]);
51
+ const result = [];
52
+ for (let i = 0; i < a.length; i++) result.push(make(a[i], b[i], c[i], d[i]));
53
+ return result;
54
+ };
55
+ /** @internal */
56
+ const magnitude = (vector) => Math.hypot(vector.x, vector.y, vector.z, vector.w);
57
+ /** @internal */
58
+ const normalize = (vector) => {
59
+ const m = magnitude(vector);
60
+ return make(vector.x / m, vector.y / m, vector.z / m, vector.w / m);
61
+ };
62
+ /** @internal */
63
+ const dot = dual(2, (a, b) => a.x * b.x + a.y * b.y + a.z * b.z + a.w * b.w);
64
+ /** @internal */
65
+ const components = (v) => [
66
+ v.x,
67
+ v.y,
68
+ v.z,
69
+ v.w
70
+ ];
71
+ /** @internal */
72
+ const softmax = (v) => {
73
+ const max = Math.max(v.x, v.y, v.z, v.w);
74
+ const v0 = Math.exp(v.x - max);
75
+ const v1 = Math.exp(v.y - max);
76
+ const v2 = Math.exp(v.z - max);
77
+ const v3 = Math.exp(v.w - max);
78
+ const sum = v0 + v1 + v2 + v3;
79
+ return make(v0 / sum, v1 / sum, v2 / sum, v3 / sum);
80
+ };
81
+ /** @internal */
82
+ const add = dual(2, (a, b) => make(a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w));
83
+ /** @internal */
84
+ const subtract = dual(2, (a, b) => make(a.x - b.x, a.y - b.y, a.z - b.z, a.w - b.w));
85
+ /** @internal */
86
+ const hadamard = dual(2, (a, b) => make(a.x * b.x, a.y * b.y, a.z * b.z, a.w * b.w));
87
+ /** @internal */
88
+ const scale = dual(2, (v, s) => s === 1 ? v : make(v.x * s, v.y * s, v.z * s, v.w * s));
89
+ /** @internal */
90
+ const getX = (v) => v.x;
91
+ /** @internal */
92
+ const setX = dual(2, (v, x) => make(x, v.y, v.z, v.w));
93
+ /** @internal */
94
+ const mapX = dual(2, (v, f) => make(f(v.x), v.y, v.z, v.w));
95
+ /** @internal */
96
+ const getY = (v) => v.y;
97
+ /** @internal */
98
+ const setY = dual(2, (v, y) => make(v.x, y, v.z, v.w));
99
+ /** @internal */
100
+ const mapY = dual(2, (v, f) => make(v.x, f(v.y), v.z, v.w));
101
+ /** @internal */
102
+ const getZ = (v) => v.z;
103
+ /** @internal */
104
+ const setZ = dual(2, (v, z) => make(v.x, v.y, z, v.w));
105
+ /** @internal */
106
+ const mapZ = dual(2, (v, f) => make(v.x, v.y, f(v.z), v.w));
107
+ /** @internal */
108
+ const getW = (v) => v.w;
109
+ /** @internal */
110
+ const setW = dual(2, (v, w) => make(v.x, v.y, v.z, w));
111
+ /** @internal */
112
+ const mapW = dual(2, (v, f) => make(v.x, v.y, v.z, f(v.w)));
113
+ //#endregion
114
+ export { setZ as C, transpose as E, setY as S, subtract as T, mapZ as _, fromTuple as a, setW as b, getY as c, isVector4 as d, magnitude as f, mapY as g, mapX as h, equals as i, getZ as l, mapW as m, components as n, getW as o, make as p, dot as r, getX as s, add as t, hadamard as u, normalize as v, softmax as w, setX as x, scale as y };
115
+
116
+ //# sourceMappingURL=vector4.internal-DH5DzNYO.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vector4.internal-DH5DzNYO.mjs","names":[],"sources":["../../src/vector/vector4.internal.ts"],"sourcesContent":["import { dual, Pipeable } from '../utils.ts'\nimport { coincident } from '../number.ts'\nimport type { Vector4 } from './vector4.ts'\n\nexport const Vector4TypeId: unique symbol = Symbol.for('curvy/vector4')\nexport type Vector4TypeId = typeof Vector4TypeId\n\nclass Vector4Impl extends Pipeable implements Vector4 {\n readonly [Vector4TypeId]: Vector4TypeId = Vector4TypeId\n\n readonly x: number\n readonly y: number\n readonly z: number\n readonly w: number\n\n constructor(v0 = 0, v1 = 0, v2 = 0, v3 = 0) {\n super()\n\n this.x = v0\n this.y = v1\n this.z = v2\n this.w = v3\n }\n\n get [0]() {\n return this.x\n }\n\n get [1]() {\n return this.y\n }\n\n get [2]() {\n return this.z\n }\n\n get [3]() {\n return this.w\n }\n\n get [Symbol.toStringTag]() {\n return `Vector4(${this.x}, ${this.y}, ${this.z}, ${this.w})`\n }\n\n get [Symbol.for('nodejs.util.inspect.custom')]() {\n return this[Symbol.toStringTag]\n }\n}\n\n/** @internal */\nexport const isVector4 = (v: unknown): v is Vector4 =>\n typeof v === 'object' && v !== null && Vector4TypeId in v\n\n/** @internal */\nexport const equals = dual<\n (b: Vector4) => (a: Vector4) => boolean,\n (a: Vector4, b: Vector4) => boolean\n>(\n 2,\n (a: Vector4, b: Vector4) =>\n coincident(a.x, b.x) && coincident(a.y, b.y) && coincident(a.z, b.z) && coincident(a.w, b.w),\n)\n\n/** @internal */\nexport const make = (v0: number, v1 = v0, v2 = v1, v3 = v2): Vector4 =>\n new Vector4Impl(v0, v1, v2, v3)\n\n/** @internal */\nexport const fromTuple = (t: readonly [number, number, number, number]): Vector4 =>\n new Vector4Impl(t[0], t[1], t[2], t[3])\n\n/** @internal */\nexport const transpose = <T, const Channels extends ReadonlyArray<number>>(\n inputs: readonly [T, T, T, T],\n project: (item: T) => Channels,\n): { readonly [K in keyof Channels]: Vector4 } => {\n const a = project(inputs[0])\n const b = project(inputs[1])\n const c = project(inputs[2])\n const d = project(inputs[3])\n const result: Array<Vector4> = []\n for (let i = 0; i < a.length; i++) {\n result.push(make(a[i] as number, b[i] as number, c[i] as number, d[i] as number))\n }\n return result as never\n}\n\n/** @internal */\nexport const magnitude: (vector: Vector4) => number = (vector: Vector4) =>\n Math.hypot(vector.x, vector.y, vector.z, vector.w)\n\n/** @internal */\nexport const normalize: (vector: Vector4) => Vector4 = (vector: Vector4) => {\n const m = magnitude(vector)\n\n return make(vector.x / m, vector.y / m, vector.z / m, vector.w / m)\n}\n\n/** @internal */\nexport const dot = dual<(b: Vector4) => (a: Vector4) => number, (a: Vector4, b: Vector4) => number>(\n 2,\n (a: Vector4, b: Vector4) => a.x * b.x + a.y * b.y + a.z * b.z + a.w * b.w,\n)\n\n/** @internal */\nexport const components: (v: Vector4) => [number, number, number, number] = (v: Vector4) => [\n v.x,\n v.y,\n v.z,\n v.w,\n]\n\n/** @internal */\nexport const softmax: (v: Vector4) => Vector4 = (v: Vector4) => {\n const max = Math.max(v.x, v.y, v.z, v.w)\n\n const v0 = Math.exp(v.x - max)\n const v1 = Math.exp(v.y - max)\n const v2 = Math.exp(v.z - max)\n const v3 = Math.exp(v.w - max)\n\n const sum = v0 + v1 + v2 + v3\n\n return make(v0 / sum, v1 / sum, v2 / sum, v3 / sum)\n}\n\n/** @internal */\nexport const add = dual<\n (b: Vector4) => (a: Vector4) => Vector4,\n (a: Vector4, b: Vector4) => Vector4\n>(2, (a: Vector4, b: Vector4) => make(a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w))\n\n/** @internal */\nexport const subtract = dual<\n (b: Vector4) => (a: Vector4) => Vector4,\n (a: Vector4, b: Vector4) => Vector4\n>(2, (a: Vector4, b: Vector4) => make(a.x - b.x, a.y - b.y, a.z - b.z, a.w - b.w))\n\n/** @internal */\nexport const hadamard = dual<\n (b: Vector4) => (a: Vector4) => Vector4,\n (a: Vector4, b: Vector4) => Vector4\n>(2, (a: Vector4, b: Vector4) => make(a.x * b.x, a.y * b.y, a.z * b.z, a.w * b.w))\n/** @internal */\nexport const scale = dual<\n (s: number) => (v: Vector4) => Vector4,\n (v: Vector4, s: number) => Vector4\n>(2, (v: Vector4, s: number) => (s === 1 ? v : make(v.x * s, v.y * s, v.z * s, v.w * s)))\n\n/** @internal */\nexport const getX = (v: Vector4) => v.x\n/** @internal */\nexport const setX = dual<\n (x: number) => (v: Vector4) => Vector4,\n (v: Vector4, x: number) => Vector4\n>(2, (v: Vector4, x: number) => make(x, v.y, v.z, v.w))\n/** @internal */\nexport const mapX = dual<\n (f: (x: number) => number) => (v: Vector4) => Vector4,\n (v: Vector4, f: (x: number) => number) => Vector4\n>(2, (v: Vector4, f: (x: number) => number) => make(f(v.x), v.y, v.z, v.w))\n\n/** @internal */\nexport const getY = (v: Vector4) => v.y\n/** @internal */\nexport const setY = dual<\n (y: number) => (v: Vector4) => Vector4,\n (v: Vector4, y: number) => Vector4\n>(2, (v: Vector4, y: number) => make(v.x, y, v.z, v.w))\n/** @internal */\nexport const mapY = dual<\n (f: (y: number) => number) => (v: Vector4) => Vector4,\n (v: Vector4, f: (y: number) => number) => Vector4\n>(2, (v: Vector4, f: (y: number) => number) => make(v.x, f(v.y), v.z, v.w))\n\n/** @internal */\nexport const getZ = (v: Vector4) => v.z\n/** @internal */\nexport const setZ = dual<\n (z: number) => (v: Vector4) => Vector4,\n (v: Vector4, z: number) => Vector4\n>(2, (v: Vector4, z: number) => make(v.x, v.y, z, v.w))\n/** @internal */\nexport const mapZ = dual<\n (f: (z: number) => number) => (v: Vector4) => Vector4,\n (v: Vector4, f: (z: number) => number) => Vector4\n>(2, (v: Vector4, f: (z: number) => number) => make(v.x, v.y, f(v.z), v.w))\n\n/** @internal */\nexport const getW = (v: Vector4) => v.w\n/** @internal */\nexport const setW = dual<\n (w: number) => (v: Vector4) => Vector4,\n (v: Vector4, w: number) => Vector4\n>(2, (v: Vector4, w: number) => make(v.x, v.y, v.z, w))\n/** @internal */\nexport const mapW = dual<\n (f: (w: number) => number) => (v: Vector4) => Vector4,\n (v: Vector4, f: (w: number) => number) => Vector4\n>(2, (v: Vector4, f: (w: number) => number) => make(v.x, v.y, v.z, f(v.w)))\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import { c as solution_exports } from "../shared/solution-B2JdOZpe.mjs";
1
+ import { l as solution_exports } from "../shared/solution-BW0BBMXI.mjs";
2
2
  export { solution_exports as Solution };
@@ -221,6 +221,22 @@ export declare const clip: {
221
221
  (i: Interval): (s: Solution<number>) => Solution<number>;
222
222
  (s: Solution<number>, i: Interval): Solution<number>;
223
223
  };
224
+ /**
225
+ * Approximate-containment variant of {@link clip} for post-processing the
226
+ * output of a numerical solver. Retains values within a small absolute
227
+ * tolerance of either boundary even if formally outside — a valid root can
228
+ * land a few ULPs past the boundary due to coefficient roundoff in the
229
+ * solver, and strict {@link clip} would drop it. Endpoint inclusivity is
230
+ * ignored at the EPSILON scale.
231
+ *
232
+ * @param s - The solution to clip.
233
+ * @param i - The interval to retain values approximately within.
234
+ * @since 2.0.0
235
+ */
236
+ export declare const clipApprox: {
237
+ (i: Interval): (s: Solution<number>) => Solution<number>;
238
+ (s: Solution<number>, i: Interval): Solution<number>;
239
+ };
224
240
  /**
225
241
  * Maps every value in the solution to a new value. Result cardinality matches
226
242
  * the input.
@@ -1,4 +1,5 @@
1
1
  import type { CubicPath2d } from '../path/cubic2d.ts';
2
+ import type { Affine2d } from '../transform/affine2d.ts';
2
3
  import type { Pipeable } from '../utils.ts';
3
4
  import type { Vector2 } from '../vector/vector2.ts';
4
5
  import type { Basis2dTypeId } from './basis2d.internal.ts';
@@ -90,6 +91,69 @@ export declare const prepend: {
90
91
  */
91
92
  (p: Basis2d, ...points: ReadonlyArray<Vector2>): Basis2d;
92
93
  };
94
+ export declare const mapPoints: {
95
+ /**
96
+ * Applies a per-point transform to every control point in a `Basis2d`,
97
+ * preserving point count and spline identity.
98
+ *
99
+ * @param f - The point transform.
100
+ * @returns A function that takes a `Basis2d` and returns the mapped spline.
101
+ * @since 2.0.0
102
+ */
103
+ (f: (p: Vector2) => Vector2): (s: Basis2d) => Basis2d;
104
+ /**
105
+ * Applies a per-point transform to every control point in a `Basis2d`.
106
+ *
107
+ * @param s - The basis spline.
108
+ * @param f - The point transform.
109
+ * @returns A new `Basis2d` with the transform applied to each control point.
110
+ * @since 2.0.0
111
+ */
112
+ (s: Basis2d, f: (p: Vector2) => Vector2): Basis2d;
113
+ };
114
+ export declare const flatMap: {
115
+ /**
116
+ * Hands the spline's full control-point array to `f` and uses its returned
117
+ * `Basis2d` as the result. The returned spline goes through this module's
118
+ * builders, so the 4-or-more-points invariant is enforced at construction.
119
+ *
120
+ * @param f - The bulk transform.
121
+ * @returns A function that takes a `Basis2d` and returns the rebuilt spline.
122
+ * @since 2.0.0
123
+ */
124
+ (f: (points: ReadonlyArray<Vector2>) => Basis2d): (s: Basis2d) => Basis2d;
125
+ /**
126
+ * Hands the spline's full control-point array to `f` and uses its returned
127
+ * `Basis2d` as the result.
128
+ *
129
+ * @param s - The basis spline.
130
+ * @param f - The bulk transform.
131
+ * @returns The `Basis2d` returned by `f`.
132
+ * @since 2.0.0
133
+ */
134
+ (s: Basis2d, f: (points: ReadonlyArray<Vector2>) => Basis2d): Basis2d;
135
+ };
136
+ export declare const transform: {
137
+ /**
138
+ * Applies an `Affine2d` transform to every control point of a `Basis2d`.
139
+ * Affine maps commute with the B-spline basis, so the result exactly
140
+ * parameterizes the affine image of the original curve.
141
+ *
142
+ * @param s - The basis spline.
143
+ * @param a - The affine transform.
144
+ * @returns A new `Basis2d` whose control points are the affine images of the input's.
145
+ * @since 2.0.0
146
+ */
147
+ (s: Basis2d, a: Affine2d): Basis2d;
148
+ /**
149
+ * Applies an `Affine2d` transform to every control point of a `Basis2d`.
150
+ *
151
+ * @param a - The affine transform.
152
+ * @returns A function that takes a `Basis2d` and returns the transformed spline.
153
+ * @since 2.0.0
154
+ */
155
+ (a: Affine2d): (s: Basis2d) => Basis2d;
156
+ };
93
157
  /**
94
158
  * Triplicates the endpoints of a `Basis2d`.
95
159
  *
@@ -1,4 +1,5 @@
1
1
  import type { CubicPath2d } from '../path/cubic2d.ts';
2
+ import type { Affine2d } from '../transform/affine2d.ts';
2
3
  import type { Pipeable } from '../utils.ts';
3
4
  import type * as Solution from '../solution/solution.ts';
4
5
  import type { Vector2 } from '../vector/vector2.ts';
@@ -153,6 +154,77 @@ export declare const appendAccelerationAligned: {
153
154
  */
154
155
  (p: Bezier2d, p3: Vector2): Bezier2d;
155
156
  };
157
+ export declare const mapPoints: {
158
+ /**
159
+ * Applies a per-point transform to every control point in a `Bezier2d`,
160
+ * preserving point count and spline identity.
161
+ *
162
+ * Note that the transform is applied uniformly to all control points,
163
+ * including off-curve handles. Affine maps (translate, rotate, scale, shear)
164
+ * commute with cubic Bézier evaluation and preserve curve identity up to
165
+ * the affine map; nonlinear maps produce a geometrically reasonable result
166
+ * but no longer parameterize the affine image of the original curve.
167
+ *
168
+ * @param f - The point transform.
169
+ * @returns A function that takes a `Bezier2d` and returns the mapped spline.
170
+ * @since 2.0.0
171
+ */
172
+ (f: (p: Vector2) => Vector2): (s: Bezier2d) => Bezier2d;
173
+ /**
174
+ * Applies a per-point transform to every control point in a `Bezier2d`.
175
+ *
176
+ * @param s - The bezier.
177
+ * @param f - The point transform.
178
+ * @returns A new `Bezier2d` with the transform applied to each control point.
179
+ * @since 2.0.0
180
+ */
181
+ (s: Bezier2d, f: (p: Vector2) => Vector2): Bezier2d;
182
+ };
183
+ export declare const flatMap: {
184
+ /**
185
+ * Hands the bezier's full control-point array to `f` and uses its returned
186
+ * `Bezier2d` as the result. The returned bezier goes through this module's
187
+ * builders, so the `3n + 1` point-count invariant is enforced at
188
+ * construction.
189
+ *
190
+ * @param f - The bulk transform.
191
+ * @returns A function that takes a `Bezier2d` and returns the rebuilt spline.
192
+ * @since 2.0.0
193
+ */
194
+ (f: (points: ReadonlyArray<Vector2>) => Bezier2d): (s: Bezier2d) => Bezier2d;
195
+ /**
196
+ * Hands the bezier's full control-point array to `f` and uses its returned
197
+ * `Bezier2d` as the result.
198
+ *
199
+ * @param s - The bezier.
200
+ * @param f - The bulk transform.
201
+ * @returns The `Bezier2d` returned by `f`.
202
+ * @since 2.0.0
203
+ */
204
+ (s: Bezier2d, f: (points: ReadonlyArray<Vector2>) => Bezier2d): Bezier2d;
205
+ };
206
+ export declare const transform: {
207
+ /**
208
+ * Applies an `Affine2d` transform to every control point of a `Bezier2d`.
209
+ * Affine maps commute with Bézier evaluation, so the result exactly
210
+ * parameterizes the affine image of the original curve.
211
+ *
212
+ * @param s - The bezier.
213
+ * @param a - The affine transform.
214
+ * @returns A new `Bezier2d` whose control points are the affine images of
215
+ * the input's.
216
+ * @since 2.0.0
217
+ */
218
+ (s: Bezier2d, a: Affine2d): Bezier2d;
219
+ /**
220
+ * Applies an `Affine2d` transform to every control point of a `Bezier2d`.
221
+ *
222
+ * @param a - The affine transform.
223
+ * @returns A function that takes a `Bezier2d` and returns the transformed bezier.
224
+ * @since 2.0.0
225
+ */
226
+ (a: Affine2d): (s: Bezier2d) => Bezier2d;
227
+ };
156
228
  /**
157
229
  * Converts a `Bezier2d` to a `CubicPath2d`.
158
230
  *