@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/LICENSE.md +28 -0
- package/README.md +24 -2
- package/cjs/ease.cjs +285 -0
- package/cjs/ease.d.cts +25 -0
- package/cjs/ease.js.map +1 -0
- package/cjs/index.cjs +25 -0
- package/cjs/index.d.cts +6 -0
- package/cjs/index.js.map +1 -0
- package/cjs/linalg.cjs +101 -0
- package/cjs/linalg.d.cts +4 -0
- package/cjs/linalg.js.map +1 -0
- package/cjs/math.cjs +52 -0
- package/cjs/math.js.map +1 -0
- package/cjs/matrix.cjs +247 -0
- package/cjs/matrix.d.cts +18 -0
- package/cjs/matrix.js.map +1 -0
- package/cjs/number.cjs +52 -0
- package/cjs/number.d.cts +13 -0
- package/cjs/number.js.map +1 -0
- package/cjs/polynomial.cjs +174 -0
- package/cjs/polynomial.d.cts +5 -0
- package/cjs/polynomial.js.map +1 -0
- package/cjs/vector.cjs +108 -0
- package/cjs/vector.d.cts +32 -0
- package/cjs/vector.js.map +1 -0
- package/mjs/ease.d.mts +25 -0
- package/mjs/ease.js.map +1 -0
- package/mjs/ease.mjs +247 -0
- package/mjs/index.d.mts +6 -0
- package/mjs/index.js.map +1 -0
- package/mjs/index.mjs +8 -0
- package/mjs/linalg.d.mts +4 -0
- package/mjs/linalg.js.map +1 -0
- package/mjs/linalg.mjs +81 -0
- package/mjs/matrix.d.mts +18 -0
- package/mjs/matrix.js.map +1 -0
- package/mjs/matrix.mjs +237 -0
- package/mjs/number.d.mts +13 -0
- package/mjs/number.js.map +1 -0
- package/mjs/number.mjs +16 -0
- package/mjs/polynomial.d.mts +5 -0
- package/mjs/polynomial.js.map +1 -0
- package/mjs/polynomial.mjs +152 -0
- package/mjs/vector.d.mts +32 -0
- package/mjs/vector.js.map +1 -0
- package/mjs/vector.mjs +98 -0
- package/package.json +19 -3
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
|
package/cjs/matrix.d.cts
ADDED
|
@@ -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
|
package/cjs/number.d.cts
ADDED
|
@@ -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":"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"}
|
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
|