@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
package/dist/Polygon.js
ADDED
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
import { NumberTheory } from "./NumberTheory.js";
|
|
2
|
+
import { distanceVector } from "./RealMath.js";
|
|
3
|
+
import { Vector } from "./Vector.js";
|
|
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 class Polygon extends Vector {
|
|
17
|
+
/** The vertex at `index`, wrapping around the polygon. */
|
|
18
|
+
vertex(index) {
|
|
19
|
+
return this[Number(NumberTheory.mod(index, this.length))];
|
|
20
|
+
}
|
|
21
|
+
get vertexCount() {
|
|
22
|
+
return this.length;
|
|
23
|
+
}
|
|
24
|
+
get edgeCount() {
|
|
25
|
+
if (this.vertexCount < 3)
|
|
26
|
+
return this.length - 1;
|
|
27
|
+
return this.vertexCount;
|
|
28
|
+
}
|
|
29
|
+
/** The edge starting at `index` as a two-vertex polygon. */
|
|
30
|
+
edge(index) {
|
|
31
|
+
return new Polygon(this.vertex(index), this.vertex(index + 1));
|
|
32
|
+
}
|
|
33
|
+
/** Total perimeter length (bug fix: no longer truncated to an integer). */
|
|
34
|
+
perimeter() {
|
|
35
|
+
let per = 0;
|
|
36
|
+
for (let i = 0; i < this.edgeCount; i++) {
|
|
37
|
+
per += distanceVector(this.vertex(i), this.vertex(i + 1));
|
|
38
|
+
}
|
|
39
|
+
return per;
|
|
40
|
+
}
|
|
41
|
+
/** Heron's-formula area of the triangle on the first three vertices. */
|
|
42
|
+
triArea() {
|
|
43
|
+
const a = distanceVector(this.vertex(0), this.vertex(1));
|
|
44
|
+
const b = distanceVector(this.vertex(1), this.vertex(2));
|
|
45
|
+
const c = distanceVector(this.vertex(2), this.vertex(0));
|
|
46
|
+
const s = (a + b + c) / 2;
|
|
47
|
+
return Math.sqrt(s * (s - a) * (s - b) * (s - c));
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Area of the polygon via the shoelace formula (bug fix: the AS3 version only
|
|
51
|
+
* summed two triangles and was wrong for polygons with more than four sides).
|
|
52
|
+
*/
|
|
53
|
+
area() {
|
|
54
|
+
if (this.vertexCount < 3)
|
|
55
|
+
return 0;
|
|
56
|
+
if (this.vertexCount === 3)
|
|
57
|
+
return this.triArea();
|
|
58
|
+
let sum = 0;
|
|
59
|
+
for (let i = 0; i < this.vertexCount; i++) {
|
|
60
|
+
const current = this.vertex(i);
|
|
61
|
+
const next = this.vertex(i + 1);
|
|
62
|
+
sum += current.x * next.y - next.x * current.y;
|
|
63
|
+
}
|
|
64
|
+
return Math.abs(sum) / 2;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* The area centroid (center of mass) as an `[x, y]` point. Complements
|
|
68
|
+
* {@link perimeter} and {@link area}. Falls back to the vertex average for a
|
|
69
|
+
* degenerate (zero-area) polygon.
|
|
70
|
+
*/
|
|
71
|
+
centroid() {
|
|
72
|
+
let signedArea = 0;
|
|
73
|
+
let cx = 0;
|
|
74
|
+
let cy = 0;
|
|
75
|
+
for (let i = 0; i < this.vertexCount; i++) {
|
|
76
|
+
const cur = this.vertex(i);
|
|
77
|
+
const next = this.vertex(i + 1);
|
|
78
|
+
const cross = cur.x * next.y - next.x * cur.y;
|
|
79
|
+
signedArea += cross;
|
|
80
|
+
cx += (cur.x + next.x) * cross;
|
|
81
|
+
cy += (cur.y + next.y) * cross;
|
|
82
|
+
}
|
|
83
|
+
if (signedArea === 0) {
|
|
84
|
+
// Degenerate: average the vertices.
|
|
85
|
+
let sx = 0;
|
|
86
|
+
let sy = 0;
|
|
87
|
+
for (let i = 0; i < this.vertexCount; i++) {
|
|
88
|
+
sx += this.vertex(i).x;
|
|
89
|
+
sy += this.vertex(i).y;
|
|
90
|
+
}
|
|
91
|
+
const n = this.vertexCount || 1;
|
|
92
|
+
return Vector.fromArray([sx / n, sy / n]);
|
|
93
|
+
}
|
|
94
|
+
return Vector.fromArray([cx / (3 * signedArea), cy / (3 * signedArea)]);
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Interior angle (radians) at vertex `i`, via the law of cosines
|
|
98
|
+
* (bug fix: the AS3 method always returned 0).
|
|
99
|
+
*/
|
|
100
|
+
angle(i) {
|
|
101
|
+
const ab = distanceVector(this.vertex(i), this.vertex(i + 1));
|
|
102
|
+
const bc = distanceVector(this.vertex(i), this.vertex(i - 1));
|
|
103
|
+
const ac = distanceVector(this.vertex(i + 1), this.vertex(i - 1));
|
|
104
|
+
return Math.acos((ab * ab + bc * bc - ac * ac) / (2 * ab * bc));
|
|
105
|
+
}
|
|
106
|
+
/** True when `point` lies inside the polygon (even-odd ray-casting rule). */
|
|
107
|
+
contains(point) {
|
|
108
|
+
const px = point.x;
|
|
109
|
+
const py = point.y;
|
|
110
|
+
let inside = false;
|
|
111
|
+
const n = this.vertexCount;
|
|
112
|
+
for (let i = 0, j = n - 1; i < n; j = i++) {
|
|
113
|
+
const vi = this.vertex(i);
|
|
114
|
+
const vj = this.vertex(j);
|
|
115
|
+
const xi = vi.x;
|
|
116
|
+
const yi = vi.y;
|
|
117
|
+
const xj = vj.x;
|
|
118
|
+
const yj = vj.y;
|
|
119
|
+
if (yi > py !== yj > py && px < ((xj - xi) * (py - yi)) / (yj - yi) + xi)
|
|
120
|
+
inside = !inside;
|
|
121
|
+
}
|
|
122
|
+
return inside;
|
|
123
|
+
}
|
|
124
|
+
/** True when the polygon is convex (all turns share the same orientation). */
|
|
125
|
+
isConvex() {
|
|
126
|
+
const n = this.vertexCount;
|
|
127
|
+
if (n < 3)
|
|
128
|
+
return false;
|
|
129
|
+
let sign = 0;
|
|
130
|
+
for (let i = 0; i < n; i++) {
|
|
131
|
+
const a = this.vertex(i);
|
|
132
|
+
const b = this.vertex(i + 1);
|
|
133
|
+
const c = this.vertex(i + 2);
|
|
134
|
+
const cross = (b.x - a.x) * (c.y - b.y) -
|
|
135
|
+
(b.y - a.y) * (c.x - b.x);
|
|
136
|
+
if (cross !== 0) {
|
|
137
|
+
const s = Math.sign(cross);
|
|
138
|
+
if (sign === 0)
|
|
139
|
+
sign = s;
|
|
140
|
+
else if (s !== sign)
|
|
141
|
+
return false;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return true;
|
|
145
|
+
}
|
|
146
|
+
/** True when no two non-adjacent edges cross (the polygon is simple). */
|
|
147
|
+
isSimple() {
|
|
148
|
+
const n = this.vertexCount;
|
|
149
|
+
if (n < 3)
|
|
150
|
+
return false;
|
|
151
|
+
for (let i = 0; i < n; i++) {
|
|
152
|
+
const a1 = this.vertex(i);
|
|
153
|
+
const a2 = this.vertex(i + 1);
|
|
154
|
+
for (let j = i + 1; j < n; j++) {
|
|
155
|
+
// Skip edges that share a vertex (adjacent, or the wrap-around pair).
|
|
156
|
+
if (j === i || j === i + 1 || (i === 0 && j === n - 1))
|
|
157
|
+
continue;
|
|
158
|
+
const b1 = this.vertex(j);
|
|
159
|
+
const b2 = this.vertex(j + 1);
|
|
160
|
+
if (Polygon.segmentsIntersect(a1, a2, b1, b2))
|
|
161
|
+
return false;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
return true;
|
|
165
|
+
}
|
|
166
|
+
static orient(a, b, c) {
|
|
167
|
+
return ((b.x - a.x) * (c.y - a.y) -
|
|
168
|
+
(b.y - a.y) * (c.x - a.x));
|
|
169
|
+
}
|
|
170
|
+
static onSegment(a, b, p) {
|
|
171
|
+
return (Math.min(a.x, b.x) <= p.x &&
|
|
172
|
+
p.x <= Math.max(a.x, b.x) &&
|
|
173
|
+
Math.min(a.y, b.y) <= p.y &&
|
|
174
|
+
p.y <= Math.max(a.y, b.y));
|
|
175
|
+
}
|
|
176
|
+
static segmentsIntersect(p1, p2, p3, p4) {
|
|
177
|
+
const d1 = Polygon.orient(p3, p4, p1);
|
|
178
|
+
const d2 = Polygon.orient(p3, p4, p2);
|
|
179
|
+
const d3 = Polygon.orient(p1, p2, p3);
|
|
180
|
+
const d4 = Polygon.orient(p1, p2, p4);
|
|
181
|
+
if (((d1 > 0 && d2 < 0) || (d1 < 0 && d2 > 0)) && ((d3 > 0 && d4 < 0) || (d3 < 0 && d4 > 0)))
|
|
182
|
+
return true;
|
|
183
|
+
if (d1 === 0 && Polygon.onSegment(p3, p4, p1))
|
|
184
|
+
return true;
|
|
185
|
+
if (d2 === 0 && Polygon.onSegment(p3, p4, p2))
|
|
186
|
+
return true;
|
|
187
|
+
if (d3 === 0 && Polygon.onSegment(p1, p2, p3))
|
|
188
|
+
return true;
|
|
189
|
+
if (d4 === 0 && Polygon.onSegment(p1, p2, p4))
|
|
190
|
+
return true;
|
|
191
|
+
return false;
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* A regular n-gon: `n` vertices evenly spaced on a circle of `radius`
|
|
195
|
+
* around `center`, starting at `startAngle` (default `-pi/2`, i.e. the
|
|
196
|
+
* first vertex points straight up — the conventional orientation for a
|
|
197
|
+
* polygon drawn on a screen y-down or math y-up axis alike) and
|
|
198
|
+
* proceeding counterclockwise in standard math convention.
|
|
199
|
+
*/
|
|
200
|
+
static regular(n, radius = 1, center = Vector.fromArray([0, 0]), startAngle = -Math.PI / 2) {
|
|
201
|
+
if (n < 3)
|
|
202
|
+
throw new Error(`Polygon.regular: n must be at least 3, got ${n}`);
|
|
203
|
+
const cx = center.x;
|
|
204
|
+
const cy = center.y;
|
|
205
|
+
const vertices = Array.from({ length: n }, (_, i) => {
|
|
206
|
+
const theta = startAngle + (2 * Math.PI * i) / n;
|
|
207
|
+
return Vector.fromArray([cx + radius * Math.cos(theta), cy + radius * Math.sin(theta)]);
|
|
208
|
+
});
|
|
209
|
+
return new Polygon(...vertices);
|
|
210
|
+
}
|
|
211
|
+
/** A clone of the polygon (deep-clones nested vertex vectors by default). */
|
|
212
|
+
clone(deep = true) {
|
|
213
|
+
const out = new Polygon(this.length);
|
|
214
|
+
for (let i = 0; i < out.length; i++) {
|
|
215
|
+
const el = this[i];
|
|
216
|
+
out[i] = deep && el instanceof Vector ? el.clone() : el;
|
|
217
|
+
}
|
|
218
|
+
return out;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
//# sourceMappingURL=Polygon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Polygon.js","sourceRoot":"","sources":["../src/Polygon.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import type { Structure } from "./Structure.ts";
|
|
2
|
+
/**
|
|
3
|
+
* PolynomialRing — polynomials with coefficients in an arbitrary {@link Structure}
|
|
4
|
+
* (a finite field, the rationals, quaternions, whatever the structure supplies),
|
|
5
|
+
* following {@link GroupTheory}'s idiom of accepting the algebra as a constructor
|
|
6
|
+
* parameter rather than duplicating field logic. This generalizes long division,
|
|
7
|
+
* GCD, differentiation, and evaluation to any field — e.g. polynomials over
|
|
8
|
+
* `Structure.integersModulo(7)`, or plain real polynomials via
|
|
9
|
+
* `new PolynomialRing(Structure.realField())`.
|
|
10
|
+
*
|
|
11
|
+
* Coefficients are plain `T[]` arrays in ascending power (`p[i]` is the
|
|
12
|
+
* coefficient of `x^i`), trimmed of trailing zero coefficients. The zero
|
|
13
|
+
* polynomial is `[]`, with degree `-1`.
|
|
14
|
+
*
|
|
15
|
+
* {@link parsePolynomial}/{@link polynomialToString} below are real-number-only
|
|
16
|
+
* helpers for the common `"3*x^2-2*x+1"` string notation — parsing/formatting
|
|
17
|
+
* needs decimal syntax, which doesn't generalize to an arbitrary `Structure`.
|
|
18
|
+
*/
|
|
19
|
+
export declare class PolynomialRing<T> {
|
|
20
|
+
readonly structure: Structure<T>;
|
|
21
|
+
constructor(structure: Structure<T>);
|
|
22
|
+
/** Drop trailing coefficients equal to the structure's zero. */
|
|
23
|
+
private trim;
|
|
24
|
+
/** `-1` for the zero polynomial, else the index of the highest non-zero coefficient. */
|
|
25
|
+
degree(p: T[]): number;
|
|
26
|
+
zero(): T[];
|
|
27
|
+
one(): T[];
|
|
28
|
+
private pad;
|
|
29
|
+
add(a: T[], b: T[]): T[];
|
|
30
|
+
negate(p: T[]): T[];
|
|
31
|
+
subtract(a: T[], b: T[]): T[];
|
|
32
|
+
scale(p: T[], scalar: T): T[];
|
|
33
|
+
multiply(a: T[], b: T[]): T[];
|
|
34
|
+
/** Polynomial long division over the structure's field operations. */
|
|
35
|
+
divmod(a: T[], b: T[]): {
|
|
36
|
+
quotient: T[];
|
|
37
|
+
remainder: T[];
|
|
38
|
+
};
|
|
39
|
+
divide(a: T[], b: T[]): T[];
|
|
40
|
+
mod(a: T[], b: T[]): T[];
|
|
41
|
+
/** Rescale so the leading coefficient is the structure's one. No-op on the zero polynomial. */
|
|
42
|
+
private makeMonic;
|
|
43
|
+
/** Monic GCD via the Euclidean algorithm (repeated `divmod`). */
|
|
44
|
+
gcd(a: T[], b: T[]): T[];
|
|
45
|
+
/**
|
|
46
|
+
* The derivative polynomial (`i·c_i`, well-defined over any ring: `i` is
|
|
47
|
+
* built up as a running "`n` copies of the structure's `one`, added
|
|
48
|
+
* together" accumulator rather than being reconstructed from scratch for
|
|
49
|
+
* each coefficient — that would cost O(i) additions per coefficient, i.e.
|
|
50
|
+
* O(n²) additions overall for a degree-n polynomial).
|
|
51
|
+
*/
|
|
52
|
+
derivative(p: T[]): T[];
|
|
53
|
+
/**
|
|
54
|
+
* An antiderivative with zero constant of integration (`c_i / (i+1)`, via the
|
|
55
|
+
* structure's `reciprocal`). `i+1` is built up as a running accumulator (see
|
|
56
|
+
* {@link derivative}) instead of being reconstructed from scratch per term.
|
|
57
|
+
*/
|
|
58
|
+
antiderivative(p: T[]): T[];
|
|
59
|
+
/** Evaluate at `x` via Horner's method, using the structure's field operations. */
|
|
60
|
+
evaluate(p: T[], x: T): T;
|
|
61
|
+
equal(a: T[], b: T[]): boolean;
|
|
62
|
+
toString(p: T[], variable?: string): string;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Parse a real-coefficient polynomial string such as `"3*x^2-2*x+1"` into
|
|
66
|
+
* ascending-power coefficients (inverse of {@link polynomialToString}).
|
|
67
|
+
*/
|
|
68
|
+
export declare function parsePolynomial(str: string, variable?: string): number[];
|
|
69
|
+
/**
|
|
70
|
+
* Render ascending-power real coefficients as a human-readable string such as
|
|
71
|
+
* `3*x^2+2*x+1` (inverse of {@link parsePolynomial}).
|
|
72
|
+
*/
|
|
73
|
+
export declare function polynomialToString(coeffs: number[], variable?: string, descending?: boolean): string;
|
|
74
|
+
//# sourceMappingURL=PolynomialRing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PolynomialRing.d.ts","sourceRoot":"","sources":["../src/PolynomialRing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,cAAc,CAAC,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;gBAErB,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;IAInC,gEAAgE;IAChE,OAAO,CAAC,IAAI;IAMZ,wFAAwF;IACxF,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,MAAM;IAItB,IAAI,IAAI,CAAC,EAAE;IAIX,GAAG,IAAI,CAAC,EAAE;IAIV,OAAO,CAAC,GAAG;IAMX,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE;IAOxB,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE;IAInB,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE;IAI7B,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE;IAI7B,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE;IAW7B,sEAAsE;IACtE,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG;QAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;QAAC,SAAS,EAAE,CAAC,EAAE,CAAA;KAAE;IAsBzD,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE;IAI3B,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE;IAIxB,+FAA+F;IAC/F,OAAO,CAAC,SAAS;IAMjB,iEAAiE;IACjE,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE;IAWxB;;;;;;OAMG;IACH,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE;IAWvB;;;;OAIG;IACH,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE;IAW3B,mFAAmF;IACnF,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC;IAQzB,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,OAAO;IAM9B,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,QAAQ,SAAM,GAAG,MAAM;CAazC;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,SAAM,GAAG,MAAM,EAAE,CAyBrE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,QAAQ,SAAM,EAAE,UAAU,UAAO,GAAG,MAAM,CAU9F"}
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PolynomialRing — polynomials with coefficients in an arbitrary {@link Structure}
|
|
3
|
+
* (a finite field, the rationals, quaternions, whatever the structure supplies),
|
|
4
|
+
* following {@link GroupTheory}'s idiom of accepting the algebra as a constructor
|
|
5
|
+
* parameter rather than duplicating field logic. This generalizes long division,
|
|
6
|
+
* GCD, differentiation, and evaluation to any field — e.g. polynomials over
|
|
7
|
+
* `Structure.integersModulo(7)`, or plain real polynomials via
|
|
8
|
+
* `new PolynomialRing(Structure.realField())`.
|
|
9
|
+
*
|
|
10
|
+
* Coefficients are plain `T[]` arrays in ascending power (`p[i]` is the
|
|
11
|
+
* coefficient of `x^i`), trimmed of trailing zero coefficients. The zero
|
|
12
|
+
* polynomial is `[]`, with degree `-1`.
|
|
13
|
+
*
|
|
14
|
+
* {@link parsePolynomial}/{@link polynomialToString} below are real-number-only
|
|
15
|
+
* helpers for the common `"3*x^2-2*x+1"` string notation — parsing/formatting
|
|
16
|
+
* needs decimal syntax, which doesn't generalize to an arbitrary `Structure`.
|
|
17
|
+
*/
|
|
18
|
+
export class PolynomialRing {
|
|
19
|
+
structure;
|
|
20
|
+
constructor(structure) {
|
|
21
|
+
this.structure = structure;
|
|
22
|
+
}
|
|
23
|
+
/** Drop trailing coefficients equal to the structure's zero. */
|
|
24
|
+
trim(p) {
|
|
25
|
+
let n = p.length;
|
|
26
|
+
while (n > 0 && this.structure.equality(p[n - 1], this.structure.zero))
|
|
27
|
+
n--;
|
|
28
|
+
return p.slice(0, n);
|
|
29
|
+
}
|
|
30
|
+
/** `-1` for the zero polynomial, else the index of the highest non-zero coefficient. */
|
|
31
|
+
degree(p) {
|
|
32
|
+
return this.trim(p).length - 1;
|
|
33
|
+
}
|
|
34
|
+
zero() {
|
|
35
|
+
return [];
|
|
36
|
+
}
|
|
37
|
+
one() {
|
|
38
|
+
return [this.structure.one];
|
|
39
|
+
}
|
|
40
|
+
pad(p, length) {
|
|
41
|
+
const result = p.slice();
|
|
42
|
+
while (result.length < length)
|
|
43
|
+
result.push(this.structure.zero);
|
|
44
|
+
return result;
|
|
45
|
+
}
|
|
46
|
+
add(a, b) {
|
|
47
|
+
const length = Math.max(a.length, b.length);
|
|
48
|
+
const pa = this.pad(a, length);
|
|
49
|
+
const pb = this.pad(b, length);
|
|
50
|
+
return this.trim(pa.map((x, i) => this.structure.add(x, pb[i])));
|
|
51
|
+
}
|
|
52
|
+
negate(p) {
|
|
53
|
+
return p.map((x) => this.structure.negative(x));
|
|
54
|
+
}
|
|
55
|
+
subtract(a, b) {
|
|
56
|
+
return this.add(a, this.negate(b));
|
|
57
|
+
}
|
|
58
|
+
scale(p, scalar) {
|
|
59
|
+
return this.trim(p.map((x) => this.structure.multiply(scalar, x)));
|
|
60
|
+
}
|
|
61
|
+
multiply(a, b) {
|
|
62
|
+
if (a.length === 0 || b.length === 0)
|
|
63
|
+
return [];
|
|
64
|
+
const result = new Array(a.length + b.length - 1).fill(this.structure.zero);
|
|
65
|
+
for (let i = 0; i < a.length; i++) {
|
|
66
|
+
for (let j = 0; j < b.length; j++) {
|
|
67
|
+
result[i + j] = this.structure.add(result[i + j], this.structure.multiply(a[i], b[j]));
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return this.trim(result);
|
|
71
|
+
}
|
|
72
|
+
/** Polynomial long division over the structure's field operations. */
|
|
73
|
+
divmod(a, b) {
|
|
74
|
+
const bd = this.degree(b);
|
|
75
|
+
if (bd < 0)
|
|
76
|
+
throw new Error("PolynomialRing: division by the zero polynomial");
|
|
77
|
+
let remainder = this.trim(a);
|
|
78
|
+
const leadInv = this.structure.reciprocal(b[bd]);
|
|
79
|
+
const quotient = new Array(Math.max(this.degree(remainder) - bd + 1, 0)).fill(this.structure.zero);
|
|
80
|
+
while (this.degree(remainder) >= bd) {
|
|
81
|
+
const rd = this.degree(remainder);
|
|
82
|
+
const shift = rd - bd;
|
|
83
|
+
const coeff = this.structure.multiply(remainder[rd], leadInv);
|
|
84
|
+
quotient[shift] = coeff;
|
|
85
|
+
for (let i = 0; i <= bd; i++) {
|
|
86
|
+
remainder[i + shift] = this.structure.subtract(remainder[i + shift], this.structure.multiply(coeff, b[i]));
|
|
87
|
+
}
|
|
88
|
+
remainder = this.trim(remainder);
|
|
89
|
+
}
|
|
90
|
+
return { quotient: this.trim(quotient), remainder };
|
|
91
|
+
}
|
|
92
|
+
divide(a, b) {
|
|
93
|
+
return this.divmod(a, b).quotient;
|
|
94
|
+
}
|
|
95
|
+
mod(a, b) {
|
|
96
|
+
return this.divmod(a, b).remainder;
|
|
97
|
+
}
|
|
98
|
+
/** Rescale so the leading coefficient is the structure's one. No-op on the zero polynomial. */
|
|
99
|
+
makeMonic(p) {
|
|
100
|
+
const d = this.degree(p);
|
|
101
|
+
if (d < 0)
|
|
102
|
+
return p;
|
|
103
|
+
return this.scale(p, this.structure.reciprocal(p[d]));
|
|
104
|
+
}
|
|
105
|
+
/** Monic GCD via the Euclidean algorithm (repeated `divmod`). */
|
|
106
|
+
gcd(a, b) {
|
|
107
|
+
let x = this.trim(a);
|
|
108
|
+
let y = this.trim(b);
|
|
109
|
+
while (this.degree(y) >= 0) {
|
|
110
|
+
const { remainder } = this.divmod(x, y);
|
|
111
|
+
x = y;
|
|
112
|
+
y = remainder;
|
|
113
|
+
}
|
|
114
|
+
return this.makeMonic(x);
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* The derivative polynomial (`i·c_i`, well-defined over any ring: `i` is
|
|
118
|
+
* built up as a running "`n` copies of the structure's `one`, added
|
|
119
|
+
* together" accumulator rather than being reconstructed from scratch for
|
|
120
|
+
* each coefficient — that would cost O(i) additions per coefficient, i.e.
|
|
121
|
+
* O(n²) additions overall for a degree-n polynomial).
|
|
122
|
+
*/
|
|
123
|
+
derivative(p) {
|
|
124
|
+
const trimmed = this.trim(p);
|
|
125
|
+
const out = [];
|
|
126
|
+
let n = this.structure.zero; // accumulates to `i` as an element of the structure
|
|
127
|
+
for (let i = 1; i < trimmed.length; i++) {
|
|
128
|
+
n = this.structure.add(n, this.structure.one);
|
|
129
|
+
out.push(this.structure.multiply(n, trimmed[i]));
|
|
130
|
+
}
|
|
131
|
+
return this.trim(out);
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* An antiderivative with zero constant of integration (`c_i / (i+1)`, via the
|
|
135
|
+
* structure's `reciprocal`). `i+1` is built up as a running accumulator (see
|
|
136
|
+
* {@link derivative}) instead of being reconstructed from scratch per term.
|
|
137
|
+
*/
|
|
138
|
+
antiderivative(p) {
|
|
139
|
+
const trimmed = this.trim(p);
|
|
140
|
+
const out = [this.structure.zero];
|
|
141
|
+
let n = this.structure.zero; // accumulates to `i+1` as an element of the structure
|
|
142
|
+
for (let i = 0; i < trimmed.length; i++) {
|
|
143
|
+
n = this.structure.add(n, this.structure.one);
|
|
144
|
+
out.push(this.structure.multiply(trimmed[i], this.structure.reciprocal(n)));
|
|
145
|
+
}
|
|
146
|
+
return this.trim(out);
|
|
147
|
+
}
|
|
148
|
+
/** Evaluate at `x` via Horner's method, using the structure's field operations. */
|
|
149
|
+
evaluate(p, x) {
|
|
150
|
+
let result = this.structure.zero;
|
|
151
|
+
for (let i = p.length - 1; i >= 0; i--) {
|
|
152
|
+
result = this.structure.add(this.structure.multiply(result, x), p[i]);
|
|
153
|
+
}
|
|
154
|
+
return result;
|
|
155
|
+
}
|
|
156
|
+
equal(a, b) {
|
|
157
|
+
const ta = this.trim(a);
|
|
158
|
+
const tb = this.trim(b);
|
|
159
|
+
return ta.length === tb.length && ta.every((x, i) => this.structure.equality(x, tb[i]));
|
|
160
|
+
}
|
|
161
|
+
toString(p, variable = "x") {
|
|
162
|
+
const trimmed = this.trim(p);
|
|
163
|
+
if (trimmed.length === 0)
|
|
164
|
+
return "0";
|
|
165
|
+
const terms = [];
|
|
166
|
+
for (let i = trimmed.length - 1; i >= 0; i--) {
|
|
167
|
+
const c = trimmed[i];
|
|
168
|
+
if (this.structure.equality(c, this.structure.zero))
|
|
169
|
+
continue;
|
|
170
|
+
if (i === 0)
|
|
171
|
+
terms.push(`${c}`);
|
|
172
|
+
else if (i === 1)
|
|
173
|
+
terms.push(`${c}*${variable}`);
|
|
174
|
+
else
|
|
175
|
+
terms.push(`${c}*${variable}^${i}`);
|
|
176
|
+
}
|
|
177
|
+
return terms.join("+");
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Parse a real-coefficient polynomial string such as `"3*x^2-2*x+1"` into
|
|
182
|
+
* ascending-power coefficients (inverse of {@link polynomialToString}).
|
|
183
|
+
*/
|
|
184
|
+
export function parsePolynomial(str, variable = "x") {
|
|
185
|
+
const s = str.replace(/\s+/g, "");
|
|
186
|
+
if (s === "")
|
|
187
|
+
return [0];
|
|
188
|
+
const terms = s
|
|
189
|
+
.replace(/-/g, "+-")
|
|
190
|
+
.split("+")
|
|
191
|
+
.filter((t) => t !== "");
|
|
192
|
+
const p = [];
|
|
193
|
+
for (const term of terms) {
|
|
194
|
+
let coef;
|
|
195
|
+
let exp;
|
|
196
|
+
const vi = term.indexOf(variable);
|
|
197
|
+
if (vi === -1) {
|
|
198
|
+
coef = Number(term);
|
|
199
|
+
exp = 0;
|
|
200
|
+
}
|
|
201
|
+
else {
|
|
202
|
+
const coefPart = term.slice(0, vi).replace(/\*$/, "");
|
|
203
|
+
coef = coefPart === "" || coefPart === "+" ? 1 : coefPart === "-" ? -1 : Number(coefPart);
|
|
204
|
+
const rest = term.slice(vi + variable.length);
|
|
205
|
+
exp = rest.startsWith("^") ? Number(rest.slice(1)) : 1;
|
|
206
|
+
}
|
|
207
|
+
p[exp] = (p[exp] ?? 0) + coef;
|
|
208
|
+
}
|
|
209
|
+
for (let i = 0; i < p.length; i++)
|
|
210
|
+
if (p[i] === undefined)
|
|
211
|
+
p[i] = 0;
|
|
212
|
+
return p;
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Render ascending-power real coefficients as a human-readable string such as
|
|
216
|
+
* `3*x^2+2*x+1` (inverse of {@link parsePolynomial}).
|
|
217
|
+
*/
|
|
218
|
+
export function polynomialToString(coeffs, variable = "x", descending = true) {
|
|
219
|
+
const term = (coef, i) => {
|
|
220
|
+
if (i === 0)
|
|
221
|
+
return String(coef);
|
|
222
|
+
if (i === 1)
|
|
223
|
+
return `${coef}*${variable}`;
|
|
224
|
+
return `${coef}*${variable}^${i}`;
|
|
225
|
+
};
|
|
226
|
+
const indices = descending
|
|
227
|
+
? Array.from({ length: coeffs.length }, (_, i) => coeffs.length - 1 - i)
|
|
228
|
+
: Array.from({ length: coeffs.length }, (_, i) => i);
|
|
229
|
+
return indices.map((i) => term(coeffs[i], i)).join("+");
|
|
230
|
+
}
|
|
231
|
+
//# sourceMappingURL=PolynomialRing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PolynomialRing.js","sourceRoot":"","sources":["../src/PolynomialRing.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,OAAO,cAAc;IAChB,SAAS,CAAe;IAEjC,YAAY,SAAuB;QACjC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED,gEAAgE;IACxD,IAAI,CAAC,CAAM;QACjB,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAM,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;YAAE,CAAC,EAAE,CAAC;QACjF,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACvB,CAAC;IAED,wFAAwF;IACxF,MAAM,CAAC,CAAM;QACX,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IACjC,CAAC;IAED,IAAI;QACF,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,GAAG;QACD,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;IAEO,GAAG,CAAC,CAAM,EAAE,MAAc;QAChC,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC;QACzB,OAAO,MAAM,CAAC,MAAM,GAAG,MAAM;YAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAChE,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,GAAG,CAAC,CAAM,EAAE,CAAM;QAChB,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QAC/B,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QAC/B,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAM,CAAC,CAAC,CAAC,CAAC;IACxE,CAAC;IAED,MAAM,CAAC,CAAM;QACX,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAClD,CAAC;IAED,QAAQ,CAAC,CAAM,EAAE,CAAM;QACrB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,CAAM,EAAE,MAAS;QACrB,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACrE,CAAC;IAED,QAAQ,CAAC,CAAM,EAAE,CAAM;QACrB,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAChD,MAAM,MAAM,GAAQ,IAAI,KAAK,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACjF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAClC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAM,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAM,EAAE,CAAC,CAAC,CAAC,CAAM,CAAC,CAAC,CAAC;YACxG,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC3B,CAAC;IAED,sEAAsE;IACtE,MAAM,CAAC,CAAM,EAAE,CAAM;QACnB,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC1B,IAAI,EAAE,GAAG,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;QAC/E,IAAI,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAM,CAAC,CAAC;QACtD,MAAM,QAAQ,GAAQ,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACxG,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC;YACpC,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAClC,MAAM,KAAK,GAAG,EAAE,GAAG,EAAE,CAAC;YACtB,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAM,EAAE,OAAO,CAAC,CAAC;YACnE,QAAQ,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;YACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC7B,SAAS,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAC5C,SAAS,CAAC,CAAC,GAAG,KAAK,CAAM,EACzB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAM,CAAC,CAC1C,CAAC;YACJ,CAAC;YACD,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACnC,CAAC;QACD,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,SAAS,EAAE,CAAC;IACtD,CAAC;IAED,MAAM,CAAC,CAAM,EAAE,CAAM;QACnB,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;IACpC,CAAC;IAED,GAAG,CAAC,CAAM,EAAE,CAAM;QAChB,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IACrC,CAAC;IAED,+FAA+F;IACvF,SAAS,CAAC,CAAM;QACtB,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACzB,IAAI,CAAC,GAAG,CAAC;YAAE,OAAO,CAAC,CAAC;QACpB,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAM,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,iEAAiE;IACjE,GAAG,CAAC,CAAM,EAAE,CAAM;QAChB,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACrB,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3B,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACxC,CAAC,GAAG,CAAC,CAAC;YACN,CAAC,GAAG,SAAS,CAAC;QAChB,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC;IAED;;;;;;OAMG;IACH,UAAU,CAAC,CAAM;QACf,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7B,MAAM,GAAG,GAAQ,EAAE,CAAC;QACpB,IAAI,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,oDAAoD;QACjF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YAC9C,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAM,CAAC,CAAC,CAAC;QACxD,CAAC;QACD,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;IAED;;;;OAIG;IACH,cAAc,CAAC,CAAM;QACnB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7B,MAAM,GAAG,GAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,sDAAsD;QACnF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YAC9C,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAM,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACnF,CAAC;QACD,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;IAED,mFAAmF;IACnF,QAAQ,CAAC,CAAM,EAAE,CAAI;QACnB,IAAI,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;QACjC,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAM,CAAC,CAAC;QAC7E,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,CAAM,EAAE,CAAM;QAClB,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACxB,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACxB,OAAO,EAAE,CAAC,MAAM,KAAK,EAAE,CAAC,MAAM,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAM,CAAC,CAAC,CAAC;IAC/F,CAAC;IAED,QAAQ,CAAC,CAAM,EAAE,QAAQ,GAAG,GAAG;QAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,GAAG,CAAC;QACrC,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7C,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAM,CAAC;YAC1B,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;gBAAE,SAAS;YAC9D,IAAI,CAAC,KAAK,CAAC;gBAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;iBAC3B,IAAI,CAAC,KAAK,CAAC;gBAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,QAAQ,EAAE,CAAC,CAAC;;gBAC5C,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC,CAAC;QAC3C,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,GAAW,EAAE,QAAQ,GAAG,GAAG;IACzD,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAClC,IAAI,CAAC,KAAK,EAAE;QAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IACzB,MAAM,KAAK,GAAG,CAAC;SACZ,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC;SACnB,KAAK,CAAC,GAAG,CAAC;SACV,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IAC3B,MAAM,CAAC,GAAa,EAAE,CAAC;IACvB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAY,CAAC;QACjB,IAAI,GAAW,CAAC;QAChB,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAClC,IAAI,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;YACd,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;YACpB,GAAG,GAAG,CAAC,CAAC;QACV,CAAC;aAAM,CAAC;YACN,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACtD,IAAI,GAAG,QAAQ,KAAK,EAAE,IAAI,QAAQ,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC1F,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;YAC9C,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACzD,CAAC;QACD,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;IAChC,CAAC;IACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE;QAAE,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS;YAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACpE,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAgB,EAAE,QAAQ,GAAG,GAAG,EAAE,UAAU,GAAG,IAAI;IACpF,MAAM,IAAI,GAAG,CAAC,IAAY,EAAE,CAAS,EAAU,EAAE;QAC/C,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,GAAG,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC1C,OAAO,GAAG,IAAI,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;IACpC,CAAC,CAAC;IACF,MAAM,OAAO,GAAG,UAAU;QACxB,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC;QACxE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IACvD,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAW,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACpE,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Quaternion — a number of the form `w + x·i + y·j + z·k`, the four-dimensional
|
|
3
|
+
* division algebra. Extends the idea of {@link ComplexNumber} and is the
|
|
4
|
+
* standard tool for representing and composing 3D rotations.
|
|
5
|
+
*/
|
|
6
|
+
export declare class Quaternion {
|
|
7
|
+
readonly w: number;
|
|
8
|
+
readonly x: number;
|
|
9
|
+
readonly y: number;
|
|
10
|
+
readonly z: number;
|
|
11
|
+
static readonly Identity: Quaternion;
|
|
12
|
+
static readonly Zero: Quaternion;
|
|
13
|
+
constructor(w?: number, x?: number, y?: number, z?: number);
|
|
14
|
+
add(q: Quaternion): Quaternion;
|
|
15
|
+
subtract(q: Quaternion): Quaternion;
|
|
16
|
+
scale(s: number): Quaternion;
|
|
17
|
+
negate(): Quaternion;
|
|
18
|
+
/** The Hamilton product (non-commutative). */
|
|
19
|
+
multiply(q: Quaternion): Quaternion;
|
|
20
|
+
conjugate(): Quaternion;
|
|
21
|
+
dot(q: Quaternion): number;
|
|
22
|
+
get norm(): number;
|
|
23
|
+
normalize(): Quaternion;
|
|
24
|
+
/** Multiplicative inverse `q⁻¹ = conj(q) / |q|²`. */
|
|
25
|
+
inverse(): Quaternion;
|
|
26
|
+
equals(q: Quaternion): boolean;
|
|
27
|
+
/** A unit quaternion representing a rotation of `angle` radians about `axis`. */
|
|
28
|
+
static fromAxisAngle(axis: [number, number, number], angle: number): Quaternion;
|
|
29
|
+
/** Rotate a 3D vector by this (unit) quaternion, returning `[x, y, z]`. */
|
|
30
|
+
rotateVector(v: [number, number, number]): [number, number, number];
|
|
31
|
+
/** The 3×3 rotation matrix (as `number[][]`) for this quaternion. */
|
|
32
|
+
toRotationMatrix(): number[][];
|
|
33
|
+
/** Spherical linear interpolation between two unit quaternions. */
|
|
34
|
+
static slerp(a: Quaternion, b: Quaternion, t: number): Quaternion;
|
|
35
|
+
toString(): string;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=Quaternion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Quaternion.d.ts","sourceRoot":"","sources":["../src/Quaternion.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,qBAAa,UAAU;IACrB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IAEnB,MAAM,CAAC,QAAQ,CAAC,QAAQ,aAA8B;IACtD,MAAM,CAAC,QAAQ,CAAC,IAAI,aAA8B;gBAEtC,CAAC,SAAI,EAAE,CAAC,SAAI,EAAE,CAAC,SAAI,EAAE,CAAC,SAAI;IAOtC,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,UAAU;IAI9B,QAAQ,CAAC,CAAC,EAAE,UAAU,GAAG,UAAU;IAInC,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,UAAU;IAI5B,MAAM,IAAI,UAAU;IAIpB,8CAA8C;IAC9C,QAAQ,CAAC,CAAC,EAAE,UAAU,GAAG,UAAU;IASnC,SAAS,IAAI,UAAU;IAIvB,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM;IAI1B,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,SAAS,IAAI,UAAU;IAMvB,qDAAqD;IACrD,OAAO,IAAI,UAAU;IAMrB,MAAM,CAAC,CAAC,EAAE,UAAU,GAAG,OAAO;IAI9B,iFAAiF;IACjF,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,UAAU;IAQ/E,2EAA2E;IAC3E,YAAY,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;IAOnE,qEAAqE;IACrE,gBAAgB,IAAI,MAAM,EAAE,EAAE;IAS9B,mEAAmE;IACnE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,GAAG,UAAU;IAiBjE,QAAQ,IAAI,MAAM;CAGnB"}
|