@johnhenry/math 0.0.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/README.md +165 -0
- package/dist/Bivector4.d.ts +52 -0
- package/dist/Bivector4.d.ts.map +1 -0
- package/dist/Bivector4.js +105 -0
- package/dist/Bivector4.js.map +1 -0
- package/dist/CellGraph.d.ts +259 -0
- package/dist/CellGraph.d.ts.map +1 -0
- package/dist/CellGraph.js +637 -0
- package/dist/CellGraph.js.map +1 -0
- package/dist/Clifford4Internal.d.ts +35 -0
- package/dist/Clifford4Internal.d.ts.map +1 -0
- package/dist/Clifford4Internal.js +86 -0
- package/dist/Clifford4Internal.js.map +1 -0
- package/dist/Combinatorics.d.ts +61 -0
- package/dist/Combinatorics.d.ts.map +1 -0
- package/dist/Combinatorics.js +186 -0
- package/dist/Combinatorics.js.map +1 -0
- package/dist/CombinatoricsGenerators.d.ts +44 -0
- package/dist/CombinatoricsGenerators.d.ts.map +1 -0
- package/dist/CombinatoricsGenerators.js +148 -0
- package/dist/CombinatoricsGenerators.js.map +1 -0
- package/dist/ComplexMath.d.ts +46 -0
- package/dist/ComplexMath.d.ts.map +1 -0
- package/dist/ComplexMath.js +98 -0
- package/dist/ComplexMath.js.map +1 -0
- package/dist/ComplexNumber.d.ts +174 -0
- package/dist/ComplexNumber.d.ts.map +1 -0
- package/dist/ComplexNumber.js +443 -0
- package/dist/ComplexNumber.js.map +1 -0
- package/dist/Cycle.d.ts +42 -0
- package/dist/Cycle.d.ts.map +1 -0
- package/dist/Cycle.js +120 -0
- package/dist/Cycle.js.map +1 -0
- package/dist/Decimal.d.ts +45 -0
- package/dist/Decimal.d.ts.map +1 -0
- package/dist/Decimal.js +135 -0
- package/dist/Decimal.js.map +1 -0
- package/dist/Distributions.d.ts +55 -0
- package/dist/Distributions.d.ts.map +1 -0
- package/dist/Distributions.js +222 -0
- package/dist/Distributions.js.map +1 -0
- package/dist/DualNumber.d.ts +42 -0
- package/dist/DualNumber.d.ts.map +1 -0
- package/dist/DualNumber.js +91 -0
- package/dist/DualNumber.js.map +1 -0
- package/dist/Environment.d.ts +44 -0
- package/dist/Environment.d.ts.map +1 -0
- package/dist/Environment.js +129 -0
- package/dist/Environment.js.map +1 -0
- package/dist/Expression.d.ts +19 -0
- package/dist/Expression.d.ts.map +1 -0
- package/dist/Expression.js +43 -0
- package/dist/Expression.js.map +1 -0
- package/dist/FFT.d.ts +21 -0
- package/dist/FFT.d.ts.map +1 -0
- package/dist/FFT.js +136 -0
- package/dist/FFT.js.map +1 -0
- package/dist/GeometricAlgebra4.d.ts +73 -0
- package/dist/GeometricAlgebra4.d.ts.map +1 -0
- package/dist/GeometricAlgebra4.js +115 -0
- package/dist/GeometricAlgebra4.js.map +1 -0
- package/dist/Geometry.d.ts +41 -0
- package/dist/Geometry.d.ts.map +1 -0
- package/dist/Geometry.js +167 -0
- package/dist/Geometry.js.map +1 -0
- package/dist/Graph.d.ts +72 -0
- package/dist/Graph.d.ts.map +1 -0
- package/dist/Graph.js +337 -0
- package/dist/Graph.js.map +1 -0
- package/dist/Graph3DUtils.d.ts +80 -0
- package/dist/Graph3DUtils.d.ts.map +1 -0
- package/dist/Graph3DUtils.js +156 -0
- package/dist/Graph3DUtils.js.map +1 -0
- package/dist/GraphUtils.d.ts +67 -0
- package/dist/GraphUtils.d.ts.map +1 -0
- package/dist/GraphUtils.js +72 -0
- package/dist/GraphUtils.js.map +1 -0
- package/dist/GroupTheory.d.ts +73 -0
- package/dist/GroupTheory.d.ts.map +1 -0
- package/dist/GroupTheory.js +194 -0
- package/dist/GroupTheory.js.map +1 -0
- package/dist/IntUtils.d.ts +33 -0
- package/dist/IntUtils.d.ts.map +1 -0
- package/dist/IntUtils.js +185 -0
- package/dist/IntUtils.js.map +1 -0
- package/dist/Interval.d.ts +44 -0
- package/dist/Interval.d.ts.map +1 -0
- package/dist/Interval.js +165 -0
- package/dist/Interval.js.map +1 -0
- package/dist/Lattice.d.ts +48 -0
- package/dist/Lattice.d.ts.map +1 -0
- package/dist/Lattice.js +65 -0
- package/dist/Lattice.js.map +1 -0
- package/dist/Logic.d.ts +22 -0
- package/dist/Logic.d.ts.map +1 -0
- package/dist/Logic.js +34 -0
- package/dist/Logic.js.map +1 -0
- package/dist/MatrixMath.d.ts +71 -0
- package/dist/MatrixMath.d.ts.map +1 -0
- package/dist/MatrixMath.js +302 -0
- package/dist/MatrixMath.js.map +1 -0
- package/dist/NumberTheory.d.ts +49 -0
- package/dist/NumberTheory.d.ts.map +1 -0
- package/dist/NumberTheory.js +230 -0
- package/dist/NumberTheory.js.map +1 -0
- package/dist/Numerical.d.ts +85 -0
- package/dist/Numerical.d.ts.map +1 -0
- package/dist/Numerical.js +343 -0
- package/dist/Numerical.js.map +1 -0
- package/dist/Permutation.d.ts +43 -0
- package/dist/Permutation.d.ts.map +1 -0
- package/dist/Permutation.js +142 -0
- package/dist/Permutation.js.map +1 -0
- package/dist/Polygon.d.ts +64 -0
- package/dist/Polygon.d.ts.map +1 -0
- package/dist/Polygon.js +221 -0
- package/dist/Polygon.js.map +1 -0
- package/dist/PolynomialRing.d.ts +74 -0
- package/dist/PolynomialRing.d.ts.map +1 -0
- package/dist/PolynomialRing.js +231 -0
- package/dist/PolynomialRing.js.map +1 -0
- package/dist/Quaternion.d.ts +37 -0
- package/dist/Quaternion.d.ts.map +1 -0
- package/dist/Quaternion.js +106 -0
- package/dist/Quaternion.js.map +1 -0
- package/dist/Rational.d.ts +34 -0
- package/dist/Rational.d.ts.map +1 -0
- package/dist/Rational.js +136 -0
- package/dist/Rational.js.map +1 -0
- package/dist/RealMath.d.ts +112 -0
- package/dist/RealMath.d.ts.map +1 -0
- package/dist/RealMath.js +262 -0
- package/dist/RealMath.js.map +1 -0
- package/dist/Rotor4.d.ts +180 -0
- package/dist/Rotor4.d.ts.map +1 -0
- package/dist/Rotor4.js +388 -0
- package/dist/Rotor4.js.map +1 -0
- package/dist/SpecialFunctions.d.ts +32 -0
- package/dist/SpecialFunctions.d.ts.map +1 -0
- package/dist/SpecialFunctions.js +161 -0
- package/dist/SpecialFunctions.js.map +1 -0
- package/dist/SpecialOperator.d.ts +21 -0
- package/dist/SpecialOperator.d.ts.map +1 -0
- package/dist/SpecialOperator.js +26 -0
- package/dist/SpecialOperator.js.map +1 -0
- package/dist/Statistics.d.ts +50 -0
- package/dist/Statistics.d.ts.map +1 -0
- package/dist/Statistics.js +131 -0
- package/dist/Statistics.js.map +1 -0
- package/dist/StringEvaluator.d.ts +48 -0
- package/dist/StringEvaluator.d.ts.map +1 -0
- package/dist/StringEvaluator.js +190 -0
- package/dist/StringEvaluator.js.map +1 -0
- package/dist/Structure.d.ts +130 -0
- package/dist/Structure.d.ts.map +1 -0
- package/dist/Structure.js +394 -0
- package/dist/Structure.js.map +1 -0
- package/dist/Symbolic.d.ts +501 -0
- package/dist/Symbolic.d.ts.map +1 -0
- package/dist/Symbolic.js +4077 -0
- package/dist/Symbolic.js.map +1 -0
- package/dist/Type.d.ts +31 -0
- package/dist/Type.d.ts.map +1 -0
- package/dist/Type.js +47 -0
- package/dist/Type.js.map +1 -0
- package/dist/Utilities.d.ts +27 -0
- package/dist/Utilities.d.ts.map +1 -0
- package/dist/Utilities.js +47 -0
- package/dist/Utilities.js.map +1 -0
- package/dist/Vec4.d.ts +39 -0
- package/dist/Vec4.d.ts.map +1 -0
- package/dist/Vec4.js +82 -0
- package/dist/Vec4.js.map +1 -0
- package/dist/Vector.d.ts +83 -0
- package/dist/Vector.d.ts.map +1 -0
- package/dist/Vector.js +173 -0
- package/dist/Vector.js.map +1 -0
- package/dist/VectorCalculus.d.ts +42 -0
- package/dist/VectorCalculus.d.ts.map +1 -0
- package/dist/VectorCalculus.js +82 -0
- package/dist/VectorCalculus.js.map +1 -0
- package/dist/VectorUtils.d.ts +172 -0
- package/dist/VectorUtils.d.ts.map +1 -0
- package/dist/VectorUtils.js +706 -0
- package/dist/VectorUtils.js.map +1 -0
- package/dist/differentiation-rules.d.ts +21 -0
- package/dist/differentiation-rules.d.ts.map +1 -0
- package/dist/differentiation-rules.js +52 -0
- package/dist/differentiation-rules.js.map +1 -0
- package/dist/index.d.ts +52 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +66 -0
- package/dist/index.js.map +1 -0
- package/package.json +68 -0
- package/src/Bivector4.ts +136 -0
- package/src/CellGraph.ts +669 -0
- package/src/Clifford4Internal.ts +90 -0
- package/src/Combinatorics.ts +183 -0
- package/src/CombinatoricsGenerators.ts +144 -0
- package/src/ComplexMath.ts +162 -0
- package/src/ComplexNumber.ts +491 -0
- package/src/Cycle.ts +126 -0
- package/src/Decimal.ts +145 -0
- package/src/Distributions.ts +269 -0
- package/src/DualNumber.ts +105 -0
- package/src/Environment.ts +127 -0
- package/src/Expression.ts +48 -0
- package/src/FFT.ts +146 -0
- package/src/GeometricAlgebra4.ts +157 -0
- package/src/Geometry.ts +173 -0
- package/src/Graph.ts +337 -0
- package/src/Graph3DUtils.ts +269 -0
- package/src/GraphUtils.ts +159 -0
- package/src/GroupTheory.ts +214 -0
- package/src/IntUtils.ts +200 -0
- package/src/Interval.ts +171 -0
- package/src/Lattice.ts +87 -0
- package/src/Logic.ts +38 -0
- package/src/MatrixMath.ts +326 -0
- package/src/NumberTheory.ts +228 -0
- package/src/Numerical.ts +390 -0
- package/src/Permutation.ts +148 -0
- package/src/Polygon.ts +229 -0
- package/src/PolynomialRing.ts +242 -0
- package/src/Quaternion.ts +125 -0
- package/src/Rational.ts +148 -0
- package/src/RealMath.ts +346 -0
- package/src/Rotor4.ts +440 -0
- package/src/SpecialFunctions.ts +152 -0
- package/src/SpecialOperator.ts +28 -0
- package/src/Statistics.ts +170 -0
- package/src/StringEvaluator.ts +208 -0
- package/src/Structure.ts +481 -0
- package/src/Symbolic.ts +4313 -0
- package/src/Type.ts +48 -0
- package/src/Utilities.ts +49 -0
- package/src/Vec4.ts +98 -0
- package/src/Vector.ts +189 -0
- package/src/VectorCalculus.ts +87 -0
- package/src/VectorUtils.ts +797 -0
- package/src/differentiation-rules.ts +73 -0
- package/src/index.ts +140 -0
|
@@ -0,0 +1,343 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Numerical — numerical-methods toolkit: root finding (bisection, secant,
|
|
3
|
+
* Newton, Brent), quadrature (composite trapezoid/Simpson, adaptive Simpson,
|
|
4
|
+
* Gauss-Legendre), ODE integration (Euler, RK4 for systems), and nonlinear
|
|
5
|
+
* curve fitting (Levenberg-Marquardt). Complements the simpler
|
|
6
|
+
* `integrateN`/`differentiateN`/`solveN` in {@link RealMath}.
|
|
7
|
+
*/
|
|
8
|
+
import { MatrixMath } from "./MatrixMath.js";
|
|
9
|
+
// 5-point Gauss-Legendre nodes/weights on [-1, 1].
|
|
10
|
+
const GL5_NODES = [0, -0.5384693101056831, 0.5384693101056831, -0.906179845938664, 0.906179845938664];
|
|
11
|
+
const GL5_WEIGHTS = [
|
|
12
|
+
0.5688888888888889, 0.4786286704993665, 0.4786286704993665, 0.2369268850561891, 0.2369268850561891,
|
|
13
|
+
];
|
|
14
|
+
export class Numerical {
|
|
15
|
+
// -- root finding --------------------------------------------------------
|
|
16
|
+
/** Find a root of `f` in `[a, b]` by bisection (requires a sign change). */
|
|
17
|
+
static bisection(f, a, b, tolerance = 1e-12, maxIterations = 200) {
|
|
18
|
+
let lo = a;
|
|
19
|
+
let hi = b;
|
|
20
|
+
let flo = f(lo);
|
|
21
|
+
if (flo * f(hi) > 0)
|
|
22
|
+
throw new Error("bisection requires f(a) and f(b) to have opposite signs.");
|
|
23
|
+
for (let i = 0; i < maxIterations; i++) {
|
|
24
|
+
const mid = (lo + hi) / 2;
|
|
25
|
+
const fmid = f(mid);
|
|
26
|
+
if (Math.abs(fmid) < tolerance || (hi - lo) / 2 < tolerance)
|
|
27
|
+
return mid;
|
|
28
|
+
if (flo * fmid < 0)
|
|
29
|
+
hi = mid;
|
|
30
|
+
else {
|
|
31
|
+
lo = mid;
|
|
32
|
+
flo = fmid;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return (lo + hi) / 2;
|
|
36
|
+
}
|
|
37
|
+
/** Find a root of `f` by the secant method from two starting guesses. */
|
|
38
|
+
static secant(f, x0, x1, tolerance = 1e-12, maxIterations = 200) {
|
|
39
|
+
let a = x0;
|
|
40
|
+
let b = x1;
|
|
41
|
+
let fa = f(a);
|
|
42
|
+
let fb = f(b);
|
|
43
|
+
for (let i = 0; i < maxIterations; i++) {
|
|
44
|
+
if (Math.abs(fb) < tolerance)
|
|
45
|
+
return b;
|
|
46
|
+
const denom = fb - fa;
|
|
47
|
+
if (denom === 0)
|
|
48
|
+
break;
|
|
49
|
+
const c = b - (fb * (b - a)) / denom;
|
|
50
|
+
a = b;
|
|
51
|
+
fa = fb;
|
|
52
|
+
b = c;
|
|
53
|
+
fb = f(b);
|
|
54
|
+
}
|
|
55
|
+
return b;
|
|
56
|
+
}
|
|
57
|
+
/** Newton's method; if `df` is omitted, a numeric derivative is used. */
|
|
58
|
+
static newton(f, x0, df, tolerance = 1e-12, maxIterations = 200) {
|
|
59
|
+
let x = x0;
|
|
60
|
+
const derivative = df ?? ((t) => (f(t + 1e-7) - f(t - 1e-7)) / 2e-7);
|
|
61
|
+
for (let i = 0; i < maxIterations; i++) {
|
|
62
|
+
const fx = f(x);
|
|
63
|
+
if (Math.abs(fx) < tolerance)
|
|
64
|
+
return x;
|
|
65
|
+
const d = derivative(x);
|
|
66
|
+
if (d === 0)
|
|
67
|
+
break;
|
|
68
|
+
x -= fx / d;
|
|
69
|
+
}
|
|
70
|
+
return x;
|
|
71
|
+
}
|
|
72
|
+
/** Brent's method: robust bracketing root finder combining bisection and interpolation. */
|
|
73
|
+
static brent(f, a, b, tolerance = 1e-12, maxIterations = 200) {
|
|
74
|
+
let fa = f(a);
|
|
75
|
+
let fb = f(b);
|
|
76
|
+
if (fa * fb > 0)
|
|
77
|
+
throw new Error("brent requires f(a) and f(b) to have opposite signs.");
|
|
78
|
+
if (Math.abs(fa) < Math.abs(fb)) {
|
|
79
|
+
[a, b] = [b, a];
|
|
80
|
+
[fa, fb] = [fb, fa];
|
|
81
|
+
}
|
|
82
|
+
let c = a;
|
|
83
|
+
let fc = fa;
|
|
84
|
+
let d = b - a;
|
|
85
|
+
let mflag = true;
|
|
86
|
+
for (let i = 0; i < maxIterations; i++) {
|
|
87
|
+
if (Math.abs(fb) < tolerance || Math.abs(b - a) < tolerance)
|
|
88
|
+
return b;
|
|
89
|
+
let s;
|
|
90
|
+
if (fa !== fc && fb !== fc) {
|
|
91
|
+
s =
|
|
92
|
+
(a * fb * fc) / ((fa - fb) * (fa - fc)) +
|
|
93
|
+
(b * fa * fc) / ((fb - fa) * (fb - fc)) +
|
|
94
|
+
(c * fa * fb) / ((fc - fa) * (fc - fb));
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
s = b - (fb * (b - a)) / (fb - fa);
|
|
98
|
+
}
|
|
99
|
+
const cond = s < (3 * a + b) / 4 ||
|
|
100
|
+
s > b ||
|
|
101
|
+
(mflag && Math.abs(s - b) >= Math.abs(b - c) / 2) ||
|
|
102
|
+
(!mflag && Math.abs(s - b) >= Math.abs(c - d) / 2);
|
|
103
|
+
if (cond) {
|
|
104
|
+
s = (a + b) / 2;
|
|
105
|
+
mflag = true;
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
mflag = false;
|
|
109
|
+
}
|
|
110
|
+
const fs = f(s);
|
|
111
|
+
d = c;
|
|
112
|
+
c = b;
|
|
113
|
+
fc = fb;
|
|
114
|
+
if (fa * fs < 0) {
|
|
115
|
+
b = s;
|
|
116
|
+
fb = fs;
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
a = s;
|
|
120
|
+
fa = fs;
|
|
121
|
+
}
|
|
122
|
+
if (Math.abs(fa) < Math.abs(fb)) {
|
|
123
|
+
[a, b] = [b, a];
|
|
124
|
+
[fa, fb] = [fb, fa];
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return b;
|
|
128
|
+
}
|
|
129
|
+
// -- quadrature ----------------------------------------------------------
|
|
130
|
+
/** Composite trapezoidal rule with `n` subintervals. */
|
|
131
|
+
static trapezoid(f, a, b, n = 1000) {
|
|
132
|
+
const h = (b - a) / n;
|
|
133
|
+
let sum = (f(a) + f(b)) / 2;
|
|
134
|
+
for (let i = 1; i < n; i++)
|
|
135
|
+
sum += f(a + i * h);
|
|
136
|
+
return sum * h;
|
|
137
|
+
}
|
|
138
|
+
/** Composite Simpson's rule with `n` (rounded up to even) subintervals. */
|
|
139
|
+
static simpson(f, a, b, n = 1000) {
|
|
140
|
+
const m = n % 2 === 0 ? n : n + 1;
|
|
141
|
+
const h = (b - a) / m;
|
|
142
|
+
let sum = f(a) + f(b);
|
|
143
|
+
for (let i = 1; i < m; i++)
|
|
144
|
+
sum += (i % 2 === 0 ? 2 : 4) * f(a + i * h);
|
|
145
|
+
return (sum * h) / 3;
|
|
146
|
+
}
|
|
147
|
+
/** Adaptive Simpson quadrature to a target error tolerance. */
|
|
148
|
+
static adaptiveSimpson(f, a, b, tolerance = 1e-10, maxDepth = 50) {
|
|
149
|
+
const simpson = (lo, hi, flo, fmid, fhi) => ((hi - lo) / 6) * (flo + 4 * fmid + fhi);
|
|
150
|
+
const recurse = (lo, hi, flo, fmid, fhi, whole, tol, depth) => {
|
|
151
|
+
const mid = (lo + hi) / 2;
|
|
152
|
+
const lmid = (lo + mid) / 2;
|
|
153
|
+
const rmid = (mid + hi) / 2;
|
|
154
|
+
const flmid = f(lmid);
|
|
155
|
+
const frmid = f(rmid);
|
|
156
|
+
const left = simpson(lo, mid, flo, flmid, fmid);
|
|
157
|
+
const right = simpson(mid, hi, fmid, frmid, fhi);
|
|
158
|
+
if (depth <= 0 || Math.abs(left + right - whole) <= 15 * tol)
|
|
159
|
+
return left + right + (left + right - whole) / 15;
|
|
160
|
+
return (recurse(lo, mid, flo, flmid, fmid, left, tol / 2, depth - 1) +
|
|
161
|
+
recurse(mid, hi, fmid, frmid, fhi, right, tol / 2, depth - 1));
|
|
162
|
+
};
|
|
163
|
+
const mid = (a + b) / 2;
|
|
164
|
+
const fa = f(a);
|
|
165
|
+
const fmid = f(mid);
|
|
166
|
+
const fb = f(b);
|
|
167
|
+
return recurse(a, b, fa, fmid, fb, simpson(a, b, fa, fmid, fb), tolerance, maxDepth);
|
|
168
|
+
}
|
|
169
|
+
/** 5-point Gauss-Legendre quadrature on `[a, b]`. */
|
|
170
|
+
static gaussLegendre(f, a, b) {
|
|
171
|
+
const half = (b - a) / 2;
|
|
172
|
+
const mid = (a + b) / 2;
|
|
173
|
+
let sum = 0;
|
|
174
|
+
for (let i = 0; i < GL5_NODES.length; i++)
|
|
175
|
+
sum += GL5_WEIGHTS[i] * f(mid + half * GL5_NODES[i]);
|
|
176
|
+
return sum * half;
|
|
177
|
+
}
|
|
178
|
+
// -- ODE integration -----------------------------------------------------
|
|
179
|
+
/** Explicit Euler integration of a first-order system from `t0` to `t1`. */
|
|
180
|
+
static euler(f, y0, t0, t1, h = 0.01) {
|
|
181
|
+
const steps = [{ t: t0, y: [...y0] }];
|
|
182
|
+
let t = t0;
|
|
183
|
+
let y = [...y0];
|
|
184
|
+
while (t < t1 - 1e-12) {
|
|
185
|
+
const step = Math.min(h, t1 - t);
|
|
186
|
+
const dy = f(t, y);
|
|
187
|
+
y = y.map((yi, i) => yi + step * dy[i]);
|
|
188
|
+
t += step;
|
|
189
|
+
steps.push({ t, y: [...y] });
|
|
190
|
+
}
|
|
191
|
+
return steps;
|
|
192
|
+
}
|
|
193
|
+
/** Classical fourth-order Runge-Kutta integration of a first-order system. */
|
|
194
|
+
static rk4(f, y0, t0, t1, h = 0.01) {
|
|
195
|
+
const steps = [{ t: t0, y: [...y0] }];
|
|
196
|
+
let t = t0;
|
|
197
|
+
let y = [...y0];
|
|
198
|
+
while (t < t1 - 1e-12) {
|
|
199
|
+
const step = Math.min(h, t1 - t);
|
|
200
|
+
const k1 = f(t, y);
|
|
201
|
+
const k2 = f(t + step / 2, y.map((yi, i) => yi + (step / 2) * k1[i]));
|
|
202
|
+
const k3 = f(t + step / 2, y.map((yi, i) => yi + (step / 2) * k2[i]));
|
|
203
|
+
const k4 = f(t + step, y.map((yi, i) => yi + step * k3[i]));
|
|
204
|
+
y = y.map((yi, i) => yi + (step / 6) * (k1[i] + 2 * k2[i] + 2 * k3[i] + k4[i]));
|
|
205
|
+
t += step;
|
|
206
|
+
steps.push({ t, y: [...y] });
|
|
207
|
+
}
|
|
208
|
+
return steps;
|
|
209
|
+
}
|
|
210
|
+
// -- curve fitting ---------------------------------------------------------
|
|
211
|
+
/**
|
|
212
|
+
* Nonlinear least-squares curve fitting via Levenberg-Marquardt: finds
|
|
213
|
+
* `params` minimizing `sum((model(xs[i], params) - ys[i])^2)`, starting
|
|
214
|
+
* from `params0`. The Jacobian of `model` with respect to `params` is
|
|
215
|
+
* estimated by central finite differences (generalizes `newton`'s
|
|
216
|
+
* optional-df-else-numeric-derivative convention to a vector of
|
|
217
|
+
* parameters). `lambda` is the Marquardt damping factor -- scaled against
|
|
218
|
+
* each parameter's own row of `JᵀJ` (not a plain identity, the original
|
|
219
|
+
* Levenberg damping) so differently-scaled parameters damp comparably --
|
|
220
|
+
* grown 10x on a rejected step (safer, more like gradient descent) and
|
|
221
|
+
* shrunk 10x on an accepted one (faster, more like Gauss-Newton near the
|
|
222
|
+
* optimum).
|
|
223
|
+
*
|
|
224
|
+
* `converged` is true once *either* the sum of squared residuals itself
|
|
225
|
+
* drops below `tolerance` (a near-exact fit) *or* at least one step has
|
|
226
|
+
* improved it and further steps stop improving it meaningfully (no
|
|
227
|
+
* damped step improves it at all, or the relative improvement has
|
|
228
|
+
* dropped below 1e-12) -- deliberately not "the residual itself is near
|
|
229
|
+
* zero" as the only success criterion, since real (noisy) data's true
|
|
230
|
+
* best fit essentially never drives the residual anywhere near
|
|
231
|
+
* `tolerance`, even when the fit has genuinely converged to the best
|
|
232
|
+
* achievable parameters; requiring near-zero residual would wrongly
|
|
233
|
+
* report `converged: false` for every realistic (as opposed to
|
|
234
|
+
* synthetic/noiseless) dataset.
|
|
235
|
+
*
|
|
236
|
+
* NON-GOALS: no bounds/constraints on `params`; only ever finds one local
|
|
237
|
+
* minimum near `params0`, the same "no guarantee of the global optimum"
|
|
238
|
+
* caveat as `newton`. Returns `converged: false` (with the best `params`
|
|
239
|
+
* found, not a throw) when no step ever improved on `params0` at all --
|
|
240
|
+
* a model/data pairing that can't be fit usefully isn't a numerical error
|
|
241
|
+
* the way a divergent root-find is, but is still worth flagging distinctly
|
|
242
|
+
* from "converged to some local optimum, however good or mediocre."
|
|
243
|
+
*/
|
|
244
|
+
static levenbergMarquardt(model, params0, xs, ys, options = {}) {
|
|
245
|
+
const { lambda0 = 1e-2, tolerance = 1e-10, maxIterations = 200 } = options;
|
|
246
|
+
const n = params0.length;
|
|
247
|
+
const m = xs.length;
|
|
248
|
+
let params = [...params0];
|
|
249
|
+
let lambda = lambda0;
|
|
250
|
+
function residuals(p) {
|
|
251
|
+
return xs.map((x, i) => model(x, p) - ys[i]);
|
|
252
|
+
}
|
|
253
|
+
function sumSq(r) {
|
|
254
|
+
return r.reduce((s, v) => s + v * v, 0);
|
|
255
|
+
}
|
|
256
|
+
function jacobian(p) {
|
|
257
|
+
const J = Array.from({ length: m }, () => new Array(n).fill(0));
|
|
258
|
+
for (let j = 0; j < n; j++) {
|
|
259
|
+
const step = 1e-6 * (Math.abs(p[j]) + 1e-6);
|
|
260
|
+
const pPlus = [...p];
|
|
261
|
+
const pMinus = [...p];
|
|
262
|
+
pPlus[j] += step;
|
|
263
|
+
pMinus[j] -= step;
|
|
264
|
+
const rPlus = residuals(pPlus);
|
|
265
|
+
const rMinus = residuals(pMinus);
|
|
266
|
+
for (let i = 0; i < m; i++)
|
|
267
|
+
J[i][j] = (rPlus[i] - rMinus[i]) / (2 * step);
|
|
268
|
+
}
|
|
269
|
+
return J;
|
|
270
|
+
}
|
|
271
|
+
let r = residuals(params);
|
|
272
|
+
let currentSumSq = sumSq(r);
|
|
273
|
+
let iterations = 0;
|
|
274
|
+
let everImproved = false;
|
|
275
|
+
for (; iterations < maxIterations; iterations++) {
|
|
276
|
+
if (currentSumSq < tolerance)
|
|
277
|
+
break; // a near-exact fit -- stop early regardless of real data's usual nonzero floor below
|
|
278
|
+
const J = jacobian(params);
|
|
279
|
+
const JtJ = Array.from({ length: n }, () => new Array(n).fill(0));
|
|
280
|
+
const Jtr = new Array(n).fill(0);
|
|
281
|
+
for (let a = 0; a < n; a++) {
|
|
282
|
+
for (let b = 0; b < n; b++) {
|
|
283
|
+
let s = 0;
|
|
284
|
+
for (let i = 0; i < m; i++)
|
|
285
|
+
s += J[i][a] * J[i][b];
|
|
286
|
+
JtJ[a][b] = s;
|
|
287
|
+
}
|
|
288
|
+
let s2 = 0;
|
|
289
|
+
for (let i = 0; i < m; i++)
|
|
290
|
+
s2 += J[i][a] * r[i];
|
|
291
|
+
Jtr[a] = s2;
|
|
292
|
+
}
|
|
293
|
+
const prevSumSq = currentSumSq;
|
|
294
|
+
let accepted = false;
|
|
295
|
+
for (let tries = 0; tries < 30 && !accepted; tries++) {
|
|
296
|
+
const A = JtJ.map((row, a) => row.map((v, b) => v + (a === b ? lambda * JtJ[a][a] : 0)));
|
|
297
|
+
let delta;
|
|
298
|
+
try {
|
|
299
|
+
delta = [
|
|
300
|
+
...MatrixMath.solve(A, Jtr.map((v) => -v)),
|
|
301
|
+
];
|
|
302
|
+
}
|
|
303
|
+
catch {
|
|
304
|
+
lambda *= 10;
|
|
305
|
+
continue;
|
|
306
|
+
}
|
|
307
|
+
const candidate = params.map((p, i) => p + delta[i]);
|
|
308
|
+
const rCandidate = residuals(candidate);
|
|
309
|
+
const candidateSumSq = sumSq(rCandidate);
|
|
310
|
+
if (Number.isFinite(candidateSumSq) && candidateSumSq < currentSumSq) {
|
|
311
|
+
params = candidate;
|
|
312
|
+
r = rCandidate;
|
|
313
|
+
currentSumSq = candidateSumSq;
|
|
314
|
+
lambda = Math.max(lambda / 10, 1e-12);
|
|
315
|
+
accepted = true;
|
|
316
|
+
everImproved = true;
|
|
317
|
+
}
|
|
318
|
+
else {
|
|
319
|
+
lambda *= 10;
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
// Either terminating condition below is a real local minimum, not a
|
|
323
|
+
// failure: no damped step improves further (`!accepted`), or the ones
|
|
324
|
+
// that do are only shaving off numerically-insignificant amounts
|
|
325
|
+
// (`relativeImprovement` near zero) -- real (noisy) data's best fit
|
|
326
|
+
// essentially never drives `currentSumSq` itself near zero the way
|
|
327
|
+
// `tolerance` alone would require, so treating only *that* as success
|
|
328
|
+
// would wrongly call every noisy-data fit unconverged.
|
|
329
|
+
if (!accepted)
|
|
330
|
+
break;
|
|
331
|
+
const relativeImprovement = (prevSumSq - currentSumSq) / Math.max(1, prevSumSq);
|
|
332
|
+
if (relativeImprovement < 1e-12)
|
|
333
|
+
break;
|
|
334
|
+
}
|
|
335
|
+
return {
|
|
336
|
+
params,
|
|
337
|
+
residualNorm: Math.sqrt(currentSumSq),
|
|
338
|
+
iterations,
|
|
339
|
+
converged: everImproved || currentSumSq < tolerance,
|
|
340
|
+
};
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
//# sourceMappingURL=Numerical.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Numerical.js","sourceRoot":"","sources":["../src/Numerical.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { Cycle } from "./Cycle.ts";
|
|
2
|
+
/**
|
|
3
|
+
* Permutation — a bijection described by a domain array and the codomain array
|
|
4
|
+
* it maps onto (element-wise). Ported from Mallory's ActionScript `Permutation`.
|
|
5
|
+
*
|
|
6
|
+
* Bug fixes from the AS3 original:
|
|
7
|
+
* - the constructor silently ignored mismatched-length inputs; it now throws.
|
|
8
|
+
* - `order` wrapped cycle lengths in `ComplexNumber` then read `.value` off an
|
|
9
|
+
* `int` (yielding `undefined`); it now takes the LCM of the plain lengths and
|
|
10
|
+
* returns 1 for the identity.
|
|
11
|
+
* - `cycles` no longer mutates any shared state (it works on local copies).
|
|
12
|
+
*/
|
|
13
|
+
export declare class Permutation<T = unknown> {
|
|
14
|
+
private readonly _domain;
|
|
15
|
+
private readonly _coDomain;
|
|
16
|
+
private _lookup;
|
|
17
|
+
constructor(input: T[], output: T[]);
|
|
18
|
+
get domain(): T[];
|
|
19
|
+
get coDomain(): T[];
|
|
20
|
+
/** The domain -> codomain lookup map, built once (on first access) and reused thereafter. */
|
|
21
|
+
private get lookup();
|
|
22
|
+
/** Map an element through the permutation (identity outside the domain). */
|
|
23
|
+
apply(element: T): T;
|
|
24
|
+
/** The inverse permutation (swap domain and codomain). */
|
|
25
|
+
inverse(): Permutation<T>;
|
|
26
|
+
/** Raise the permutation to an integer power, via binary exponentiation (`O(log p)` compositions). */
|
|
27
|
+
power(pow: number): Permutation<T>;
|
|
28
|
+
toString(): string;
|
|
29
|
+
/** Decompose into disjoint cycles. */
|
|
30
|
+
cycles(): Array<Cycle<T>>;
|
|
31
|
+
/** The order of the permutation (LCM of its cycle lengths). */
|
|
32
|
+
order(): number;
|
|
33
|
+
static readonly Identity: Permutation<unknown>;
|
|
34
|
+
/** Compose two permutations: `(sigma ∘ tao)(x) = sigma(tao(x))`. */
|
|
35
|
+
static compose<T>(sigma: Permutation<T>, tao: Permutation<T>): Permutation<T>;
|
|
36
|
+
/** Compose a list of permutations left-to-right. */
|
|
37
|
+
static composeList<T>(list: Array<Permutation<T>>): Permutation<T>;
|
|
38
|
+
/** Structural equality (same action on every domain element of either). */
|
|
39
|
+
static equal<T>(sigma: Permutation<T>, tao: Permutation<T>): boolean;
|
|
40
|
+
/** Whether two permutations commute. */
|
|
41
|
+
static commute<T>(sigma: Permutation<T>, tao: Permutation<T>): boolean;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=Permutation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Permutation.d.ts","sourceRoot":"","sources":["../src/Permutation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAGnC;;;;;;;;;;GAUG;AACH,qBAAa,WAAW,CAAC,CAAC,GAAG,OAAO;IAClC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAM;IAC9B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAM;IAIhC,OAAO,CAAC,OAAO,CAA0B;gBAE7B,KAAK,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE;IAQnC,IAAI,MAAM,IAAI,CAAC,EAAE,CAEhB;IAED,IAAI,QAAQ,IAAI,CAAC,EAAE,CAElB;IAED,6FAA6F;IAC7F,OAAO,KAAK,MAAM,GAKjB;IAED,4EAA4E;IAC5E,KAAK,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC;IAKpB,0DAA0D;IAC1D,OAAO,IAAI,WAAW,CAAC,CAAC,CAAC;IAIzB,sGAAsG;IACtG,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC;IAsBlC,QAAQ,IAAI,MAAM;IAKlB,sCAAsC;IACtC,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAyBzB,+DAA+D;IAC/D,KAAK,IAAI,MAAM;IAMf,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,OAAO,CAAC,CAAoC;IAElF,oEAAoE;IACpE,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC;IAQ7E,oDAAoD;IACpD,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC;IAMlE,2EAA2E;IAC3E,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,OAAO;IAMpE,wCAAwC;IACxC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,OAAO;CAGvE"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { Cycle } from "./Cycle.js";
|
|
2
|
+
import { NumberTheory } from "./NumberTheory.js";
|
|
3
|
+
/**
|
|
4
|
+
* Permutation — a bijection described by a domain array and the codomain array
|
|
5
|
+
* it maps onto (element-wise). Ported from Mallory's ActionScript `Permutation`.
|
|
6
|
+
*
|
|
7
|
+
* Bug fixes from the AS3 original:
|
|
8
|
+
* - the constructor silently ignored mismatched-length inputs; it now throws.
|
|
9
|
+
* - `order` wrapped cycle lengths in `ComplexNumber` then read `.value` off an
|
|
10
|
+
* `int` (yielding `undefined`); it now takes the LCM of the plain lengths and
|
|
11
|
+
* returns 1 for the identity.
|
|
12
|
+
* - `cycles` no longer mutates any shared state (it works on local copies).
|
|
13
|
+
*/
|
|
14
|
+
export class Permutation {
|
|
15
|
+
_domain;
|
|
16
|
+
_coDomain;
|
|
17
|
+
// Lazily-built domain -> codomain lookup, cached on first use. The instance is otherwise
|
|
18
|
+
// immutable (domain/coDomain are never mutated after construction), so this is safe to cache
|
|
19
|
+
// for the lifetime of the object.
|
|
20
|
+
_lookup = null;
|
|
21
|
+
constructor(input, output) {
|
|
22
|
+
if (input.length !== output.length) {
|
|
23
|
+
throw new Error("Permutation domain and codomain must have equal length.");
|
|
24
|
+
}
|
|
25
|
+
this._domain = [...input];
|
|
26
|
+
this._coDomain = [...output];
|
|
27
|
+
}
|
|
28
|
+
get domain() {
|
|
29
|
+
return [...this._domain];
|
|
30
|
+
}
|
|
31
|
+
get coDomain() {
|
|
32
|
+
return [...this._coDomain];
|
|
33
|
+
}
|
|
34
|
+
/** The domain -> codomain lookup map, built once (on first access) and reused thereafter. */
|
|
35
|
+
get lookup() {
|
|
36
|
+
if (this._lookup === null) {
|
|
37
|
+
this._lookup = new Map(this._domain.map((d, i) => [d, this._coDomain[i]]));
|
|
38
|
+
}
|
|
39
|
+
return this._lookup;
|
|
40
|
+
}
|
|
41
|
+
/** Map an element through the permutation (identity outside the domain). */
|
|
42
|
+
apply(element) {
|
|
43
|
+
const map = this.lookup;
|
|
44
|
+
return map.has(element) ? map.get(element) : element;
|
|
45
|
+
}
|
|
46
|
+
/** The inverse permutation (swap domain and codomain). */
|
|
47
|
+
inverse() {
|
|
48
|
+
return new Permutation(this.coDomain, this.domain);
|
|
49
|
+
}
|
|
50
|
+
/** Raise the permutation to an integer power, via binary exponentiation (`O(log p)` compositions). */
|
|
51
|
+
power(pow) {
|
|
52
|
+
if (pow === 0)
|
|
53
|
+
return Permutation.Identity;
|
|
54
|
+
if (pow === 1)
|
|
55
|
+
return this;
|
|
56
|
+
if (pow === -1)
|
|
57
|
+
return this.inverse();
|
|
58
|
+
let base = this;
|
|
59
|
+
let p = pow;
|
|
60
|
+
if (pow < -1) {
|
|
61
|
+
base = this.inverse();
|
|
62
|
+
p = -pow;
|
|
63
|
+
}
|
|
64
|
+
// Repeated squaring: result accumulates the product of base^(2^i) for each set bit of p.
|
|
65
|
+
let result;
|
|
66
|
+
while (p > 0) {
|
|
67
|
+
if (p % 2 === 1)
|
|
68
|
+
result = result === undefined ? base : Permutation.compose(result, base);
|
|
69
|
+
p = Math.floor(p / 2);
|
|
70
|
+
if (p > 0)
|
|
71
|
+
base = Permutation.compose(base, base);
|
|
72
|
+
}
|
|
73
|
+
return result;
|
|
74
|
+
}
|
|
75
|
+
toString() {
|
|
76
|
+
const parts = this._domain.map((d, i) => `${d} -> ${this._coDomain[i]}`);
|
|
77
|
+
return `(${parts.join(",")})`;
|
|
78
|
+
}
|
|
79
|
+
/** Decompose into disjoint cycles. */
|
|
80
|
+
cycles() {
|
|
81
|
+
const domain = [...this._domain];
|
|
82
|
+
const coDomain = [...this._coDomain];
|
|
83
|
+
const result = [];
|
|
84
|
+
while (domain.length > 0) {
|
|
85
|
+
const start = domain[0];
|
|
86
|
+
let current = start;
|
|
87
|
+
const tempArray = [];
|
|
88
|
+
do {
|
|
89
|
+
tempArray.push(current);
|
|
90
|
+
current = this.apply(current);
|
|
91
|
+
for (let i = 0; i < coDomain.length; i++) {
|
|
92
|
+
if (current === coDomain[i]) {
|
|
93
|
+
domain.splice(i, 1);
|
|
94
|
+
coDomain.splice(i, 1);
|
|
95
|
+
break;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
} while (current !== start);
|
|
99
|
+
result.push(new Cycle(tempArray));
|
|
100
|
+
}
|
|
101
|
+
return result;
|
|
102
|
+
}
|
|
103
|
+
/** The order of the permutation (LCM of its cycle lengths). */
|
|
104
|
+
order() {
|
|
105
|
+
const lengths = this.cycles().map((c) => c.length);
|
|
106
|
+
if (lengths.length === 0)
|
|
107
|
+
return 1;
|
|
108
|
+
return Number(NumberTheory.lcmList(lengths));
|
|
109
|
+
}
|
|
110
|
+
static Identity = new Permutation([], []);
|
|
111
|
+
/** Compose two permutations: `(sigma ∘ tao)(x) = sigma(tao(x))`. */
|
|
112
|
+
static compose(sigma, tao) {
|
|
113
|
+
// Set preserves insertion order and dedupes in O(n), matching the old O(n^2)
|
|
114
|
+
// lastIndexOf/splice loop's "first occurrence wins" semantics exactly.
|
|
115
|
+
const newDomain = Array.from(new Set(sigma.domain.concat(tao.domain)));
|
|
116
|
+
const newCoDomain = newDomain.map((x) => sigma.apply(tao.apply(x)));
|
|
117
|
+
return new Permutation(newDomain, newCoDomain);
|
|
118
|
+
}
|
|
119
|
+
/** Compose a list of permutations left-to-right. */
|
|
120
|
+
static composeList(list) {
|
|
121
|
+
if (list.length === 0)
|
|
122
|
+
return Permutation.Identity;
|
|
123
|
+
if (list.length === 1)
|
|
124
|
+
return list[0];
|
|
125
|
+
return list.reduce((acc, p) => Permutation.compose(acc, p));
|
|
126
|
+
}
|
|
127
|
+
/** Structural equality (same action on every domain element of either). */
|
|
128
|
+
static equal(sigma, tao) {
|
|
129
|
+
for (const d of sigma.domain)
|
|
130
|
+
if (sigma.apply(d) !== tao.apply(d))
|
|
131
|
+
return false;
|
|
132
|
+
for (const d of tao.domain)
|
|
133
|
+
if (tao.apply(d) !== sigma.apply(d))
|
|
134
|
+
return false;
|
|
135
|
+
return true;
|
|
136
|
+
}
|
|
137
|
+
/** Whether two permutations commute. */
|
|
138
|
+
static commute(sigma, tao) {
|
|
139
|
+
return Permutation.equal(Permutation.compose(sigma, tao), Permutation.compose(tao, sigma));
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=Permutation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Permutation.js","sourceRoot":"","sources":["../src/Permutation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { Vector } from "./Vector.ts";
|
|
2
|
+
/** A 2D point stored as a {@link Vector} `[x, y]`. */
|
|
3
|
+
type Point = Vector<number>;
|
|
4
|
+
/**
|
|
5
|
+
* Polygon — an ordered list of vertex points ({@link Vector} subclass). Ported
|
|
6
|
+
* from Mallory's ActionScript `Polygon`.
|
|
7
|
+
*
|
|
8
|
+
* Bug fixes from the AS3 original:
|
|
9
|
+
* - `perimeter` accumulated into a `uint`, truncating the fractional length.
|
|
10
|
+
* - `area` only summed two triangles, so it was wrong for pentagons and up; it
|
|
11
|
+
* now uses the shoelace formula, correct for any simple polygon.
|
|
12
|
+
* - `angle` was stubbed to `return 0` (with dead code calling classes that do
|
|
13
|
+
* not exist); it now computes the interior angle via the law of cosines it
|
|
14
|
+
* documented.
|
|
15
|
+
*/
|
|
16
|
+
export declare class Polygon extends Vector<Point> {
|
|
17
|
+
/** The vertex at `index`, wrapping around the polygon. */
|
|
18
|
+
vertex(index: number): Point;
|
|
19
|
+
get vertexCount(): number;
|
|
20
|
+
get edgeCount(): number;
|
|
21
|
+
/** The edge starting at `index` as a two-vertex polygon. */
|
|
22
|
+
edge(index: number): Polygon;
|
|
23
|
+
/** Total perimeter length (bug fix: no longer truncated to an integer). */
|
|
24
|
+
perimeter(): number;
|
|
25
|
+
/** Heron's-formula area of the triangle on the first three vertices. */
|
|
26
|
+
private triArea;
|
|
27
|
+
/**
|
|
28
|
+
* Area of the polygon via the shoelace formula (bug fix: the AS3 version only
|
|
29
|
+
* summed two triangles and was wrong for polygons with more than four sides).
|
|
30
|
+
*/
|
|
31
|
+
area(): number;
|
|
32
|
+
/**
|
|
33
|
+
* The area centroid (center of mass) as an `[x, y]` point. Complements
|
|
34
|
+
* {@link perimeter} and {@link area}. Falls back to the vertex average for a
|
|
35
|
+
* degenerate (zero-area) polygon.
|
|
36
|
+
*/
|
|
37
|
+
centroid(): Point;
|
|
38
|
+
/**
|
|
39
|
+
* Interior angle (radians) at vertex `i`, via the law of cosines
|
|
40
|
+
* (bug fix: the AS3 method always returned 0).
|
|
41
|
+
*/
|
|
42
|
+
angle(i: number): number;
|
|
43
|
+
/** True when `point` lies inside the polygon (even-odd ray-casting rule). */
|
|
44
|
+
contains(point: Point): boolean;
|
|
45
|
+
/** True when the polygon is convex (all turns share the same orientation). */
|
|
46
|
+
isConvex(): boolean;
|
|
47
|
+
/** True when no two non-adjacent edges cross (the polygon is simple). */
|
|
48
|
+
isSimple(): boolean;
|
|
49
|
+
private static orient;
|
|
50
|
+
private static onSegment;
|
|
51
|
+
private static segmentsIntersect;
|
|
52
|
+
/**
|
|
53
|
+
* A regular n-gon: `n` vertices evenly spaced on a circle of `radius`
|
|
54
|
+
* around `center`, starting at `startAngle` (default `-pi/2`, i.e. the
|
|
55
|
+
* first vertex points straight up — the conventional orientation for a
|
|
56
|
+
* polygon drawn on a screen y-down or math y-up axis alike) and
|
|
57
|
+
* proceeding counterclockwise in standard math convention.
|
|
58
|
+
*/
|
|
59
|
+
static regular(n: number, radius?: number, center?: Point, startAngle?: number): Polygon;
|
|
60
|
+
/** A clone of the polygon (deep-clones nested vertex vectors by default). */
|
|
61
|
+
clone(deep?: boolean): Polygon;
|
|
62
|
+
}
|
|
63
|
+
export {};
|
|
64
|
+
//# sourceMappingURL=Polygon.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Polygon.d.ts","sourceRoot":"","sources":["../src/Polygon.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,sDAAsD;AACtD,KAAK,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;AAE5B;;;;;;;;;;;GAWG;AACH,qBAAa,OAAQ,SAAQ,MAAM,CAAC,KAAK,CAAC;IACxC,0DAA0D;IAC1D,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK;IAI5B,IAAI,WAAW,IAAI,MAAM,CAExB;IAED,IAAI,SAAS,IAAI,MAAM,CAGtB;IAED,4DAA4D;IAC5D,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAI5B,2EAA2E;IAC3E,SAAS,IAAI,MAAM;IAQnB,wEAAwE;IACxE,OAAO,CAAC,OAAO;IAQf;;;OAGG;IACH,IAAI,IAAI,MAAM;IAYd;;;;OAIG;IACH,QAAQ,IAAI,KAAK;IA0BjB;;;OAGG;IACH,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM;IAOxB,6EAA6E;IAC7E,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO;IAiB/B,8EAA8E;IAC9E,QAAQ,IAAI,OAAO;IAoBnB,yEAAyE;IACzE,QAAQ,IAAI,OAAO;IAiBnB,OAAO,CAAC,MAAM,CAAC,MAAM;IAOrB,OAAO,CAAC,MAAM,CAAC,SAAS;IASxB,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAahC;;;;;;OAMG;IACH,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,SAAI,EAAE,MAAM,GAAE,KAAgC,EAAE,UAAU,SAAe,GAAG,OAAO;IAWnH,6EAA6E;IACpE,KAAK,CAAC,IAAI,UAAO,GAAG,OAAO;CAQrC"}
|