@use-gpu/math 0.0.0-stage → 0.21.0

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.
package/cjs/matrix.cjs ADDED
@@ -0,0 +1,247 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "Matrix", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return Matrix;
9
+ }
10
+ });
11
+ const _number = require("./number.cjs");
12
+ const { sqrt } = Math;
13
+ // Get matrix dimensions
14
+ const dims = (m)=>[
15
+ m.length,
16
+ m[0].length
17
+ ];
18
+ const size = ([a, b])=>`${a}x${b}`;
19
+ // Fill an NxM matrix using a given expression
20
+ const fill = (n, m, f = ()=>0)=>{
21
+ const out = [];
22
+ for(let j = 0; j < n; ++j){
23
+ const row = [];
24
+ for(let i = 0; i < m; ++i){
25
+ row[i] = f(i, j);
26
+ }
27
+ out.push(row);
28
+ }
29
+ return out;
30
+ };
31
+ // Identity matrix
32
+ const identity = (n)=>fill(n, n, (i, j)=>+(i == j));
33
+ // Add two matrices
34
+ const add = (a, b)=>{
35
+ const [na, ma] = dims(a);
36
+ const [nb, mb] = dims(b);
37
+ if (ma !== mb || na !== nb) {
38
+ console.error("Incompatible matrices", a, b, size(dims(a)), size(dims(b)));
39
+ throw new Error("Matrix error");
40
+ }
41
+ return fill(na, ma, (i, j)=>a[j][i] + b[j][i]);
42
+ };
43
+ // Subtract two matrices
44
+ const sub = (a, b)=>{
45
+ const [na, ma] = dims(a);
46
+ const [nb, mb] = dims(b);
47
+ if (ma !== mb || na !== nb) {
48
+ console.error("Incompatible matrices", a, b, size(dims(a)), size(dims(b)));
49
+ throw new Error("Matrix error");
50
+ }
51
+ return fill(na, ma, (i, j)=>a[j][i] - b[j][i]);
52
+ };
53
+ // Scale matrix by a scalar
54
+ const muls = (a, s)=>{
55
+ const [na, ma] = dims(a);
56
+ return fill(na, ma, (i, j)=>a[j][i] * s);
57
+ };
58
+ // Multiply two matrices
59
+ const mul = (a, b)=>{
60
+ const [na, ma] = dims(a);
61
+ const [nb, mb] = dims(b);
62
+ if (ma !== nb) {
63
+ console.error("Incompatible matrices", a, b, size(dims(a)), size(dims(b)));
64
+ throw new Error("Matrix error");
65
+ }
66
+ return fill(na, mb, (i, j)=>{
67
+ let v = 0;
68
+ for(let k = 0; k < ma; ++k)v += a[j][k] * b[k][i];
69
+ return v;
70
+ });
71
+ };
72
+ // Multiply two matrices while transposing the second
73
+ const tmul = (a, b)=>{
74
+ const [na, ma] = dims(a);
75
+ const [nb, mb] = dims(b);
76
+ if (ma !== mb) {
77
+ console.error("Incompatible matrices", a, b, size(dims(a)), size(dims(b)));
78
+ throw new Error("Matrix error");
79
+ }
80
+ return fill(na, nb, (i, j)=>{
81
+ let v = 0;
82
+ for(let k = 0; k < ma; ++k)v += a[j][k] * b[i][k];
83
+ return v;
84
+ });
85
+ };
86
+ // Transpose a matrix
87
+ const transpose = (x)=>{
88
+ const [n, m] = dims(x);
89
+ return fill(m, n, (i, j)=>x[i][j]);
90
+ };
91
+ // Concatenate two matrices horizontally
92
+ const concat = (a, b)=>{
93
+ const [na] = dims(a);
94
+ const nb = b.length;
95
+ if (na !== nb) {
96
+ console.error("Incompatible matrices", a, b, size(dims(a)), nb);
97
+ throw "Matrix error";
98
+ }
99
+ return a.map((_, i)=>a[i].concat(b[i]));
100
+ };
101
+ // Extract a submatrix from index (a,b) to (c,d) exclusive
102
+ const slice = (M, a, b, c, d)=>{
103
+ const [n, m] = dims(M);
104
+ a = Math.min(a, m);
105
+ b = Math.min(b, n);
106
+ if (c === undefined) c = m;
107
+ if (d === undefined) d = n;
108
+ c = Math.max(a, Math.min(m, c < 0 ? m + c : c));
109
+ d = Math.max(b, Math.min(n, d < 0 ? n + d : d));
110
+ return fill(d - b, c - a, (i, j)=>M[j][i]);
111
+ };
112
+ // Get matrix rank
113
+ const rank = (A)=>{
114
+ const G = jordanNormal(A);
115
+ return diagonalRank(G);
116
+ };
117
+ // Calculate frobenius norm squared
118
+ const norm2 = (x)=>{
119
+ const [n, m] = dims(x);
120
+ let v = 0;
121
+ for(let j = 0; j < m; ++j){
122
+ for(let i = 0; i < n; ++i){
123
+ v += (0, _number.sqr)(x[j][i]);
124
+ }
125
+ }
126
+ return v;
127
+ };
128
+ // Calculate frobenius norm
129
+ const norm = (x)=>sqrt(norm2(x));
130
+ // Swap a later row to make (i,j) non-zero
131
+ const swapZero = (x, i, j)=>{
132
+ const [n] = dims(x);
133
+ for(let k = j + 1; k < n; ++k){
134
+ if (x[k][i] !== 0) {
135
+ [x[k], x[j]] = [
136
+ x[j],
137
+ x[k]
138
+ ];
139
+ return true;
140
+ }
141
+ }
142
+ return false;
143
+ };
144
+ // In-place vector ops to spare the GC
145
+ // Scale a row by a constant
146
+ const scaleRow = (a, s)=>{
147
+ const { length } = a;
148
+ for(let i = 0; i < length; ++i)a[i] *= s;
149
+ };
150
+ // Multiply and add one row to another
151
+ const madRow = (a, b, s)=>{
152
+ const { length } = a;
153
+ for(let i = 0; i < length; ++i)a[i] += b[i] * s;
154
+ };
155
+ // Get determinant
156
+ const determinant = (x)=>{
157
+ const [n, m] = dims(x);
158
+ let offset = 0;
159
+ x = structuredClone(x);
160
+ let det = 1;
161
+ for(let i = 0; i < Math.min(n, m); ++i){
162
+ // Find next pivot element
163
+ const pivot = x[i][i + offset];
164
+ if (pivot == 0) {
165
+ // Unsuitable, find other row to swap with
166
+ if (!swapZero(x, i + offset, i)) {
167
+ // All zeros, move one column over until out of bounds
168
+ if (offset++ >= m - n) {
169
+ return 0;
170
+ }
171
+ }
172
+ // Repeat iteration
173
+ i--;
174
+ continue;
175
+ }
176
+ // Scale pivot row
177
+ scaleRow(x[i], 1 / pivot);
178
+ det *= pivot;
179
+ // Subtract from other rows
180
+ for(let j = 0; j < n; ++j)if (i !== j) {
181
+ const pivot = x[j][i + offset];
182
+ madRow(x[j], x[i], -pivot);
183
+ }
184
+ }
185
+ return det;
186
+ };
187
+ // Convert matrix into jordan normal form if possible
188
+ const jordanNormal = (x)=>{
189
+ const [n, m] = dims(x);
190
+ let offset = 0;
191
+ // Don't modify argument
192
+ x = structuredClone(x);
193
+ for(let i = 0; i < Math.min(n, m); ++i){
194
+ // Find next pivot element
195
+ const pivot = x[i][i + offset];
196
+ if (pivot == 0) {
197
+ // Unsuitable, find other row to swap with
198
+ if (!swapZero(x, i + offset, i)) {
199
+ // All zeros, move one column over until out of bounds
200
+ if (offset++ >= m - n) {
201
+ return x;
202
+ }
203
+ }
204
+ // Repeat iteration
205
+ i--;
206
+ continue;
207
+ }
208
+ // Scale pivot row
209
+ scaleRow(x[i], 1 / pivot);
210
+ // Subtract from other rows
211
+ for(let j = 0; j < n; ++j)if (i !== j) {
212
+ const pivot = x[j][i + offset];
213
+ madRow(x[j], x[i], -pivot);
214
+ }
215
+ }
216
+ return x;
217
+ };
218
+ // Verify if matrix has uninterrupted non-zero diagonal
219
+ const diagonalRank = (x)=>{
220
+ const [n, m] = dims(x);
221
+ const l = Math.min(n, m);
222
+ let i = 0;
223
+ for(; i < l; ++i){
224
+ if (x[i][i] == 0) break;
225
+ }
226
+ return i;
227
+ };
228
+ const Matrix = {
229
+ dims,
230
+ fill,
231
+ identity,
232
+ add,
233
+ sub,
234
+ mul,
235
+ muls,
236
+ tmul,
237
+ transpose,
238
+ concat,
239
+ slice,
240
+ rank,
241
+ norm,
242
+ norm2,
243
+ determinant,
244
+ jordanNormal
245
+ };
246
+
247
+ //# sourceMappingURL=matrix.js.map
@@ -0,0 +1,18 @@
1
+ export declare const Matrix: {
2
+ dims: (m: number[][]) => number[];
3
+ fill: (n: number, m: number, f?: (i: number, j: number) => number) => number[][];
4
+ identity: (n: number) => number[][];
5
+ add: (a: number[][], b: number[][]) => number[][];
6
+ sub: (a: number[][], b: number[][]) => number[][];
7
+ mul: (a: number[][], b: number[][]) => number[][];
8
+ muls: (a: number[][], s: number) => number[][];
9
+ tmul: (a: number[][], b: number[][]) => number[][];
10
+ transpose: (x: number[][]) => number[][];
11
+ concat: (a: number[][], b: number[] | number[][]) => number[][];
12
+ slice: (M: number[][], a: number, b: number, c: number, d: number) => number[][];
13
+ rank: (A: number[][]) => number;
14
+ norm: (x: number[][]) => number;
15
+ norm2: (x: number[][]) => number;
16
+ determinant: (x: number[][]) => number;
17
+ jordanNormal: (x: number[][]) => number[][];
18
+ };
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../packages/math/src/matrix.ts"],"sourcesContent":["import { sqr } from './number';\n\nconst { sqrt } = Math;\n\n// Get matrix dimensions\nconst dims = (m: number[][]) => [m.length, m[0].length];\nconst size = ([a, b]: number[]) => `${a}x${b}`;\n\n// Fill an NxM matrix using a given expression\nconst fill = (n: number, m: number, f: (i: number, j: number) => number = () => 0) => {\n const out = [];\n for (let j = 0; j < n; ++j) {\n const row = [];\n for (let i = 0; i < m; ++i) {\n row[i] = f(i, j);\n }\n out.push(row);\n }\n return out;\n}\n\n// Identity matrix\nconst identity = (n: number) => fill(n, n, (i, j) => +(i == j));\n\n// Add two matrices\nconst add = (a: number[][], b: number[][]) => {\n const [na, ma] = dims(a);\n const [nb, mb] = dims(b);\n if (ma !== mb || na !== nb) {\n console.error(\"Incompatible matrices\", a, b, size(dims(a)), size(dims(b)));\n throw new Error(\"Matrix error\");\n }\n return fill(na, ma, (i, j) => a[j][i] + b[j][i]);\n}\n\n// Subtract two matrices\nconst sub = (a: number[][], b: number[][]) => {\n const [na, ma] = dims(a);\n const [nb, mb] = dims(b);\n if (ma !== mb || na !== nb) {\n console.error(\"Incompatible matrices\", a, b, size(dims(a)), size(dims(b)));\n throw new Error(\"Matrix error\");\n }\n return fill(na, ma, (i, j) => a[j][i] - b[j][i]);\n}\n\n// Scale matrix by a scalar\nconst muls = (a: number[][], s: number) => {\n const [na, ma] = dims(a);\n return fill(na, ma, (i, j) => a[j][i] * s);\n}\n\n// Multiply two matrices\nconst mul = (a: number[][], b: number[][]) => {\n const [na, ma] = dims(a);\n const [nb, mb] = dims(b);\n if (ma !== nb) {\n console.error(\"Incompatible matrices\", a, b, size(dims(a)), size(dims(b)));\n throw new Error(\"Matrix error\");\n }\n return fill(na, mb, (i, j) => {\n let v = 0;\n for (let k = 0; k < ma; ++k) v += a[j][k] * b[k][i];\n return v;\n });\n}\n\n// Multiply two matrices while transposing the second\nconst tmul = (a: number[][], b: number[][]) => {\n const [na, ma] = dims(a);\n const [nb, mb] = dims(b);\n if (ma !== mb) {\n console.error(\"Incompatible matrices\", a, b, size(dims(a)), size(dims(b)));\n throw new Error(\"Matrix error\");\n }\n return fill(na, nb, (i, j) => {\n let v = 0;\n for (let k = 0; k < ma; ++k) v += a[j][k] * b[i][k];\n return v;\n });\n}\n\n// Transpose a matrix\nconst transpose = (x: number[][]) => {\n const [n, m] = dims(x);\n return fill(m, n, (i, j) => x[i][j]);\n}\n\n// Concatenate two matrices horizontally\nconst concat = (a: number[][], b: number[] | number[][]) => {\n const [na] = dims(a);\n const nb = b.length;\n if (na !== nb) {\n console.error(\"Incompatible matrices\", a, b, size(dims(a)), nb);\n throw \"Matrix error\";\n }\n return a.map((_,i) => a[i].concat(b[i]));\n}\n\n// Extract a submatrix from index (a,b) to (c,d) exclusive\nconst slice = (M: number[][], a: number, b: number, c: number, d: number) => {\n const [n, m] = dims(M);\n\n a = Math.min(a, m);\n b = Math.min(b, n);\n\n if (c === undefined) c = m;\n if (d === undefined) d = n;\n\n c = Math.max(a, Math.min(m, c < 0 ? m + c : c));\n d = Math.max(b, Math.min(n, d < 0 ? n + d : d));\n\n return fill(d - b, c - a, (i, j) => M[j][i]);\n}\n\n// Get matrix rank\nconst rank = (A: number[][]) => {\n const G = jordanNormal(A);\n return diagonalRank(G);\n}\n\n// Calculate frobenius norm squared\nconst norm2 = (x: number[][]) => {\n const [n, m] = dims(x);\n\n let v = 0;\n for (let j = 0; j < m; ++j) {\n for (let i = 0; i < n; ++i) {\n v += sqr(x[j][i]);\n }\n }\n return v;\n};\n\n// Calculate frobenius norm\nconst norm = (x: number[][]) => sqrt(norm2(x));\n\n// Swap a later row to make (i,j) non-zero\nconst swapZero = (x: number[][], i: number, j: number) => {\n const [n] = dims(x);\n for (let k = j + 1; k < n; ++k) {\n if (x[k][i] !== 0) {\n [x[k], x[j]] = [x[j], x[k]];\n return true;\n }\n }\n return false;\n}\n\n// In-place vector ops to spare the GC\n\n// Scale a row by a constant\nconst scaleRow = (a: number[], s: number) => {\n const {length} = a;\n for (let i = 0; i < length; ++i) a[i] *= s;\n}\n\n// Multiply and add one row to another\nconst madRow = (a: number[], b: number[], s: number) => {\n const {length} = a;\n for (let i = 0; i < length; ++i) a[i] += b[i] * s;\n}\n\n// Get determinant\nconst determinant = (x: number[][]) => {\n const [n, m] = dims(x);\n let offset = 0;\n\n x = structuredClone(x);\n\n let det = 1;\n\n for (let i = 0; i < Math.min(n, m); ++i) {\n // Find next pivot element\n const pivot = x[i][i + offset];\n\n if (pivot == 0) {\n // Unsuitable, find other row to swap with\n if (!swapZero(x, i + offset, i)) {\n\n // All zeros, move one column over until out of bounds\n if (offset++ >= (m - n)) {\n return 0;\n }\n }\n\n // Repeat iteration\n i--;\n continue;\n }\n\n // Scale pivot row\n scaleRow(x[i], 1 / pivot);\n\n det *= pivot;\n\n // Subtract from other rows\n for (let j = 0; j < n; ++j) if (i !== j) {\n const pivot = x[j][i + offset];\n madRow(x[j], x[i], -pivot);\n }\n }\n\n return det;\n}\n\n// Convert matrix into jordan normal form if possible\nconst jordanNormal = (x: number[][]) => {\n const [n, m] = dims(x);\n let offset = 0;\n\n // Don't modify argument\n x = structuredClone(x);\n\n for (let i = 0; i < Math.min(n, m); ++i) {\n // Find next pivot element\n const pivot = x[i][i + offset];\n\n if (pivot == 0) {\n // Unsuitable, find other row to swap with\n if (!swapZero(x, i + offset, i)) {\n\n // All zeros, move one column over until out of bounds\n if (offset++ >= (m - n)) {\n return x;\n }\n }\n\n // Repeat iteration\n i--;\n continue;\n }\n\n // Scale pivot row\n scaleRow(x[i], 1 / pivot);\n\n // Subtract from other rows\n for (let j = 0; j < n; ++j) if (i !== j) {\n const pivot = x[j][i + offset];\n madRow(x[j], x[i], -pivot);\n }\n }\n return x;\n}\n\n// Verify if matrix has uninterrupted non-zero diagonal\nconst diagonalRank = (x: number[][]) => {\n const [n, m] = dims(x);\n const l = Math.min(n, m);\n\n let i = 0;\n for (; i < l; ++i) {\n if (x[i][i] == 0) break;\n }\n return i;\n}\n\nexport const Matrix = {\n dims,\n fill,\n identity,\n add,\n sub,\n mul,\n muls,\n tmul,\n transpose,\n concat,\n slice,\n rank,\n norm,\n norm2,\n determinant,\n jordanNormal,\n};\n"],"names":["Matrix","sqrt","Math","dims","m","length","size","a","b","fill","n","f","out","j","row","i","push","identity","add","na","ma","nb","mb","console","error","Error","sub","muls","s","mul","v","k","tmul","transpose","x","concat","map","_","slice","M","c","d","min","undefined","max","rank","A","G","jordanNormal","diagonalRank","norm2","sqr","norm","swapZero","scaleRow","madRow","determinant","offset","structuredClone","det","pivot","l"],"mappings":"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"}
package/cjs/number.cjs ADDED
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ function _export(target, all) {
6
+ for(var name in all)Object.defineProperty(target, name, {
7
+ enumerable: true,
8
+ get: Object.getOwnPropertyDescriptor(all, name).get
9
+ });
10
+ }
11
+ _export(exports, {
12
+ get clamp () {
13
+ return clamp;
14
+ },
15
+ get clerp () {
16
+ return clerp;
17
+ },
18
+ get cub () {
19
+ return cub;
20
+ },
21
+ get lerp () {
22
+ return lerp;
23
+ },
24
+ get seq () {
25
+ return seq;
26
+ },
27
+ get sqr () {
28
+ return sqr;
29
+ },
30
+ get π () {
31
+ return π;
32
+ },
33
+ get τ () {
34
+ return τ;
35
+ }
36
+ });
37
+ const { max, min } = Math;
38
+ const π = Math.PI;
39
+ const τ = 2 * π;
40
+ const clamp = (x, a, b)=>max(a, min(b, x));
41
+ const cub = (x)=>x * x * x;
42
+ const sqr = (x)=>x * x;
43
+ const lerp = (a, b, t)=>a * (1 - t) + b * t;
44
+ const clerp = (a, b, t)=>{
45
+ const d = (b - a + π) / τ % 1 * τ - π;
46
+ return lerp(a, a + d, t);
47
+ };
48
+ const seq = (n, start = 0, step = 1)=>Array.from({
49
+ length: n
50
+ }).map((_, i)=>start + i * step);
51
+
52
+ //# sourceMappingURL=number.js.map
@@ -0,0 +1,13 @@
1
+ export type XY = [number, number];
2
+ export type XYZ = [number, number, number];
3
+ export type XYZW = [number, number, number, number];
4
+ export type TypedArray = Int8Array | Uint8Array | Int16Array | Uint16Array | Int32Array | Uint32Array | Uint8ClampedArray | Float32Array | Float64Array;
5
+ export type VectorLike = TypedArray | number[];
6
+ export declare const π: number;
7
+ export declare const τ: number;
8
+ export declare const clamp: (x: number, a: number, b: number) => number;
9
+ export declare const cub: (x: number) => number;
10
+ export declare const sqr: (x: number) => number;
11
+ export declare const lerp: (a: number, b: number, t: number) => number;
12
+ export declare const clerp: (a: number, b: number, t: number) => number;
13
+ export declare const seq: (n: number, start?: number, step?: number) => number[];
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../packages/math/src/number.ts"],"sourcesContent":["export type XY = [number, number];\nexport type XYZ = [number, number, number];\nexport type XYZW = [number, number, number, number];\n\nexport type TypedArray =\n Int8Array |\n Uint8Array |\n Int16Array |\n Uint16Array |\n Int32Array |\n Uint32Array |\n Uint8ClampedArray |\n //Float16Array |\n Float32Array |\n Float64Array;\n\nexport type VectorLike = TypedArray | number[];\n\nconst { max, min } = Math;\n\nexport const π = Math.PI;\nexport const τ = 2*π;\n\nexport const clamp = (x: number, a: number, b: number) => max(a, min(b, x));\n\nexport const cub = (x: number) => x * x * x;\nexport const sqr = (x: number) => x * x;\n\nexport const lerp = (a: number, b: number, t: number) => a * (1 - t) + b * t;\nexport const clerp = (a: number, b: number, t: number) => {\n const d = (((b - a + π) / τ) % 1) * τ - π;\n return lerp(a, a + d, t);\n};\n\nexport const seq = (n: number, start: number = 0, step: number = 1) => Array.from({length: n}).map((_, i) => start + i * step);\n"],"names":["clamp","clerp","cub","lerp","seq","sqr","π","τ","max","min","Math","PI","x","a","b","t","d","n","start","step","Array","from","length","map","_","i"],"mappings":";;;;;;;;;;;QAuBaA;eAAAA;;QAMAC;eAAAA;;QAJAC;eAAAA;;QAGAC;eAAAA;;QAMAC;eAAAA;;QARAC;eAAAA;;QANAC;eAAAA;;QACAC;eAAAA;;;AAHb,MAAM,EAAEC,GAAG,EAAEC,GAAG,EAAE,GAAGC;AAEd,MAAMJ,IAAII,KAAKC,EAAE;AACjB,MAAMJ,IAAI,IAAED;AAEZ,MAAMN,QAAQ,CAACY,GAAWC,GAAWC,IAAcN,IAAIK,GAAGJ,IAAIK,GAAGF;AAEjE,MAAMV,MAAM,CAACU,IAAcA,IAAIA,IAAIA;AACnC,MAAMP,MAAM,CAACO,IAAcA,IAAIA;AAE/B,MAAMT,OAAO,CAACU,GAAWC,GAAWC,IAAcF,IAAK,CAAA,IAAIE,CAAAA,IAAKD,IAAIC;AACpE,MAAMd,QAAQ,CAACY,GAAWC,GAAWC;IAC1C,MAAMC,IAAI,AAAGF,CAAAA,IAAID,IAAIP,CAAA,IAAKC,IAAK,IAAKA,IAAID;IACxC,OAAOH,KAAKU,GAAGA,IAAIG,GAAGD;AACxB;AAEO,MAAMX,MAAM,CAACa,GAAWC,QAAgB,CAAC,EAAEC,OAAe,CAAC,GAAKC,MAAMC,IAAI,CAAC;QAACC,QAAQL;IAAC,GAAGM,GAAG,CAAC,CAACC,GAAGC,IAAMP,QAAQO,IAAIN"}
@@ -0,0 +1,174 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ function _export(target, all) {
6
+ for(var name in all)Object.defineProperty(target, name, {
7
+ enumerable: true,
8
+ get: Object.getOwnPropertyDescriptor(all, name).get
9
+ });
10
+ }
11
+ _export(exports, {
12
+ get solveCubic () {
13
+ return solveCubic;
14
+ },
15
+ get solveDepressedCubic () {
16
+ return solveDepressedCubic;
17
+ },
18
+ get solveDepressedQuartic () {
19
+ return solveDepressedQuartic;
20
+ },
21
+ get solveQuadratic () {
22
+ return solveQuadratic;
23
+ },
24
+ get solveQuartic () {
25
+ return solveQuartic;
26
+ }
27
+ });
28
+ const _number = require("./number.cjs");
29
+ const { acos, cbrt, cos, sign, sqrt } = Math;
30
+ const solveQuadratic = (a, b, c)=>{
31
+ const d = b * b - 4 * a * c;
32
+ if (d < 0) return [];
33
+ if (d === 0) return [
34
+ -b / (2 * a)
35
+ ];
36
+ const x1 = (-b - sqrt(d)) / (2 * a);
37
+ const x2 = (-b + sqrt(d)) / (2 * a);
38
+ return [
39
+ x1,
40
+ x2
41
+ ];
42
+ };
43
+ const solveCubic = (a, b, c, d)=>{
44
+ const o = -b / (3 * a);
45
+ const p = (3 * a * c - b * b) / (3 * a * a);
46
+ const q = (2 * b * b * b - 9 * a * b * c + 27 * a * a * d) / (27 * a * a * a);
47
+ return solveDepressedCubic(p, q).map((x)=>x + o);
48
+ };
49
+ const solveDepressedCubic = (p, q)=>{
50
+ const p_3 = p / 3;
51
+ const q_2 = q / 2;
52
+ const p3_27 = (0, _number.cub)(p_3);
53
+ const ds = p3_27 + (0, _number.sqr)(q_2);
54
+ if (ds === 0) {
55
+ // Multiple root
56
+ if (p) {
57
+ // Double root
58
+ const r1 = q / p_3;
59
+ const r2 = -q_2 / p_3;
60
+ return [
61
+ r1,
62
+ r2
63
+ ];
64
+ } else {
65
+ return [
66
+ 0
67
+ ];
68
+ }
69
+ } else if (ds > 0) {
70
+ // Single real root
71
+ // Vieta's substitution. Pick matching sign for better precision.
72
+ const w = -q_2 - sqrt(ds) * sign(q);
73
+ const cw = cbrt(w);
74
+ return [
75
+ cw - p_3 / cw
76
+ ];
77
+ } else {
78
+ // Three distinct real roots
79
+ // Imaginary sqrt(ds)
80
+ const dp = sqrt(-p3_27);
81
+ const theta = acos(-q_2 / dp) / 3;
82
+ const cw = cbrt(dp);
83
+ const r = cw - p_3 / cw;
84
+ const rs = [];
85
+ for(let i = 0; i < 3; ++i){
86
+ const cc = cos(theta - i * (2 / 3) * _number.π);
87
+ const v = cc * r;
88
+ rs.push(v);
89
+ }
90
+ return rs;
91
+ }
92
+ };
93
+ const solveQuartic = (a, b, c, d, e)=>{
94
+ const o = -b / (4 * a);
95
+ const aa = -3 * (0, _number.sqr)(b) / (8 * (0, _number.sqr)(a)) + c / a;
96
+ const bb = (0, _number.cub)(b) / (8 * (0, _number.cub)(a)) - b * c / (2 * (0, _number.sqr)(a)) + d / a;
97
+ const cc = -3 * (0, _number.sqr)((0, _number.sqr)(b)) / (256 * (0, _number.sqr)((0, _number.sqr)(a))) + c * (0, _number.sqr)(b) / (16 * (0, _number.cub)(a)) - b * d / (4 * (0, _number.sqr)(a)) + e / a;
98
+ if (bb === 0) {
99
+ // Biquadratic case
100
+ const q = solveQuadratic(1, aa, cc);
101
+ if (!q.length) return q;
102
+ const solutions = [];
103
+ const [q1, q2] = q;
104
+ if (q1 > 0) {
105
+ solutions.push(sqrt(q1) + o);
106
+ solutions.push(-sqrt(q1) + o);
107
+ }
108
+ if (q2 > 0) {
109
+ solutions.push(sqrt(q2) + o);
110
+ solutions.push(-sqrt(q2) + o);
111
+ }
112
+ if (q1 === 0) {
113
+ solutions.push(o);
114
+ }
115
+ if (q2 === 0) {
116
+ solutions.push(o);
117
+ }
118
+ return solutions;
119
+ }
120
+ // Quartic case
121
+ return solveDepressedQuartic(aa, bb, cc).map((x)=>x + o);
122
+ };
123
+ const solveDepressedQuartic = (a, b, c)=>{
124
+ const p = -(0, _number.sqr)(a) / 12 - c;
125
+ const q = -(0, _number.cub)(a) / 108 + a * c / 3 - (0, _number.sqr)(b) / 8;
126
+ const q_2 = q / 2;
127
+ const p_3 = p / 3;
128
+ const p3_27 = (0, _number.cub)(p_3);
129
+ const ds = p3_27 + (0, _number.sqr)(q_2);
130
+ const solutions = [];
131
+ let y = -Infinity;
132
+ if (ds >= 0) {
133
+ // Real R
134
+ const r = -q_2 - sqrt(ds) * sign(ds);
135
+ const u = cbrt(r);
136
+ y = -5 / 6 * a + (u ? u - p / (3 * u) : -cbrt(q));
137
+ } else {
138
+ // Complex R
139
+ const dp = sqrt(-p3_27);
140
+ const theta = acos(-q_2 / dp) / 3;
141
+ const ct = cos(theta);
142
+ const ul = cbrt(dp);
143
+ // U - P/(3U) is always real
144
+ y = -5 / 6 * a + (ul ? ct * (ul - p_3 / ul) : -cbrt(q));
145
+ }
146
+ const w2 = a + 2 * y;
147
+ const w = sqrt(w2);
148
+ if (w2 < 0) {
149
+ return solutions;
150
+ }
151
+ const qw1 = -(3 * a + 2 * y + 2 * b / w);
152
+ const qw2 = -(3 * a + 2 * y - 2 * b / w);
153
+ if (qw1 > 0) {
154
+ const t1 = (w + sqrt(qw1)) / 2;
155
+ const t2 = (w - sqrt(qw1)) / 2;
156
+ solutions.push(t1, t2);
157
+ }
158
+ if (qw1 === 0) {
159
+ solutions.push(w / 2);
160
+ }
161
+ if (qw2 > 0) {
162
+ const t3 = (-w + sqrt(qw2)) / 2;
163
+ const t4 = (-w - sqrt(qw2)) / 2;
164
+ if (!solutions.includes(t3)) solutions.push(t3);
165
+ if (!solutions.includes(t4)) solutions.push(t4);
166
+ }
167
+ if (qw2 === 0) {
168
+ const t = -w / 2;
169
+ if (!solutions.includes(t)) solutions.push(t);
170
+ }
171
+ return solutions;
172
+ };
173
+
174
+ //# sourceMappingURL=polynomial.js.map
@@ -0,0 +1,5 @@
1
+ export declare const solveQuadratic: (a: number, b: number, c: number) => number[];
2
+ export declare const solveCubic: (a: number, b: number, c: number, d: number) => number[];
3
+ export declare const solveDepressedCubic: (p: number, q: number) => number[];
4
+ export declare const solveQuartic: (a: number, b: number, c: number, d: number, e: number) => number[];
5
+ export declare const solveDepressedQuartic: (a: number, b: number, c: number) => number[];
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../packages/math/src/polynomial.ts"],"sourcesContent":["import { π, sqr, cub } from './number';\n\nconst { acos, cbrt, cos, sign, sqrt } = Math;\n\n// Solve a quadratic a*x^2 + b*x + c = 0\nexport const solveQuadratic = (a: number, b: number, c: number): number[] => {\n const d = b*b - 4*a*c;\n if (d < 0) return [];\n if (d === 0) return [-b / (2*a)];\n\n const x1 = (-b - sqrt(d)) / (2*a);\n const x2 = (-b + sqrt(d)) / (2*a);\n return [x1, x2];\n}\n\n// Solve a cubic a*x^3 + b*x^2 + c*x + d = 0\nexport const solveCubic = (a: number, b: number, c: number, d: number): number[] => {\n const o = -b / (3 * a);\n const p = (3 * a * c - b * b) / (3 * a * a);\n const q = (2 * b * b * b - 9 * a * b * c + 27 * a * a * d) / (27 * a * a * a);\n \n return solveDepressedCubic(p, q).map(x => x + o);\n};\n\n// Solve a depressed cubic t^3 + p*t + q = 0\nexport const solveDepressedCubic = (p: number, q: number): number[] => {\n const p_3 = p / 3;\n const q_2 = q / 2;\n\n const p3_27 = cub(p_3);\n const ds = p3_27 + sqr(q_2);\n\n if (ds === 0) {\n // Multiple root\n if (p) {\n // Double root\n const r1 = q / p_3;\n const r2 = -q_2 / p_3;\n return [r1, r2];\n }\n // Triple root\n else {\n return [0];\n }\n }\n else if (ds > 0) {\n // Single real root\n // Vieta's substitution. Pick matching sign for better precision.\n const w = -q_2 - sqrt(ds) * sign(q);\n const cw = cbrt(w);\n return [cw - p_3 / cw];\n }\n else {\n // Three distinct real roots\n // Imaginary sqrt(ds)\n const dp = sqrt(-p3_27);\n const theta = acos(-q_2 / dp) / 3;\n const cw = cbrt(dp);\n const r = cw - p_3 / cw;\n\n const rs = [];\n for (let i = 0; i < 3; ++i) {\n const cc = cos(theta - i * (2/3) * π);\n const v = cc * r;\n rs.push(v);\n }\n\n return rs;\n }\n};\n\n// Solve a quartic a*x^4 + b*x^3 + c*x^2 + d*x + e = 0\nexport const solveQuartic = (a: number, b: number, c: number, d: number, e: number): number[] => {\n const o = -b / (4 * a);\n const aa = -3 * sqr(b) / (8 * sqr(a)) + c / a;\n const bb = cub(b) / (8 * cub(a)) - b * c / (2 * sqr(a)) + d / a;\n const cc = -3 * sqr(sqr(b)) / (256 * sqr(sqr(a))) + c * sqr(b) / (16 * cub(a)) - b * d / (4 * sqr(a)) + e / a;\n\n if (bb === 0) {\n // Biquadratic case\n const q = solveQuadratic(1, aa, cc);\n if (!q.length) return q;\n\n const solutions = [];\n const [q1, q2] = q;\n if (q1 > 0) {\n solutions.push(sqrt(q1) + o);\n solutions.push(-sqrt(q1) + o);\n }\n if (q2 > 0) {\n solutions.push(sqrt(q2) + o);\n solutions.push(-sqrt(q2) + o);\n }\n if (q1 === 0) {\n solutions.push(o);\n }\n if (q2 === 0) {\n solutions.push(o);\n }\n return solutions;\n }\n\n // Quartic case\n return solveDepressedQuartic(aa, bb, cc).map(x => x + o);\n};\n\n// Solve a depressed quartic t^4 + a*t^2 + b*t + c = 0\nexport const solveDepressedQuartic = (a: number, b: number, c: number): number[] => {\n const p = -sqr(a) / 12 - c;\n const q = -cub(a) / 108 + a * c / 3 - sqr(b) / 8;\n\n const q_2 = q / 2;\n const p_3 = p / 3;\n\n const p3_27 = cub(p_3);\n const ds = p3_27 + sqr(q_2);\n\n const solutions: number[] = [];\n\n let y = -Infinity;\n if (ds >= 0) {\n // Real R\n const r = -q_2 - sqrt(ds) * sign(ds);\n const u = cbrt(r);\n\n y = -5/6 * a + (u ? u - p / (3 * u) : -cbrt(q));\n }\n else {\n // Complex R\n const dp = sqrt(-p3_27);\n const theta = acos(-q_2 / dp) / 3;\n const ct = cos(theta);\n const ul = cbrt(dp);\n\n // U - P/(3U) is always real\n y = -5/6 * a + (ul ? ct * (ul - p_3 / ul) : -cbrt(q));\n }\n\n const w2 = a + 2 * y;\n const w = sqrt(w2);\n if (w2 < 0) {\n return solutions;\n }\n\n const qw1 = -(3 * a + 2 * y + 2 * b / w);\n const qw2 = -(3 * a + 2 * y - 2 * b / w);\n\n if (qw1 > 0) {\n const t1 = (w + sqrt(qw1)) / 2;\n const t2 = (w - sqrt(qw1)) / 2;\n solutions.push(t1, t2);\n }\n if (qw1 === 0) {\n solutions.push(w / 2);\n }\n if (qw2 > 0) {\n const t3 = (-w + sqrt(qw2)) / 2;\n const t4 = (-w - sqrt(qw2)) / 2;\n if (!solutions.includes(t3)) solutions.push(t3);\n if (!solutions.includes(t4)) solutions.push(t4);\n }\n if (qw2 === 0) {\n const t = -w / 2;\n if (!solutions.includes(t)) solutions.push(t);\n }\n \n return solutions;\n};\n"],"names":["solveCubic","solveDepressedCubic","solveDepressedQuartic","solveQuadratic","solveQuartic","acos","cbrt","cos","sign","sqrt","Math","a","b","c","d","x1","x2","o","p","q","map","x","p_3","q_2","p3_27","cub","ds","sqr","r1","r2","w","cw","dp","theta","r","rs","i","cc","π","v","push","e","aa","bb","length","solutions","q1","q2","y","Infinity","u","ct","ul","w2","qw1","qw2","t1","t2","t3","t4","includes","t"],"mappings":";;;;;;;;;;;QAgBaA;eAAAA;;QASAC;eAAAA;;QAkFAC;eAAAA;;QAtGAC;eAAAA;;QAmEAC;eAAAA;;;wBAxEe;AAE5B,MAAM,EAAEC,IAAI,EAAEC,IAAI,EAAEC,GAAG,EAAEC,IAAI,EAAEC,IAAI,EAAE,GAAGC;AAGjC,MAAMP,iBAAiB,CAACQ,GAAWC,GAAWC;IACnD,MAAMC,IAAIF,IAAEA,IAAI,IAAED,IAAEE;IACpB,IAAIC,IAAI,GAAG,OAAO,EAAE;IACpB,IAAIA,MAAM,GAAG,OAAO;QAAC,CAACF,IAAK,CAAA,IAAED,CAAAA;KAAG;IAEhC,MAAMI,KAAK,AAAC,CAAA,CAACH,IAAIH,KAAKK,EAAC,IAAM,CAAA,IAAEH,CAAAA;IAC/B,MAAMK,KAAK,AAAC,CAAA,CAACJ,IAAIH,KAAKK,EAAC,IAAM,CAAA,IAAEH,CAAAA;IAC/B,OAAO;QAACI;QAAIC;KAAG;AACjB;AAGO,MAAMhB,aAAa,CAACW,GAAWC,GAAWC,GAAWC;IAC1D,MAAMG,IAAI,CAACL,IAAK,CAAA,IAAID,CAAAA;IACpB,MAAMO,IAAI,AAAC,CAAA,IAAIP,IAAIE,IAAID,IAAIA,CAAAA,IAAM,CAAA,IAAID,IAAIA,CAAAA;IACzC,MAAMQ,IAAI,AAAC,CAAA,IAAIP,IAAIA,IAAIA,IAAI,IAAID,IAAIC,IAAIC,IAAI,KAAKF,IAAIA,IAAIG,CAAAA,IAAM,CAAA,KAAKH,IAAIA,IAAIA,CAAAA;IAE3E,OAAOV,oBAAoBiB,GAAGC,GAAGC,GAAG,CAACC,CAAAA,IAAKA,IAAIJ;AAChD;AAGO,MAAMhB,sBAAsB,CAACiB,GAAWC;IAC7C,MAAMG,MAAMJ,IAAI;IAChB,MAAMK,MAAMJ,IAAI;IAEhB,MAAMK,QAAQC,IAAAA,WAAG,EAACH;IAClB,MAAMI,KAAKF,QAAQG,IAAAA,WAAG,EAACJ;IAEvB,IAAIG,OAAO,GAAG;QACZ,gBAAgB;QAChB,IAAIR,GAAG;YACL,cAAc;YACd,MAAMU,KAAKT,IAAIG;YACf,MAAMO,KAAK,CAACN,MAAMD;YAClB,OAAO;gBAACM;gBAAIC;aAAG;QACjB,OAEK;YACH,OAAO;gBAAC;aAAE;QACZ;IACF,OACK,IAAIH,KAAK,GAAG;QACf,mBAAmB;QACnB,iEAAiE;QACjE,MAAMI,IAAI,CAACP,MAAMd,KAAKiB,MAAMlB,KAAKW;QACjC,MAAMY,KAAKzB,KAAKwB;QAChB,OAAO;YAACC,KAAKT,MAAMS;SAAG;IACxB,OACK;QACH,4BAA4B;QAC5B,qBAAqB;QACrB,MAAMC,KAAKvB,KAAK,CAACe;QACjB,MAAMS,QAAQ5B,KAAK,CAACkB,MAAMS,MAAM;QAChC,MAAMD,KAAKzB,KAAK0B;QAChB,MAAME,IAAIH,KAAKT,MAAMS;QAErB,MAAMI,KAAK,EAAE;QACb,IAAK,IAAIC,IAAI,GAAGA,IAAI,GAAG,EAAEA,EAAG;YAC1B,MAAMC,KAAK9B,IAAI0B,QAAQG,IAAK,CAAA,IAAE,CAAA,IAAKE,SAAC;YACpC,MAAMC,IAAIF,KAAKH;YACfC,GAAGK,IAAI,CAACD;QACV;QAEA,OAAOJ;IACT;AACF;AAGO,MAAM/B,eAAe,CAACO,GAAWC,GAAWC,GAAWC,GAAW2B;IACvE,MAAMxB,IAAI,CAACL,IAAK,CAAA,IAAID,CAAAA;IACpB,MAAM+B,KAAK,CAAC,IAAIf,IAAAA,WAAG,EAACf,KAAM,CAAA,IAAIe,IAAAA,WAAG,EAAChB,EAAC,IAAKE,IAAIF;IAC5C,MAAMgC,KAAKlB,IAAAA,WAAG,EAACb,KAAM,CAAA,IAAIa,IAAAA,WAAG,EAACd,EAAC,IAAKC,IAAIC,IAAK,CAAA,IAAIc,IAAAA,WAAG,EAAChB,EAAC,IAAKG,IAAIH;IAC9D,MAAM0B,KAAK,CAAC,IAAIV,IAAAA,WAAG,EAACA,IAAAA,WAAG,EAACf,MAAO,CAAA,MAAMe,IAAAA,WAAG,EAACA,IAAAA,WAAG,EAAChB,GAAE,IAAKE,IAAIc,IAAAA,WAAG,EAACf,KAAM,CAAA,KAAKa,IAAAA,WAAG,EAACd,EAAC,IAAKC,IAAIE,IAAK,CAAA,IAAIa,IAAAA,WAAG,EAAChB,EAAC,IAAK8B,IAAI9B;IAE5G,IAAIgC,OAAO,GAAG;QACZ,mBAAmB;QACnB,MAAMxB,IAAIhB,eAAe,GAAGuC,IAAIL;QAChC,IAAI,CAAClB,EAAEyB,MAAM,EAAE,OAAOzB;QAEtB,MAAM0B,YAAY,EAAE;QACpB,MAAM,CAACC,IAAIC,GAAG,GAAG5B;QACjB,IAAI2B,KAAK,GAAG;YACVD,UAAUL,IAAI,CAAC/B,KAAKqC,MAAM7B;YAC1B4B,UAAUL,IAAI,CAAC,CAAC/B,KAAKqC,MAAM7B;QAC7B;QACA,IAAI8B,KAAK,GAAG;YACVF,UAAUL,IAAI,CAAC/B,KAAKsC,MAAM9B;YAC1B4B,UAAUL,IAAI,CAAC,CAAC/B,KAAKsC,MAAM9B;QAC7B;QACA,IAAI6B,OAAO,GAAG;YACZD,UAAUL,IAAI,CAACvB;QACjB;QACA,IAAI8B,OAAO,GAAG;YACZF,UAAUL,IAAI,CAACvB;QACjB;QACA,OAAO4B;IACT;IAEA,eAAe;IACf,OAAO3C,sBAAsBwC,IAAIC,IAAIN,IAAIjB,GAAG,CAACC,CAAAA,IAAKA,IAAIJ;AACxD;AAGO,MAAMf,wBAAwB,CAACS,GAAWC,GAAWC;IAC1D,MAAMK,IAAI,CAACS,IAAAA,WAAG,EAAChB,KAAK,KAAKE;IACzB,MAAMM,IAAI,CAACM,IAAAA,WAAG,EAACd,KAAK,MAAMA,IAAIE,IAAI,IAAIc,IAAAA,WAAG,EAACf,KAAK;IAE/C,MAAMW,MAAMJ,IAAI;IAChB,MAAMG,MAAMJ,IAAI;IAEhB,MAAMM,QAAQC,IAAAA,WAAG,EAACH;IAClB,MAAMI,KAAKF,QAAQG,IAAAA,WAAG,EAACJ;IAEvB,MAAMsB,YAAsB,EAAE;IAE9B,IAAIG,IAAI,CAACC;IACT,IAAIvB,MAAM,GAAG;QACX,SAAS;QACT,MAAMQ,IAAI,CAACX,MAAMd,KAAKiB,MAAMlB,KAAKkB;QACjC,MAAMwB,IAAI5C,KAAK4B;QAEfc,IAAI,CAAC,IAAE,IAAIrC,IAAKuC,CAAAA,IAAIA,IAAIhC,IAAK,CAAA,IAAIgC,CAAAA,IAAK,CAAC5C,KAAKa,EAAC;IAC/C,OACK;QACH,YAAY;QACZ,MAAMa,KAAKvB,KAAK,CAACe;QACjB,MAAMS,QAAQ5B,KAAK,CAACkB,MAAMS,MAAM;QAChC,MAAMmB,KAAK5C,IAAI0B;QACf,MAAMmB,KAAK9C,KAAK0B;QAEhB,4BAA4B;QAC5BgB,IAAI,CAAC,IAAE,IAAIrC,IAAKyC,CAAAA,KAAKD,KAAMC,CAAAA,KAAK9B,MAAM8B,EAAC,IAAK,CAAC9C,KAAKa,EAAC;IACrD;IAEA,MAAMkC,KAAK1C,IAAI,IAAIqC;IACnB,MAAMlB,IAAIrB,KAAK4C;IACf,IAAIA,KAAK,GAAG;QACV,OAAOR;IACT;IAEA,MAAMS,MAAM,CAAE,CAAA,IAAI3C,IAAI,IAAIqC,IAAI,IAAIpC,IAAIkB,CAAAA;IACtC,MAAMyB,MAAM,CAAE,CAAA,IAAI5C,IAAI,IAAIqC,IAAI,IAAIpC,IAAIkB,CAAAA;IAEtC,IAAIwB,MAAM,GAAG;QACX,MAAME,KAAK,AAAC1B,CAAAA,IAAIrB,KAAK6C,IAAG,IAAK;QAC7B,MAAMG,KAAK,AAAC3B,CAAAA,IAAIrB,KAAK6C,IAAG,IAAK;QAC7BT,UAAUL,IAAI,CAACgB,IAAIC;IACrB;IACA,IAAIH,QAAQ,GAAG;QACbT,UAAUL,IAAI,CAACV,IAAI;IACrB;IACA,IAAIyB,MAAM,GAAG;QACX,MAAMG,KAAK,AAAC,CAAA,CAAC5B,IAAIrB,KAAK8C,IAAG,IAAK;QAC9B,MAAMI,KAAK,AAAC,CAAA,CAAC7B,IAAIrB,KAAK8C,IAAG,IAAK;QAC9B,IAAI,CAACV,UAAUe,QAAQ,CAACF,KAAKb,UAAUL,IAAI,CAACkB;QAC5C,IAAI,CAACb,UAAUe,QAAQ,CAACD,KAAKd,UAAUL,IAAI,CAACmB;IAC9C;IACA,IAAIJ,QAAQ,GAAG;QACb,MAAMM,IAAI,CAAC/B,IAAI;QACf,IAAI,CAACe,UAAUe,QAAQ,CAACC,IAAIhB,UAAUL,IAAI,CAACqB;IAC7C;IAEA,OAAOhB;AACT"}
package/cjs/vector.cjs ADDED
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "Vector", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return Vector;
9
+ }
10
+ });
11
+ // Binary dot-like operator
12
+ const binary = (f)=>(a, b)=>{
13
+ const { length } = a;
14
+ const c = a.slice();
15
+ for(let i = 0; i < length; ++i){
16
+ c[i] = f(a[i], b[i]);
17
+ }
18
+ return c;
19
+ };
20
+ // Unary reduction operator
21
+ const reduce = (f)=>(v, accum = 0)=>{
22
+ const { length } = v;
23
+ for(let i = 0; i < length; ++i){
24
+ accum = f(accum, v[i], i);
25
+ }
26
+ return accum;
27
+ };
28
+ // Binary reduction operator
29
+ const reduce2 = (f)=>(a, b, accum = 0)=>{
30
+ const { length } = a;
31
+ for(let i = 0; i < length; ++i){
32
+ accum = f(accum, a[i], b[i], i);
33
+ }
34
+ return accum;
35
+ };
36
+ // Scalar operators
37
+ const plus = (x, y)=>x + y;
38
+ const minus = (x, y)=>x - y;
39
+ const multiply = (x, y)=>x * y;
40
+ const divide = (x, y)=>x / y;
41
+ const minimum = (x, y)=>Math.min(x, y);
42
+ const maximum = (x, y)=>Math.max(x, y);
43
+ const plus2 = (x, y)=>x + y * y;
44
+ const mad = (x, y, z)=>x + y * z;
45
+ const madl2 = (x, y, z)=>x + (y - z) * (y - z);
46
+ // Vector operators
47
+ const add = binary(plus);
48
+ const sub = binary(minus);
49
+ const mul = binary(multiply);
50
+ const div = binary(divide);
51
+ const dot = reduce2(mad);
52
+ const adds = (a, s)=>a.map((x)=>x + s);
53
+ const subs = (a, s)=>a.map((x)=>x - s);
54
+ const muls = (a, s)=>a.map((x)=>x * s);
55
+ const scale = muls;
56
+ const sum = reduce(plus);
57
+ const len2 = reduce(plus2);
58
+ const len = (a)=>Math.sqrt(len2(a));
59
+ const dist2 = reduce2(madl2);
60
+ const dist = (a, b)=>Math.sqrt(dist2(a, b));
61
+ const abs = (a)=>a.map((x)=>Math.abs(x));
62
+ const unit = (a)=>{
63
+ const l = len(a);
64
+ return scale(a, l ? 1 / l : 0);
65
+ };
66
+ const minEl = (a)=>reduce(minimum)(a, Infinity);
67
+ const maxEl = (a)=>reduce(maximum)(a, -Infinity);
68
+ const min = (a, b)=>a.map((_, i)=>Math.min(a[i], b[i]));
69
+ const max = (a, b)=>a.map((_, i)=>Math.max(a[i], b[i]));
70
+ const clamp = (vector, a = 0, b = 1)=>vector.map((v)=>Math.max(a, Math.min(b, v)));
71
+ const mins = (a, b)=>a.map((_, i)=>Math.min(a[i], b));
72
+ const maxs = (a, b)=>a.map((_, i)=>Math.max(a[i], b));
73
+ const lerp = (a, b, t)=>add(a, scale(sub(b, a), t));
74
+ const project = (a, n)=>sub(a, scale(n, dot(a, n)));
75
+ const select = (a, b, m)=>m.map((s, i)=>s ? b[i] : a[i]);
76
+ const Vector = {
77
+ binary,
78
+ reduce,
79
+ reduce2,
80
+ add,
81
+ sub,
82
+ mul,
83
+ div,
84
+ dot,
85
+ adds,
86
+ subs,
87
+ muls,
88
+ mins,
89
+ maxs,
90
+ scale,
91
+ sum,
92
+ len2,
93
+ len,
94
+ dist2,
95
+ dist,
96
+ abs,
97
+ unit,
98
+ minEl,
99
+ maxEl,
100
+ min,
101
+ max,
102
+ clamp,
103
+ lerp,
104
+ project,
105
+ select
106
+ };
107
+
108
+ //# sourceMappingURL=vector.js.map