curvy 0.3.3 → 1.0.1
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 +21 -0
- package/dist/curve/cubic2d.d.mts +31 -0
- package/dist/curve/cubic2d.d.ts +31 -0
- package/dist/curve/cubic2d.mjs +96 -0
- package/dist/curve/linear2d.d.mts +28 -0
- package/dist/curve/linear2d.d.ts +28 -0
- package/dist/curve/linear2d.mjs +48 -0
- package/dist/curve/quadratic2d.d.mts +33 -0
- package/dist/curve/quadratic2d.d.ts +33 -0
- package/dist/curve/quadratic2d.mjs +86 -0
- package/dist/interval.d.mts +58 -0
- package/dist/interval.d.ts +58 -0
- package/dist/interval.mjs +88 -0
- package/dist/matrix/matrix2x2.d.mts +49 -0
- package/dist/matrix/matrix2x2.d.ts +49 -0
- package/dist/matrix/matrix2x2.mjs +23 -0
- package/dist/matrix/matrix3x3.d.mts +63 -0
- package/dist/matrix/matrix3x3.d.ts +63 -0
- package/dist/matrix/matrix3x3.mjs +26 -0
- package/dist/matrix/matrix4x4.d.mts +72 -0
- package/dist/matrix/matrix4x4.d.ts +72 -0
- package/dist/matrix/matrix4x4.mjs +214 -0
- package/dist/path/cubic2d.d.mts +29 -0
- package/dist/path/cubic2d.d.ts +29 -0
- package/dist/path/cubic2d.mjs +60 -0
- package/dist/path/linear2d.d.mts +29 -0
- package/dist/path/linear2d.d.ts +29 -0
- package/dist/path/linear2d.mjs +54 -0
- package/dist/path/quadratic2d.d.mts +30 -0
- package/dist/path/quadratic2d.d.ts +30 -0
- package/dist/path/quadratic2d.mjs +60 -0
- package/dist/polynomial/cubic.d.mts +7 -0
- package/dist/polynomial/cubic.d.ts +7 -0
- package/dist/polynomial/cubic.mjs +147 -0
- package/dist/polynomial/linear.d.mts +7 -0
- package/dist/polynomial/linear.d.ts +7 -0
- package/dist/polynomial/linear.mjs +22 -0
- package/dist/polynomial/quadratic.d.mts +7 -0
- package/dist/polynomial/quadratic.d.ts +7 -0
- package/dist/polynomial/quadratic.mjs +23 -0
- package/dist/shared/curvy.BN-oFBsc.d.mts +26 -0
- package/dist/shared/curvy.BN-oFBsc.d.ts +26 -0
- package/dist/shared/curvy.CT38g_II.d.mts +22 -0
- package/dist/shared/curvy.CT38g_II.d.ts +22 -0
- package/dist/shared/curvy.ChkqgKuv.mjs +119 -0
- package/dist/shared/curvy.CkJRVnqj.d.ts +155 -0
- package/dist/shared/curvy.Cty3LrOR.mjs +70 -0
- package/dist/shared/curvy.D7MEXd5g.mjs +130 -0
- package/dist/shared/curvy.D7bhnwZy.mjs +52 -0
- package/dist/shared/curvy.DB7nQmVs.mjs +79 -0
- package/dist/shared/curvy.DM6AiKbn.mjs +119 -0
- package/dist/shared/curvy.DOSsf40r.mjs +49 -0
- package/dist/shared/curvy.DmVFTi0N.mjs +34 -0
- package/dist/shared/curvy.DwHW5Fqt.d.mts +155 -0
- package/dist/shared/curvy.bvP77ZZm.mjs +123 -0
- package/dist/splines/bezier2d.d.mts +43 -0
- package/dist/splines/bezier2d.d.ts +43 -0
- package/dist/splines/bezier2d.mjs +148 -0
- package/dist/vector/vector2.d.mts +41 -0
- package/dist/vector/vector2.d.ts +41 -0
- package/dist/vector/vector2.mjs +17 -0
- package/dist/vector/vector3.d.mts +38 -0
- package/dist/vector/vector3.d.ts +38 -0
- package/dist/vector/vector3.mjs +16 -0
- package/dist/vector/vector4.d.mts +39 -0
- package/dist/vector/vector4.d.ts +39 -0
- package/dist/vector/vector4.mjs +16 -0
- package/package.json +78 -37
- package/dist/axis.cjs +0 -14
- package/dist/axis.d.cts +0 -20
- package/dist/axis.d.mts +0 -20
- package/dist/axis.d.ts +0 -20
- package/dist/axis.mjs +0 -3
- package/dist/convert.cjs +0 -74
- package/dist/convert.d.cts +0 -6
- package/dist/convert.d.mts +0 -6
- package/dist/convert.d.ts +0 -6
- package/dist/convert.mjs +0 -68
- package/dist/curve.cjs +0 -365
- package/dist/curve.d.cts +0 -20
- package/dist/curve.d.mts +0 -20
- package/dist/curve.d.ts +0 -20
- package/dist/curve.mjs +0 -354
- package/dist/shared/curvy.262f6070.cjs +0 -16
- package/dist/shared/curvy.7876e09e.mjs +0 -323
- package/dist/shared/curvy.9cd8b44c.mjs +0 -13
- package/dist/shared/curvy.db103082.cjs +0 -335
- package/dist/shared/curvy.df73166c.d.cts +0 -38
- package/dist/shared/curvy.df73166c.d.mts +0 -38
- package/dist/shared/curvy.df73166c.d.ts +0 -38
- package/dist/splines.cjs +0 -150
- package/dist/splines.d.cts +0 -27
- package/dist/splines.d.mts +0 -27
- package/dist/splines.d.ts +0 -27
- package/dist/splines.mjs +0 -138
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
declare class Pipeable {
|
|
2
|
+
pipe<A>(this: A): A;
|
|
3
|
+
pipe<A, B = never>(this: A, ab: (_: A) => B): B;
|
|
4
|
+
pipe<A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C;
|
|
5
|
+
pipe<A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D;
|
|
6
|
+
pipe<A, B = never, C = never, D = never, E = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E): E;
|
|
7
|
+
pipe<A, B = never, C = never, D = never, E = never, F = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F): F;
|
|
8
|
+
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G): G;
|
|
9
|
+
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H): H;
|
|
10
|
+
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I): I;
|
|
11
|
+
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J): J;
|
|
12
|
+
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K): K;
|
|
13
|
+
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L): L;
|
|
14
|
+
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M): M;
|
|
15
|
+
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N): N;
|
|
16
|
+
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O): O;
|
|
17
|
+
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P): P;
|
|
18
|
+
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never, Q = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q): Q;
|
|
19
|
+
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never, Q = never, R = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q, qr: (_: Q) => R): R;
|
|
20
|
+
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never, Q = never, R = never, S = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q, qr: (_: Q) => R, rs: (_: R) => S): S;
|
|
21
|
+
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never, Q = never, R = never, S = never, T = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q, qr: (_: Q) => R, rs: (_: R) => S, st: (_: S) => T): T;
|
|
22
|
+
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never, Q = never, R = never, S = never, T = never, U = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q, qr: (_: Q) => R, rs: (_: R) => S, st: (_: S) => T, tu: (_: T) => U): U;
|
|
23
|
+
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never, Q = never, R = never, S = never, T = never, U = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q, qr: (_: Q) => R, rs: (_: R) => S, st: (_: S) => T, tu: (_: T) => U): U;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export { Pipeable as P };
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
type TwoDimensionalIndex = 0 | 1;
|
|
2
|
+
type TwoDimensionalComponent = 'x' | 'y';
|
|
3
|
+
interface TwoDimensional<T> {
|
|
4
|
+
readonly x: T;
|
|
5
|
+
readonly y: T;
|
|
6
|
+
readonly 0: T;
|
|
7
|
+
readonly 1: T;
|
|
8
|
+
}
|
|
9
|
+
type ThreeDimensionalIndex = TwoDimensionalIndex | 2;
|
|
10
|
+
type ThreeDimensionalComponent = TwoDimensionalComponent | 'z';
|
|
11
|
+
interface ThreeDimensional<T> extends TwoDimensional<T> {
|
|
12
|
+
readonly z: T;
|
|
13
|
+
readonly 2: T;
|
|
14
|
+
}
|
|
15
|
+
type FourDimensionalIndex = ThreeDimensionalIndex | 3;
|
|
16
|
+
type FourDimensionalComponent = ThreeDimensionalComponent | 'w';
|
|
17
|
+
interface FourDimensional<T> extends ThreeDimensional<T> {
|
|
18
|
+
readonly w: T;
|
|
19
|
+
readonly 3: T;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export type { FourDimensionalIndex as F, ThreeDimensionalIndex as T, FourDimensionalComponent as a, ThreeDimensionalComponent as b, TwoDimensionalIndex as c, TwoDimensionalComponent as d, TwoDimensional as e, FourDimensional as f, ThreeDimensional as g };
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
type TwoDimensionalIndex = 0 | 1;
|
|
2
|
+
type TwoDimensionalComponent = 'x' | 'y';
|
|
3
|
+
interface TwoDimensional<T> {
|
|
4
|
+
readonly x: T;
|
|
5
|
+
readonly y: T;
|
|
6
|
+
readonly 0: T;
|
|
7
|
+
readonly 1: T;
|
|
8
|
+
}
|
|
9
|
+
type ThreeDimensionalIndex = TwoDimensionalIndex | 2;
|
|
10
|
+
type ThreeDimensionalComponent = TwoDimensionalComponent | 'z';
|
|
11
|
+
interface ThreeDimensional<T> extends TwoDimensional<T> {
|
|
12
|
+
readonly z: T;
|
|
13
|
+
readonly 2: T;
|
|
14
|
+
}
|
|
15
|
+
type FourDimensionalIndex = ThreeDimensionalIndex | 3;
|
|
16
|
+
type FourDimensionalComponent = ThreeDimensionalComponent | 'w';
|
|
17
|
+
interface FourDimensional<T> extends ThreeDimensional<T> {
|
|
18
|
+
readonly w: T;
|
|
19
|
+
readonly 3: T;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export type { FourDimensionalIndex as F, ThreeDimensionalIndex as T, FourDimensionalComponent as a, ThreeDimensionalComponent as b, TwoDimensionalIndex as c, TwoDimensionalComponent as d, TwoDimensional as e, FourDimensional as f, ThreeDimensional as g };
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
const dual = (arity, body) => {
|
|
2
|
+
if (typeof arity === "function") {
|
|
3
|
+
return function(...args) {
|
|
4
|
+
if (arity(args)) {
|
|
5
|
+
return body.apply(this, args);
|
|
6
|
+
}
|
|
7
|
+
return (self) => body(self, ...args);
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
switch (arity) {
|
|
11
|
+
case 0:
|
|
12
|
+
case 1:
|
|
13
|
+
throw new RangeError(`Invalid arity ${arity}`);
|
|
14
|
+
case 2:
|
|
15
|
+
return (...args) => {
|
|
16
|
+
const [a, b] = args;
|
|
17
|
+
if (args.length >= 2) {
|
|
18
|
+
return body(a, b);
|
|
19
|
+
}
|
|
20
|
+
return (self) => body(self, a);
|
|
21
|
+
};
|
|
22
|
+
case 3:
|
|
23
|
+
return (...args) => {
|
|
24
|
+
const [a, b, c] = args;
|
|
25
|
+
if (args.length >= 3) {
|
|
26
|
+
return body(a, b, c);
|
|
27
|
+
}
|
|
28
|
+
return (self) => body(self, a, b);
|
|
29
|
+
};
|
|
30
|
+
case 4:
|
|
31
|
+
return (...args) => {
|
|
32
|
+
const [a, b, c, d] = args;
|
|
33
|
+
if (args.length >= 4) {
|
|
34
|
+
return body(a, b, c, d);
|
|
35
|
+
}
|
|
36
|
+
return (self) => body(self, a, b, c);
|
|
37
|
+
};
|
|
38
|
+
case 5:
|
|
39
|
+
return (...args) => {
|
|
40
|
+
const [a, b, c, d, e] = args;
|
|
41
|
+
if (args.length >= 5) {
|
|
42
|
+
return body(a, b, c, d, e);
|
|
43
|
+
}
|
|
44
|
+
return (self) => body(self, a, b, c, d);
|
|
45
|
+
};
|
|
46
|
+
default:
|
|
47
|
+
return function(...args) {
|
|
48
|
+
if (args.length >= arity) {
|
|
49
|
+
return body.apply(this, args);
|
|
50
|
+
}
|
|
51
|
+
return (self) => body(self, ...args);
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
function pipe(...args) {
|
|
56
|
+
const [a, ab, bc, cd, de, ef, fg, gh, hi] = args;
|
|
57
|
+
switch (args.length) {
|
|
58
|
+
case 1:
|
|
59
|
+
return a;
|
|
60
|
+
case 2:
|
|
61
|
+
return ab(a);
|
|
62
|
+
case 3:
|
|
63
|
+
return bc(ab(a));
|
|
64
|
+
case 4:
|
|
65
|
+
return cd(bc(ab(a)));
|
|
66
|
+
case 5:
|
|
67
|
+
return de(cd(bc(ab(a))));
|
|
68
|
+
case 6:
|
|
69
|
+
return ef(de(cd(bc(ab(a)))));
|
|
70
|
+
case 7:
|
|
71
|
+
return fg(ef(de(cd(bc(ab(a))))));
|
|
72
|
+
case 8:
|
|
73
|
+
return gh(fg(ef(de(cd(bc(ab(a)))))));
|
|
74
|
+
case 9:
|
|
75
|
+
return hi(gh(fg(ef(de(cd(bc(ab(a))))))));
|
|
76
|
+
default: {
|
|
77
|
+
let ret = args[0];
|
|
78
|
+
for (let i = 1; i < args.length; i++) {
|
|
79
|
+
ret = args[i](ret);
|
|
80
|
+
}
|
|
81
|
+
return ret;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
class Pipeable {
|
|
87
|
+
pipe(...args) {
|
|
88
|
+
return pipe(this, ...args);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
const PRECISION = 8;
|
|
93
|
+
function round(value, precision = PRECISION) {
|
|
94
|
+
const scale = 10 ** precision;
|
|
95
|
+
const result = Math.round(value * scale) / scale;
|
|
96
|
+
if (result === 0) {
|
|
97
|
+
return 0;
|
|
98
|
+
}
|
|
99
|
+
return result;
|
|
100
|
+
}
|
|
101
|
+
dual(
|
|
102
|
+
5,
|
|
103
|
+
(x, x1, x2, y1, y2) => {
|
|
104
|
+
return y1 + (x - x1) / (x2 - x1) * (y2 - y1);
|
|
105
|
+
}
|
|
106
|
+
);
|
|
107
|
+
dual(3, (value, min, max) => {
|
|
108
|
+
return value < min ? min : value > max ? max : value;
|
|
109
|
+
});
|
|
110
|
+
dual(4, (value, min, max, onClip) => {
|
|
111
|
+
return value < min ? onClip : value > max ? onClip : value;
|
|
112
|
+
});
|
|
113
|
+
function invariant(condition, message) {
|
|
114
|
+
if (!condition) {
|
|
115
|
+
throw new Error(message);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
export { Pipeable as P, PRECISION as a, dual as d, invariant as i, round as r };
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { P as Pipeable } from './curvy.BN-oFBsc.js';
|
|
2
|
+
import { Interval } from '../interval.js';
|
|
3
|
+
import { Vector2 } from '../vector/vector2.js';
|
|
4
|
+
import { Vector3 } from '../vector/vector3.js';
|
|
5
|
+
import { Vector4 } from '../vector/vector4.js';
|
|
6
|
+
|
|
7
|
+
declare const CubicPolynomialTypeId: unique symbol;
|
|
8
|
+
type CubicPolynomialTypeId = typeof CubicPolynomialTypeId;
|
|
9
|
+
|
|
10
|
+
type Monotonicity = 'none' | 'increasing' | 'decreasing' | 'constant';
|
|
11
|
+
type GuaranteedMonotonicity = 'increasing' | 'decreasing' | 'constant';
|
|
12
|
+
|
|
13
|
+
type ZeroOrOneSolution = number | null;
|
|
14
|
+
type ZeroOrOneInterval = Interval | null;
|
|
15
|
+
type ZeroToTwoSolutions = readonly [] | readonly [number] | readonly [number, number];
|
|
16
|
+
type ZeroToThreeSolutions = readonly [] | readonly [number] | readonly [number, number] | readonly [number, number, number];
|
|
17
|
+
|
|
18
|
+
interface CubicPolynomial extends Pipeable {
|
|
19
|
+
readonly [CubicPolynomialTypeId]: CubicPolynomialTypeId;
|
|
20
|
+
readonly c0: number;
|
|
21
|
+
readonly c1: number;
|
|
22
|
+
readonly c2: number;
|
|
23
|
+
readonly c3: number;
|
|
24
|
+
}
|
|
25
|
+
declare const isCubicPolynomial: (value: unknown) => value is CubicPolynomial;
|
|
26
|
+
declare const make$2: (c0: number, c1: number, c2: number, c3: number) => CubicPolynomial;
|
|
27
|
+
declare const fromVector$2: (v: Vector4) => CubicPolynomial;
|
|
28
|
+
declare const solve$2: {
|
|
29
|
+
(p: CubicPolynomial, x: number): number;
|
|
30
|
+
(x: number): (p: CubicPolynomial) => number;
|
|
31
|
+
};
|
|
32
|
+
declare const toSolver$2: (p: CubicPolynomial) => (x: number) => number;
|
|
33
|
+
declare const solveInverse$2: {
|
|
34
|
+
(p: CubicPolynomial, y: number): ZeroToThreeSolutions;
|
|
35
|
+
(y: number): (p: CubicPolynomial) => ZeroToThreeSolutions;
|
|
36
|
+
};
|
|
37
|
+
declare const toInverseSolver$2: (p: CubicPolynomial) => (y: number) => ZeroToThreeSolutions;
|
|
38
|
+
declare const derivative$2: (p: CubicPolynomial) => QuadraticPolynomial;
|
|
39
|
+
declare const roots$1: (p: CubicPolynomial) => ZeroToThreeSolutions;
|
|
40
|
+
declare const extrema: (p: CubicPolynomial) => ZeroToTwoSolutions;
|
|
41
|
+
declare const monotonicity$2: {
|
|
42
|
+
(p: CubicPolynomial, i?: Interval): Monotonicity;
|
|
43
|
+
(i: Interval): (p: CubicPolynomial) => Monotonicity;
|
|
44
|
+
};
|
|
45
|
+
declare const domain$2: {
|
|
46
|
+
(p: CubicPolynomial, range: Interval): Interval;
|
|
47
|
+
(range: Interval): (p: CubicPolynomial) => Interval;
|
|
48
|
+
};
|
|
49
|
+
declare const range$2: {
|
|
50
|
+
(p: CubicPolynomial, domain: Interval): Interval;
|
|
51
|
+
(domain: Interval): (p: CubicPolynomial) => Interval;
|
|
52
|
+
};
|
|
53
|
+
declare const length$2: {
|
|
54
|
+
(p: CubicPolynomial, domain: Interval): number;
|
|
55
|
+
(domain: Interval): (p: CubicPolynomial) => number;
|
|
56
|
+
};
|
|
57
|
+
declare const curvature$1: {
|
|
58
|
+
(p: CubicPolynomial, x: number): number;
|
|
59
|
+
(x: number): (p: CubicPolynomial) => number;
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
declare const QuadraticPolynomialTypeId: unique symbol;
|
|
63
|
+
type QuadraticPolynomialTypeId = typeof QuadraticPolynomialTypeId;
|
|
64
|
+
|
|
65
|
+
interface QuadraticPolynomial extends Pipeable {
|
|
66
|
+
readonly [QuadraticPolynomialTypeId]: QuadraticPolynomialTypeId;
|
|
67
|
+
readonly c0: number;
|
|
68
|
+
readonly c1: number;
|
|
69
|
+
readonly c2: number;
|
|
70
|
+
}
|
|
71
|
+
declare const isQuadraticPolynomial: (v: unknown) => v is QuadraticPolynomial;
|
|
72
|
+
declare const make$1: (c0?: number, c1?: number, c2?: number) => QuadraticPolynomial;
|
|
73
|
+
declare const fromVector$1: (v: Vector3) => QuadraticPolynomial;
|
|
74
|
+
declare const solve$1: {
|
|
75
|
+
(p: QuadraticPolynomial, x: number): number;
|
|
76
|
+
(x: number): (p: QuadraticPolynomial) => number;
|
|
77
|
+
};
|
|
78
|
+
declare const toSolver$1: (p: QuadraticPolynomial) => (x: number) => number;
|
|
79
|
+
declare const solveInverse$1: {
|
|
80
|
+
(p: QuadraticPolynomial, y: number): ZeroToTwoSolutions;
|
|
81
|
+
(y: number): (p: QuadraticPolynomial) => ZeroToTwoSolutions;
|
|
82
|
+
};
|
|
83
|
+
declare const toInverseSolver$1: (p: QuadraticPolynomial) => (y: number) => ZeroToTwoSolutions;
|
|
84
|
+
declare const derivative$1: (p: QuadraticPolynomial) => LinearPolynomial;
|
|
85
|
+
declare const roots: (p: QuadraticPolynomial) => ZeroToTwoSolutions;
|
|
86
|
+
declare const extreme: (p: QuadraticPolynomial) => ZeroOrOneSolution;
|
|
87
|
+
declare const monotonicity$1: {
|
|
88
|
+
(p: QuadraticPolynomial, i?: Interval): Monotonicity;
|
|
89
|
+
(i: Interval): (p: QuadraticPolynomial) => Monotonicity;
|
|
90
|
+
};
|
|
91
|
+
declare const antiderivative$1: {
|
|
92
|
+
(p: QuadraticPolynomial, constant?: number): CubicPolynomial;
|
|
93
|
+
(constant: number): (p: QuadraticPolynomial) => CubicPolynomial;
|
|
94
|
+
};
|
|
95
|
+
declare const domain$1: {
|
|
96
|
+
(p: QuadraticPolynomial, range: Interval): Interval | null;
|
|
97
|
+
(range: Interval): (p: QuadraticPolynomial) => Interval | null;
|
|
98
|
+
};
|
|
99
|
+
declare const range$1: {
|
|
100
|
+
(p: QuadraticPolynomial, domain: Interval): Interval;
|
|
101
|
+
(domain: Interval): (p: QuadraticPolynomial) => Interval;
|
|
102
|
+
};
|
|
103
|
+
declare const length$1: {
|
|
104
|
+
(p: QuadraticPolynomial, i: Interval): number;
|
|
105
|
+
(i: Interval): (p: QuadraticPolynomial) => number;
|
|
106
|
+
};
|
|
107
|
+
declare const curvature: {
|
|
108
|
+
(p: QuadraticPolynomial, x: number): number;
|
|
109
|
+
(x: number): (p: QuadraticPolynomial) => number;
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
declare const LinearPolynomialTypeId: unique symbol;
|
|
113
|
+
type LinearPolynomialTypeId = typeof LinearPolynomialTypeId;
|
|
114
|
+
|
|
115
|
+
interface LinearPolynomial extends Pipeable {
|
|
116
|
+
readonly [LinearPolynomialTypeId]: LinearPolynomialTypeId;
|
|
117
|
+
readonly c0: number;
|
|
118
|
+
readonly c1: number;
|
|
119
|
+
}
|
|
120
|
+
declare const isLinearPolynomial: (v: unknown) => v is LinearPolynomial;
|
|
121
|
+
declare const make: (c0?: number, c1?: number) => LinearPolynomial;
|
|
122
|
+
declare const fromVector: (v: Vector2) => LinearPolynomial;
|
|
123
|
+
declare const fromPointSlope: (p: Vector2, slope: number) => LinearPolynomial;
|
|
124
|
+
declare const fromPoints: (p1: Vector2, p2: Vector2) => LinearPolynomial;
|
|
125
|
+
declare const solve: {
|
|
126
|
+
(p: LinearPolynomial, x: number): number;
|
|
127
|
+
(x: number): (p: LinearPolynomial) => number;
|
|
128
|
+
};
|
|
129
|
+
declare const toSolver: (p: LinearPolynomial) => (x: number) => number;
|
|
130
|
+
declare const solveInverse: {
|
|
131
|
+
(p: LinearPolynomial, y: number): ZeroOrOneSolution;
|
|
132
|
+
(y: number): (p: LinearPolynomial) => ZeroOrOneSolution;
|
|
133
|
+
};
|
|
134
|
+
declare const toInverseSolver: (p: LinearPolynomial) => (y: number) => ZeroOrOneSolution;
|
|
135
|
+
declare const root: (p: LinearPolynomial) => ZeroOrOneSolution;
|
|
136
|
+
declare const monotonicity: (p: LinearPolynomial) => GuaranteedMonotonicity;
|
|
137
|
+
declare const derivative: (p: LinearPolynomial) => number;
|
|
138
|
+
declare const antiderivative: {
|
|
139
|
+
(p: LinearPolynomial, constant?: number): QuadraticPolynomial;
|
|
140
|
+
(constant: number): (p: LinearPolynomial) => QuadraticPolynomial;
|
|
141
|
+
};
|
|
142
|
+
declare const domain: {
|
|
143
|
+
(p: LinearPolynomial, range: Interval): ZeroOrOneInterval;
|
|
144
|
+
(range: Interval): (p: LinearPolynomial) => ZeroOrOneInterval;
|
|
145
|
+
};
|
|
146
|
+
declare const range: {
|
|
147
|
+
(p: LinearPolynomial, domain: Interval): Interval;
|
|
148
|
+
(domain: Interval): (p: LinearPolynomial) => Interval;
|
|
149
|
+
};
|
|
150
|
+
declare const length: {
|
|
151
|
+
(p: LinearPolynomial, domain: Interval): number;
|
|
152
|
+
(domain: Interval): (p: LinearPolynomial) => number;
|
|
153
|
+
};
|
|
154
|
+
|
|
155
|
+
export { antiderivative$1 as A, domain$1 as B, type CubicPolynomial as C, range$1 as D, length$1 as E, curvature as F, isLinearPolynomial as G, make as H, fromVector as I, fromPointSlope as J, fromPoints as K, type LinearPolynomial as L, solve as M, toSolver as N, solveInverse as O, toInverseSolver as P, type QuadraticPolynomial as Q, root as R, monotonicity as S, derivative as T, antiderivative as U, domain as V, range as W, length as X, solveInverse$2 as a, toInverseSolver$2 as b, monotonicity$2 as c, derivative$2 as d, extrema as e, fromVector$2 as f, domain$2 as g, range$2 as h, isCubicPolynomial as i, curvature$1 as j, isQuadraticPolynomial as k, length$2 as l, make$2 as m, make$1 as n, fromVector$1 as o, solve$1 as p, toSolver$1 as q, roots$1 as r, solve$2 as s, toSolver$2 as t, solveInverse$1 as u, toInverseSolver$1 as v, derivative$1 as w, roots as x, extreme as y, monotonicity$1 as z };
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { d as dual, r as round, P as Pipeable } from './curvy.ChkqgKuv.mjs';
|
|
2
|
+
|
|
3
|
+
const Vector4TypeId = Symbol.for("curvy/vector4");
|
|
4
|
+
class Vector4Impl extends Pipeable {
|
|
5
|
+
[Vector4TypeId] = Vector4TypeId;
|
|
6
|
+
x;
|
|
7
|
+
y;
|
|
8
|
+
z;
|
|
9
|
+
w;
|
|
10
|
+
constructor(v0 = 0, v1 = 0, v2 = 0, v3 = 0) {
|
|
11
|
+
super();
|
|
12
|
+
this.x = round(v0);
|
|
13
|
+
this.y = round(v1);
|
|
14
|
+
this.z = round(v2);
|
|
15
|
+
this.w = round(v3);
|
|
16
|
+
}
|
|
17
|
+
get [0]() {
|
|
18
|
+
return this.x;
|
|
19
|
+
}
|
|
20
|
+
get [1]() {
|
|
21
|
+
return this.y;
|
|
22
|
+
}
|
|
23
|
+
get [2]() {
|
|
24
|
+
return this.z;
|
|
25
|
+
}
|
|
26
|
+
get [3]() {
|
|
27
|
+
return this.w;
|
|
28
|
+
}
|
|
29
|
+
get [Symbol.toStringTag]() {
|
|
30
|
+
return `Vector4(${this.x}, ${this.y}, ${this.z}, ${this.w})`;
|
|
31
|
+
}
|
|
32
|
+
get [Symbol.for("nodejs.util.inspect.custom")]() {
|
|
33
|
+
return this[Symbol.toStringTag];
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
const isVector4 = (v) => typeof v === "object" && v !== null && Vector4TypeId in v;
|
|
37
|
+
const make = (v0, v1 = v0, v2 = v1, v3 = v2) => new Vector4Impl(v0, v1, v2, v3);
|
|
38
|
+
const magnitude = (vector) => round(Math.hypot(vector.x, vector.y, vector.z, vector.w));
|
|
39
|
+
const normalize = (vector) => {
|
|
40
|
+
const m = magnitude(vector);
|
|
41
|
+
return make(vector.x / m, vector.y / m, vector.z / m, vector.w / m);
|
|
42
|
+
};
|
|
43
|
+
const dot = dual(
|
|
44
|
+
2,
|
|
45
|
+
(a, b) => round(a.x * b.x + a.y * b.y + a.z * b.z + a.w * b.w)
|
|
46
|
+
);
|
|
47
|
+
const components = (v) => [v.x, v.y, v.z, v.w];
|
|
48
|
+
const softmax = (v) => {
|
|
49
|
+
const max = Math.max(v.x, v.y, v.z, v.w);
|
|
50
|
+
const v0 = Math.exp(v.x - max);
|
|
51
|
+
const v1 = Math.exp(v.y - max);
|
|
52
|
+
const v2 = Math.exp(v.z - max);
|
|
53
|
+
const v3 = Math.exp(v.w - max);
|
|
54
|
+
const sum = v0 + v1 + v2 + v3;
|
|
55
|
+
return make(v0 / sum, v1 / sum, v2 / sum, v3 / sum);
|
|
56
|
+
};
|
|
57
|
+
const add = dual(
|
|
58
|
+
2,
|
|
59
|
+
(a, b) => make(a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w)
|
|
60
|
+
);
|
|
61
|
+
const subtract = dual(
|
|
62
|
+
2,
|
|
63
|
+
(a, b) => make(a.x - b.x, a.y - b.y, a.z - b.z, a.w - b.w)
|
|
64
|
+
);
|
|
65
|
+
const hadamard = dual(
|
|
66
|
+
2,
|
|
67
|
+
(a, b) => make(a.x * b.x, a.y * b.y, a.z * b.z, a.w * b.w)
|
|
68
|
+
);
|
|
69
|
+
|
|
70
|
+
export { magnitude as a, add as b, components as c, dot as d, subtract as e, hadamard as h, isVector4 as i, make as m, normalize as n, softmax as s };
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { P as Pipeable, r as round, d as dual } from './curvy.ChkqgKuv.mjs';
|
|
2
|
+
import { size, contains, fromMinMax } from '../interval.mjs';
|
|
3
|
+
import { Q as QuadraticPolynomialImpl, b as QuadraticPolynomialTypeId, a as make$1, c as solveInverse$1, m as monotonicity$1, r as range$1, l as length$1, s as solve$1 } from './curvy.DB7nQmVs.mjs';
|
|
4
|
+
|
|
5
|
+
const CubicPolynomialTypeId = Symbol.for(
|
|
6
|
+
"curvy/polynomial/cubic"
|
|
7
|
+
);
|
|
8
|
+
class CubicPolynomialImpl extends Pipeable {
|
|
9
|
+
[CubicPolynomialTypeId] = CubicPolynomialTypeId;
|
|
10
|
+
c0;
|
|
11
|
+
c1;
|
|
12
|
+
c2;
|
|
13
|
+
c3;
|
|
14
|
+
constructor(c0 = 0, c1 = 0, c2 = 0, c3 = 0) {
|
|
15
|
+
super();
|
|
16
|
+
this.c0 = round(c0);
|
|
17
|
+
this.c1 = round(c1);
|
|
18
|
+
this.c2 = round(c2);
|
|
19
|
+
this.c3 = round(c3);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function guaranteedMonotonicityFromComparison(s0, s1) {
|
|
24
|
+
if (s0 < s1) {
|
|
25
|
+
return "increasing";
|
|
26
|
+
}
|
|
27
|
+
if (s0 > s1) {
|
|
28
|
+
return "decreasing";
|
|
29
|
+
}
|
|
30
|
+
return "constant";
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const make = (c0 = 0, c1 = 0, c2 = 0) => new QuadraticPolynomialImpl(c0, c1, c2);
|
|
34
|
+
const isQuadraticPolynomial = (v) => typeof v === "object" && v !== null && QuadraticPolynomialTypeId in v;
|
|
35
|
+
const fromVector = (v) => new QuadraticPolynomialImpl(v.x, v.y, v.z);
|
|
36
|
+
const solve = dual(
|
|
37
|
+
2,
|
|
38
|
+
(p, x) => round(p.c0 + x * p.c1 + x ** 2 * p.c2)
|
|
39
|
+
);
|
|
40
|
+
const toSolver = (p) => (x) => solve(p, x);
|
|
41
|
+
const solveInverse = dual(2, (p, y) => {
|
|
42
|
+
const discriminant = p.c1 ** 2 - 4 * p.c2 * (p.c0 - y);
|
|
43
|
+
if (discriminant < 0) {
|
|
44
|
+
return [];
|
|
45
|
+
}
|
|
46
|
+
if (discriminant === 0) {
|
|
47
|
+
return [round(-p.c1 / (2 * p.c2))];
|
|
48
|
+
}
|
|
49
|
+
const sqrtDiscriminant = Math.sqrt(discriminant);
|
|
50
|
+
return [
|
|
51
|
+
round((-p.c1 + sqrtDiscriminant) / (2 * p.c2)),
|
|
52
|
+
round((-p.c1 - sqrtDiscriminant) / (2 * p.c2))
|
|
53
|
+
].toSorted((a, b) => a - b);
|
|
54
|
+
});
|
|
55
|
+
const toInverseSolver = (p) => (y) => solveInverse(p, y);
|
|
56
|
+
const derivative = (p) => make$1(p.c1, p.c2 * 2);
|
|
57
|
+
const roots = (p) => solveInverse(p, 0);
|
|
58
|
+
const extreme = (p) => derivative(p).pipe(solveInverse$1(0)) ?? (p.c2 === 0 ? null : 0);
|
|
59
|
+
const monotonicity = dual(
|
|
60
|
+
(args) => isQuadraticPolynomial(args[0]),
|
|
61
|
+
(p, i) => {
|
|
62
|
+
if (p.c2 === 0 && p.c1 === 0) {
|
|
63
|
+
return "constant";
|
|
64
|
+
}
|
|
65
|
+
if (p.c2 === 0) {
|
|
66
|
+
return monotonicity$1(make$1(p.c0, p.c1));
|
|
67
|
+
}
|
|
68
|
+
const e = extreme(p);
|
|
69
|
+
if (i && size(i) === 0) {
|
|
70
|
+
return "constant";
|
|
71
|
+
}
|
|
72
|
+
if (i === void 0 || contains(i, e, { includeStart: false, includeEnd: false })) {
|
|
73
|
+
return "none";
|
|
74
|
+
}
|
|
75
|
+
return guaranteedMonotonicityFromComparison(
|
|
76
|
+
solve(p, i.start),
|
|
77
|
+
solve(p, i.end)
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
);
|
|
81
|
+
const antiderivative = dual(
|
|
82
|
+
2,
|
|
83
|
+
(p, integrationConstant = 0) => new CubicPolynomialImpl(integrationConstant, p.c0, p.c1 / 2, p.c2 / 3)
|
|
84
|
+
);
|
|
85
|
+
const domain = dual(2, (p, range2) => {
|
|
86
|
+
const start = solveInverse(p, range2.start);
|
|
87
|
+
const end = solveInverse(p, range2.end);
|
|
88
|
+
if (start.length === 0 && end.length === 0) {
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
return fromMinMax(
|
|
92
|
+
...solveInverse(p, range2.start),
|
|
93
|
+
...solveInverse(p, range2.end)
|
|
94
|
+
);
|
|
95
|
+
});
|
|
96
|
+
const range = dual(2, (p, domain2) => {
|
|
97
|
+
if (p.c2 === 0) {
|
|
98
|
+
return range$1(make$1(p.c0, p.c1), domain2);
|
|
99
|
+
}
|
|
100
|
+
const e = extreme(p);
|
|
101
|
+
return e !== null && contains(domain2, e) ? fromMinMax(
|
|
102
|
+
solve(p, domain2.start),
|
|
103
|
+
solve(p, domain2.end),
|
|
104
|
+
solve(p, e)
|
|
105
|
+
) : fromMinMax(solve(p, domain2.start), solve(p, domain2.end));
|
|
106
|
+
});
|
|
107
|
+
const length = dual(2, (p, domain2) => {
|
|
108
|
+
if (size(domain2) === 0) {
|
|
109
|
+
return 0;
|
|
110
|
+
}
|
|
111
|
+
if (p.c2 === 0) {
|
|
112
|
+
return length$1(make$1(p.c0, p.c1), domain2);
|
|
113
|
+
}
|
|
114
|
+
const d = derivative(p);
|
|
115
|
+
const derivativeStart = solve$1(d, domain2.start);
|
|
116
|
+
const sqrtStart = Math.sqrt(1 + derivativeStart ** 2);
|
|
117
|
+
const evalStart = (derivativeStart * sqrtStart + Math.log(Math.abs(derivativeStart + sqrtStart))) / (4 * p.c2);
|
|
118
|
+
const derivativeEnd = solve$1(d, domain2.end);
|
|
119
|
+
const sqrtEnd = Math.sqrt(1 + derivativeEnd ** 2);
|
|
120
|
+
const evalEnd = (derivativeEnd * sqrtEnd + Math.log(Math.abs(derivativeEnd + sqrtEnd))) / (4 * p.c2);
|
|
121
|
+
return round(evalEnd - evalStart);
|
|
122
|
+
});
|
|
123
|
+
const curvature = dual(
|
|
124
|
+
2,
|
|
125
|
+
(p, x) => round(
|
|
126
|
+
Math.abs(2 * p.c2) / (1 + (solve$1(derivative(p), x) ** 2) ** 1.5)
|
|
127
|
+
)
|
|
128
|
+
);
|
|
129
|
+
|
|
130
|
+
export { CubicPolynomialImpl as C, CubicPolynomialTypeId as a, monotonicity as b, solve as c, derivative as d, toInverseSolver as e, fromVector as f, guaranteedMonotonicityFromComparison as g, extreme as h, isQuadraticPolynomial as i, antiderivative as j, domain as k, length as l, make as m, range as n, curvature as o, roots as r, solveInverse as s, toSolver as t };
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { d as dual, r as round, P as Pipeable } from './curvy.ChkqgKuv.mjs';
|
|
2
|
+
|
|
3
|
+
const Vector3TypeId = Symbol.for("curvy/vector3");
|
|
4
|
+
class Vector3Impl extends Pipeable {
|
|
5
|
+
[Vector3TypeId] = Vector3TypeId;
|
|
6
|
+
x;
|
|
7
|
+
y;
|
|
8
|
+
z;
|
|
9
|
+
constructor(v0 = 0, v1 = 0, v2 = 0) {
|
|
10
|
+
super();
|
|
11
|
+
this.x = round(v0);
|
|
12
|
+
this.y = round(v1);
|
|
13
|
+
this.z = round(v2);
|
|
14
|
+
}
|
|
15
|
+
get [0]() {
|
|
16
|
+
return this.x;
|
|
17
|
+
}
|
|
18
|
+
get [1]() {
|
|
19
|
+
return this.y;
|
|
20
|
+
}
|
|
21
|
+
get [2]() {
|
|
22
|
+
return this.z;
|
|
23
|
+
}
|
|
24
|
+
get [Symbol.toStringTag]() {
|
|
25
|
+
return `Vector3(${this.x}, ${this.y}, ${this.z})`;
|
|
26
|
+
}
|
|
27
|
+
get [Symbol.for("nodejs.util.inspect.custom")]() {
|
|
28
|
+
return this[Symbol.toStringTag];
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
const isVector3 = (v) => typeof v === "object" && v !== null && Vector3TypeId in v;
|
|
32
|
+
const magnitude = (vector) => round(Math.hypot(vector.x, vector.y, vector.z));
|
|
33
|
+
const normalize = (vector) => {
|
|
34
|
+
const m = magnitude(vector);
|
|
35
|
+
return make(vector.x / m, vector.y / m, vector.z / m);
|
|
36
|
+
};
|
|
37
|
+
const dot = dual(2, (a, b) => round(a.x * b.x + a.y * b.y + a.z * b.z));
|
|
38
|
+
const components = (v) => [v.x, v.y, v.z];
|
|
39
|
+
const softmax = (v) => {
|
|
40
|
+
const max = Math.max(v.x, v.y, v.z);
|
|
41
|
+
const v0 = Math.exp(v.x - max);
|
|
42
|
+
const v1 = Math.exp(v.y - max);
|
|
43
|
+
const v2 = Math.exp(v.z - max);
|
|
44
|
+
const sum = v0 + v1 + v2;
|
|
45
|
+
return make(v0 / sum, v1 / sum, v2 / sum);
|
|
46
|
+
};
|
|
47
|
+
const make = (v0, v1 = v0, v2 = v1) => new Vector3Impl(v0, v1, v2);
|
|
48
|
+
const add = dual(2, (a, b) => make(a.x + b.x, a.y + b.y, a.z + b.z));
|
|
49
|
+
const subtract = dual(2, (a, b) => make(a.x - b.x, a.y - b.y, a.z - b.z));
|
|
50
|
+
const hadamard = dual(2, (a, b) => make(a.x * b.x, a.y * b.y, a.z * b.z));
|
|
51
|
+
|
|
52
|
+
export { magnitude as a, add as b, components as c, dot as d, subtract as e, hadamard as h, isVector3 as i, make as m, normalize as n, softmax as s };
|