@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,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Geometry — computational geometry on 2D points (`[x, y]` tuples): convex hull,
|
|
3
|
+
* orientation and intersection predicates, point-in-polygon, distances, polygon
|
|
4
|
+
* area/centroid, and 2D affine transforms via homogeneous matrices. Complements
|
|
5
|
+
* the {@link Polygon} class with lower-level, allocation-free primitives.
|
|
6
|
+
*/
|
|
7
|
+
export type Point = [number, number];
|
|
8
|
+
export declare class Geometry {
|
|
9
|
+
/** The signed area of the triangle `(a, b, c)` (>0 CCW, <0 CW, 0 collinear). */
|
|
10
|
+
static orientation(a: Point, b: Point, c: Point): number;
|
|
11
|
+
static distance(a: Point, b: Point): number;
|
|
12
|
+
/** Distance from point `p` to the segment `a–b`. */
|
|
13
|
+
static distancePointToSegment(p: Point, a: Point, b: Point): number;
|
|
14
|
+
/** The convex hull (counter-clockwise) via Andrew's monotone chain. */
|
|
15
|
+
static convexHull(points: readonly Point[]): Point[];
|
|
16
|
+
/** Whether segments `p1–p2` and `p3–p4` intersect (endpoints/collinear included). */
|
|
17
|
+
static segmentsIntersect(p1: Point, p2: Point, p3: Point, p4: Point): boolean;
|
|
18
|
+
/** The shoelace area of a polygon given by its vertices. */
|
|
19
|
+
static polygonArea(polygon: readonly Point[]): number;
|
|
20
|
+
/** The centroid of a set of points (the simple average). */
|
|
21
|
+
static centroid(points: readonly Point[]): Point;
|
|
22
|
+
/** Point-in-polygon by the even-odd ray-casting rule. */
|
|
23
|
+
static pointInPolygon(point: Point, polygon: readonly Point[]): boolean;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Transform2D — 2D affine transforms as 3×3 homogeneous matrices. Compose them
|
|
27
|
+
* with {@link Transform2D.multiply} and apply them with {@link Transform2D.apply}.
|
|
28
|
+
*/
|
|
29
|
+
export declare class Transform2D {
|
|
30
|
+
readonly m: number[][];
|
|
31
|
+
constructor(m: number[][]);
|
|
32
|
+
static identity(): Transform2D;
|
|
33
|
+
static translation(tx: number, ty: number): Transform2D;
|
|
34
|
+
static scaling(sx: number, sy?: number): Transform2D;
|
|
35
|
+
static rotation(theta: number): Transform2D;
|
|
36
|
+
/** Matrix product `this · other` (apply `other` first, then `this`). */
|
|
37
|
+
multiply(other: Transform2D): Transform2D;
|
|
38
|
+
/** Apply the transform to a point. */
|
|
39
|
+
apply(p: Point): Point;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=Geometry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Geometry.d.ts","sourceRoot":"","sources":["../src/Geometry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,MAAM,KAAK,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAErC,qBAAa,QAAQ;IACnB,gFAAgF;IAChF,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,GAAG,MAAM;IAIxD,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,GAAG,MAAM;IAI3C,oDAAoD;IACpD,MAAM,CAAC,sBAAsB,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,GAAG,MAAM;IAUnE,uEAAuE;IACvE,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE,GAAG,KAAK,EAAE;IAqBpD,qFAAqF;IACrF,MAAM,CAAC,iBAAiB,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,GAAG,OAAO;IAkB7E,4DAA4D;IAC5D,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,SAAS,KAAK,EAAE,GAAG,MAAM;IAUrD,4DAA4D;IAC5D,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE,GAAG,KAAK;IAWhD,yDAAyD;IACzD,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,KAAK,EAAE,GAAG,OAAO;CAWxE;AAED;;;GAGG;AACH,qBAAa,WAAW;IACtB,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC;gBAEX,CAAC,EAAE,MAAM,EAAE,EAAE;IAIzB,MAAM,CAAC,QAAQ,IAAI,WAAW;IAQ9B,MAAM,CAAC,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,WAAW;IAQvD,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,GAAE,MAAW,GAAG,WAAW;IAQxD,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW;IAU3C,wEAAwE;IACxE,QAAQ,CAAC,KAAK,EAAE,WAAW,GAAG,WAAW;IAYzC,sCAAsC;IACtC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,KAAK;CAKvB"}
|
package/dist/Geometry.js
ADDED
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Geometry — computational geometry on 2D points (`[x, y]` tuples): convex hull,
|
|
3
|
+
* orientation and intersection predicates, point-in-polygon, distances, polygon
|
|
4
|
+
* area/centroid, and 2D affine transforms via homogeneous matrices. Complements
|
|
5
|
+
* the {@link Polygon} class with lower-level, allocation-free primitives.
|
|
6
|
+
*/
|
|
7
|
+
export class Geometry {
|
|
8
|
+
/** The signed area of the triangle `(a, b, c)` (>0 CCW, <0 CW, 0 collinear). */
|
|
9
|
+
static orientation(a, b, c) {
|
|
10
|
+
return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]);
|
|
11
|
+
}
|
|
12
|
+
static distance(a, b) {
|
|
13
|
+
return Math.hypot(a[0] - b[0], a[1] - b[1]);
|
|
14
|
+
}
|
|
15
|
+
/** Distance from point `p` to the segment `a–b`. */
|
|
16
|
+
static distancePointToSegment(p, a, b) {
|
|
17
|
+
const dx = b[0] - a[0];
|
|
18
|
+
const dy = b[1] - a[1];
|
|
19
|
+
const len2 = dx * dx + dy * dy;
|
|
20
|
+
if (len2 === 0)
|
|
21
|
+
return Geometry.distance(p, a);
|
|
22
|
+
let t = ((p[0] - a[0]) * dx + (p[1] - a[1]) * dy) / len2;
|
|
23
|
+
t = Math.max(0, Math.min(1, t));
|
|
24
|
+
return Geometry.distance(p, [a[0] + t * dx, a[1] + t * dy]);
|
|
25
|
+
}
|
|
26
|
+
/** The convex hull (counter-clockwise) via Andrew's monotone chain. */
|
|
27
|
+
static convexHull(points) {
|
|
28
|
+
const pts = [...points].sort((p, q) => p[0] - q[0] || p[1] - q[1]);
|
|
29
|
+
if (pts.length <= 2)
|
|
30
|
+
return pts;
|
|
31
|
+
const cross = (o, a, b) => Geometry.orientation(o, a, b);
|
|
32
|
+
const lower = [];
|
|
33
|
+
for (const p of pts) {
|
|
34
|
+
while (lower.length >= 2 && cross(lower[lower.length - 2], lower[lower.length - 1], p) <= 0)
|
|
35
|
+
lower.pop();
|
|
36
|
+
lower.push(p);
|
|
37
|
+
}
|
|
38
|
+
const upper = [];
|
|
39
|
+
for (let i = pts.length - 1; i >= 0; i--) {
|
|
40
|
+
const p = pts[i];
|
|
41
|
+
while (upper.length >= 2 && cross(upper[upper.length - 2], upper[upper.length - 1], p) <= 0)
|
|
42
|
+
upper.pop();
|
|
43
|
+
upper.push(p);
|
|
44
|
+
}
|
|
45
|
+
lower.pop();
|
|
46
|
+
upper.pop();
|
|
47
|
+
return lower.concat(upper);
|
|
48
|
+
}
|
|
49
|
+
/** Whether segments `p1–p2` and `p3–p4` intersect (endpoints/collinear included). */
|
|
50
|
+
static segmentsIntersect(p1, p2, p3, p4) {
|
|
51
|
+
const d1 = Geometry.orientation(p3, p4, p1);
|
|
52
|
+
const d2 = Geometry.orientation(p3, p4, p2);
|
|
53
|
+
const d3 = Geometry.orientation(p1, p2, p3);
|
|
54
|
+
const d4 = Geometry.orientation(p1, p2, p4);
|
|
55
|
+
const onSeg = (a, b, p) => Math.min(a[0], b[0]) <= p[0] &&
|
|
56
|
+
p[0] <= Math.max(a[0], b[0]) &&
|
|
57
|
+
Math.min(a[1], b[1]) <= p[1] &&
|
|
58
|
+
p[1] <= Math.max(a[1], b[1]);
|
|
59
|
+
if (((d1 > 0 && d2 < 0) || (d1 < 0 && d2 > 0)) && ((d3 > 0 && d4 < 0) || (d3 < 0 && d4 > 0)))
|
|
60
|
+
return true;
|
|
61
|
+
if (d1 === 0 && onSeg(p3, p4, p1))
|
|
62
|
+
return true;
|
|
63
|
+
if (d2 === 0 && onSeg(p3, p4, p2))
|
|
64
|
+
return true;
|
|
65
|
+
if (d3 === 0 && onSeg(p1, p2, p3))
|
|
66
|
+
return true;
|
|
67
|
+
if (d4 === 0 && onSeg(p1, p2, p4))
|
|
68
|
+
return true;
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
/** The shoelace area of a polygon given by its vertices. */
|
|
72
|
+
static polygonArea(polygon) {
|
|
73
|
+
let sum = 0;
|
|
74
|
+
for (let i = 0; i < polygon.length; i++) {
|
|
75
|
+
const a = polygon[i];
|
|
76
|
+
const b = polygon[(i + 1) % polygon.length];
|
|
77
|
+
sum += a[0] * b[1] - b[0] * a[1];
|
|
78
|
+
}
|
|
79
|
+
return Math.abs(sum) / 2;
|
|
80
|
+
}
|
|
81
|
+
/** The centroid of a set of points (the simple average). */
|
|
82
|
+
static centroid(points) {
|
|
83
|
+
const n = points.length || 1;
|
|
84
|
+
let sx = 0;
|
|
85
|
+
let sy = 0;
|
|
86
|
+
for (const [x, y] of points) {
|
|
87
|
+
sx += x;
|
|
88
|
+
sy += y;
|
|
89
|
+
}
|
|
90
|
+
return [sx / n, sy / n];
|
|
91
|
+
}
|
|
92
|
+
/** Point-in-polygon by the even-odd ray-casting rule. */
|
|
93
|
+
static pointInPolygon(point, polygon) {
|
|
94
|
+
const [px, py] = point;
|
|
95
|
+
let inside = false;
|
|
96
|
+
const n = polygon.length;
|
|
97
|
+
for (let i = 0, j = n - 1; i < n; j = i++) {
|
|
98
|
+
const [xi, yi] = polygon[i];
|
|
99
|
+
const [xj, yj] = polygon[j];
|
|
100
|
+
if (yi > py !== yj > py && px < ((xj - xi) * (py - yi)) / (yj - yi) + xi)
|
|
101
|
+
inside = !inside;
|
|
102
|
+
}
|
|
103
|
+
return inside;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Transform2D — 2D affine transforms as 3×3 homogeneous matrices. Compose them
|
|
108
|
+
* with {@link Transform2D.multiply} and apply them with {@link Transform2D.apply}.
|
|
109
|
+
*/
|
|
110
|
+
export class Transform2D {
|
|
111
|
+
m;
|
|
112
|
+
constructor(m) {
|
|
113
|
+
this.m = m;
|
|
114
|
+
}
|
|
115
|
+
static identity() {
|
|
116
|
+
return new Transform2D([
|
|
117
|
+
[1, 0, 0],
|
|
118
|
+
[0, 1, 0],
|
|
119
|
+
[0, 0, 1],
|
|
120
|
+
]);
|
|
121
|
+
}
|
|
122
|
+
static translation(tx, ty) {
|
|
123
|
+
return new Transform2D([
|
|
124
|
+
[1, 0, tx],
|
|
125
|
+
[0, 1, ty],
|
|
126
|
+
[0, 0, 1],
|
|
127
|
+
]);
|
|
128
|
+
}
|
|
129
|
+
static scaling(sx, sy = sx) {
|
|
130
|
+
return new Transform2D([
|
|
131
|
+
[sx, 0, 0],
|
|
132
|
+
[0, sy, 0],
|
|
133
|
+
[0, 0, 1],
|
|
134
|
+
]);
|
|
135
|
+
}
|
|
136
|
+
static rotation(theta) {
|
|
137
|
+
const c = Math.cos(theta);
|
|
138
|
+
const s = Math.sin(theta);
|
|
139
|
+
return new Transform2D([
|
|
140
|
+
[c, -s, 0],
|
|
141
|
+
[s, c, 0],
|
|
142
|
+
[0, 0, 1],
|
|
143
|
+
]);
|
|
144
|
+
}
|
|
145
|
+
/** Matrix product `this · other` (apply `other` first, then `this`). */
|
|
146
|
+
multiply(other) {
|
|
147
|
+
const a = this.m;
|
|
148
|
+
const b = other.m;
|
|
149
|
+
const out = [
|
|
150
|
+
[0, 0, 0],
|
|
151
|
+
[0, 0, 0],
|
|
152
|
+
[0, 0, 0],
|
|
153
|
+
];
|
|
154
|
+
for (let i = 0; i < 3; i++)
|
|
155
|
+
for (let j = 0; j < 3; j++)
|
|
156
|
+
for (let k = 0; k < 3; k++)
|
|
157
|
+
out[i][j] += a[i][k] * b[k][j];
|
|
158
|
+
return new Transform2D(out);
|
|
159
|
+
}
|
|
160
|
+
/** Apply the transform to a point. */
|
|
161
|
+
apply(p) {
|
|
162
|
+
const [x, y] = p;
|
|
163
|
+
const m = this.m;
|
|
164
|
+
return [m[0][0] * x + m[0][1] * y + m[0][2], m[1][0] * x + m[1][1] * y + m[1][2]];
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=Geometry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Geometry.js","sourceRoot":"","sources":["../src/Geometry.ts"],"names":[],"mappings":"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"}
|
package/dist/Graph.d.ts
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Graph — a weighted (optionally directed) graph with the standard algorithms:
|
|
3
|
+
* breadth/depth-first traversal, Dijkstra shortest paths, minimum spanning tree
|
|
4
|
+
* (Kruskal), topological sort, connected components, cycle detection, and
|
|
5
|
+
* conversion to an adjacency matrix (feeding {@link MatrixMath}) with
|
|
6
|
+
* Floyd-Warshall all-pairs distances.
|
|
7
|
+
*/
|
|
8
|
+
export interface Edge<T> {
|
|
9
|
+
from: T;
|
|
10
|
+
to: T;
|
|
11
|
+
weight: number;
|
|
12
|
+
}
|
|
13
|
+
export declare class Graph<T = string | number> {
|
|
14
|
+
readonly directed: boolean;
|
|
15
|
+
private readonly adjacency;
|
|
16
|
+
constructor(directed?: boolean);
|
|
17
|
+
addVertex(v: T): this;
|
|
18
|
+
addEdge(u: T, v: T, weight?: number): this;
|
|
19
|
+
vertices(): T[];
|
|
20
|
+
neighbors(v: T): T[];
|
|
21
|
+
edges(): Array<Edge<T>>;
|
|
22
|
+
/** Breadth-first traversal order from `start`. */
|
|
23
|
+
bfs(start: T): T[];
|
|
24
|
+
/** Depth-first traversal order from `start`. */
|
|
25
|
+
dfs(start: T): T[];
|
|
26
|
+
/**
|
|
27
|
+
* Shared Dijkstra core used by {@link dijkstra} and {@link shortestPath}:
|
|
28
|
+
* a binary min-heap keyed on tentative distance replaces the O(V) linear
|
|
29
|
+
* scan for "closest unvisited vertex", bringing the algorithm from
|
|
30
|
+
* O(V²) down to the standard O((V+E) log V). Stale heap entries (pushed
|
|
31
|
+
* when a shorter distance was later found) are skipped lazily instead of
|
|
32
|
+
* removed, which is cheaper than a decrease-key operation.
|
|
33
|
+
*/
|
|
34
|
+
private runDijkstra;
|
|
35
|
+
/** Dijkstra shortest-path distances from `start` (non-negative weights). */
|
|
36
|
+
dijkstra(start: T): Map<T, number>;
|
|
37
|
+
/** The shortest path from `start` to `end` as `{ distance, path }`. */
|
|
38
|
+
shortestPath(start: T, end: T): {
|
|
39
|
+
distance: number;
|
|
40
|
+
path: T[];
|
|
41
|
+
};
|
|
42
|
+
/** Connected components (undirected graphs). */
|
|
43
|
+
connectedComponents(): T[][];
|
|
44
|
+
/** Topological order for a DAG, or `null` if the graph has a cycle. */
|
|
45
|
+
topologicalSort(): T[] | null;
|
|
46
|
+
/** True when the graph contains a cycle. */
|
|
47
|
+
hasCycle(): boolean;
|
|
48
|
+
/** Minimum spanning tree (Kruskal) of an undirected graph, as a list of edges. */
|
|
49
|
+
minimumSpanningTree(): Array<Edge<T>>;
|
|
50
|
+
/** Adjacency matrix (rows/cols follow the returned `order`; `Infinity` = no edge). */
|
|
51
|
+
toAdjacencyMatrix(): {
|
|
52
|
+
matrix: number[][];
|
|
53
|
+
order: T[];
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* Strongly connected components (Tarjan's algorithm, single DFS pass,
|
|
57
|
+
* O(V+E)) — maximal vertex sets where every vertex can reach every
|
|
58
|
+
* other via directed edges. On an undirected graph this always reduces
|
|
59
|
+
* to {@link connectedComponents} (every edge is bidirectional, so
|
|
60
|
+
* "strongly connected" and "connected" coincide) — `connectedComponents`
|
|
61
|
+
* is the more direct choice there; this method exists for directed
|
|
62
|
+
* graphs, e.g. pruning a compatibility digraph down to the vertices
|
|
63
|
+
* that can actually participate in a cycle.
|
|
64
|
+
*/
|
|
65
|
+
stronglyConnectedComponents(): T[][];
|
|
66
|
+
/** All-pairs shortest distances by Floyd-Warshall. */
|
|
67
|
+
floydWarshall(): {
|
|
68
|
+
distances: number[][];
|
|
69
|
+
order: T[];
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=Graph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Graph.d.ts","sourceRoot":"","sources":["../src/Graph.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,IAAI,CAAC,CAAC;IACrB,IAAI,EAAE,CAAC,CAAC;IACR,EAAE,EAAE,CAAC,CAAC;IACN,MAAM,EAAE,MAAM,CAAC;CAChB;AAoDD,qBAAa,KAAK,CAAC,CAAC,GAAG,MAAM,GAAG,MAAM;IACpC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAgC;gBAE9C,QAAQ,UAAQ;IAI5B,SAAS,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI;IAKrB,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,SAAI,GAAG,IAAI;IAOrC,QAAQ,IAAI,CAAC,EAAE;IAIf,SAAS,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE;IAIpB,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAgBvB,kDAAkD;IAClD,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE;IAgBlB,gDAAgD;IAChD,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE;IAYlB;;;;;;;OAOG;IACH,OAAO,CAAC,WAAW;IA2BnB,4EAA4E;IAC5E,QAAQ,CAAC,KAAK,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC;IAIlC,uEAAuE;IACvE,YAAY,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,CAAC,EAAE,CAAA;KAAE;IAY/D,gDAAgD;IAChD,mBAAmB,IAAI,CAAC,EAAE,EAAE;IAY5B,uEAAuE;IACvE,eAAe,IAAI,CAAC,EAAE,GAAG,IAAI;IAiB7B,4CAA4C;IAC5C,QAAQ,IAAI,OAAO;IAgBnB,kFAAkF;IAClF,mBAAmB,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAsBrC,sFAAsF;IACtF,iBAAiB,IAAI;QAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;QAAC,KAAK,EAAE,CAAC,EAAE,CAAA;KAAE;IAavD;;;;;;;;;OASG;IACH,2BAA2B,IAAI,CAAC,EAAE,EAAE;IAwCpC,sDAAsD;IACtD,aAAa,IAAI;QAAE,SAAS,EAAE,MAAM,EAAE,EAAE,CAAC;QAAC,KAAK,EAAE,CAAC,EAAE,CAAA;KAAE;CASvD"}
|
package/dist/Graph.js
ADDED
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Graph — a weighted (optionally directed) graph with the standard algorithms:
|
|
3
|
+
* breadth/depth-first traversal, Dijkstra shortest paths, minimum spanning tree
|
|
4
|
+
* (Kruskal), topological sort, connected components, cycle detection, and
|
|
5
|
+
* conversion to an adjacency matrix (feeding {@link MatrixMath}) with
|
|
6
|
+
* Floyd-Warshall all-pairs distances.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Minimal binary min-heap keyed by a numeric priority, used by
|
|
10
|
+
* {@link Graph.dijkstra} / {@link Graph.shortestPath} to pick the next
|
|
11
|
+
* closest unvisited vertex in O(log n) instead of a linear scan. Supports
|
|
12
|
+
* duplicate/stale entries (an item can be pushed more than once when its
|
|
13
|
+
* distance improves); the caller is expected to skip entries whose stored
|
|
14
|
+
* priority no longer matches the current best-known distance ("lazy
|
|
15
|
+
* deletion"), which is cheaper than a decrease-key operation.
|
|
16
|
+
*/
|
|
17
|
+
class MinHeap {
|
|
18
|
+
items = [];
|
|
19
|
+
get size() {
|
|
20
|
+
return this.items.length;
|
|
21
|
+
}
|
|
22
|
+
push(value, priority) {
|
|
23
|
+
this.items.push({ priority, value });
|
|
24
|
+
let i = this.items.length - 1;
|
|
25
|
+
while (i > 0) {
|
|
26
|
+
const parent = (i - 1) >> 1;
|
|
27
|
+
if (this.items[parent].priority <= this.items[i].priority)
|
|
28
|
+
break;
|
|
29
|
+
[this.items[parent], this.items[i]] = [this.items[i], this.items[parent]];
|
|
30
|
+
i = parent;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
pop() {
|
|
34
|
+
const top = this.items[0];
|
|
35
|
+
if (top === undefined)
|
|
36
|
+
return undefined;
|
|
37
|
+
const last = this.items.pop();
|
|
38
|
+
if (this.items.length) {
|
|
39
|
+
this.items[0] = last;
|
|
40
|
+
let i = 0;
|
|
41
|
+
const n = this.items.length;
|
|
42
|
+
for (;;) {
|
|
43
|
+
const left = 2 * i + 1;
|
|
44
|
+
const right = 2 * i + 2;
|
|
45
|
+
let smallest = i;
|
|
46
|
+
if (left < n && this.items[left].priority < this.items[smallest].priority)
|
|
47
|
+
smallest = left;
|
|
48
|
+
if (right < n && this.items[right].priority < this.items[smallest].priority)
|
|
49
|
+
smallest = right;
|
|
50
|
+
if (smallest === i)
|
|
51
|
+
break;
|
|
52
|
+
[this.items[smallest], this.items[i]] = [this.items[i], this.items[smallest]];
|
|
53
|
+
i = smallest;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return top;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
export class Graph {
|
|
60
|
+
directed;
|
|
61
|
+
adjacency = new Map();
|
|
62
|
+
constructor(directed = false) {
|
|
63
|
+
this.directed = directed;
|
|
64
|
+
}
|
|
65
|
+
addVertex(v) {
|
|
66
|
+
if (!this.adjacency.has(v))
|
|
67
|
+
this.adjacency.set(v, new Map());
|
|
68
|
+
return this;
|
|
69
|
+
}
|
|
70
|
+
addEdge(u, v, weight = 1) {
|
|
71
|
+
this.addVertex(u).addVertex(v);
|
|
72
|
+
this.adjacency.get(u).set(v, weight);
|
|
73
|
+
if (!this.directed)
|
|
74
|
+
this.adjacency.get(v).set(u, weight);
|
|
75
|
+
return this;
|
|
76
|
+
}
|
|
77
|
+
vertices() {
|
|
78
|
+
return [...this.adjacency.keys()];
|
|
79
|
+
}
|
|
80
|
+
neighbors(v) {
|
|
81
|
+
return [...(this.adjacency.get(v)?.keys() ?? [])];
|
|
82
|
+
}
|
|
83
|
+
edges() {
|
|
84
|
+
const out = [];
|
|
85
|
+
const seen = new Set();
|
|
86
|
+
for (const [from, nbrs] of this.adjacency) {
|
|
87
|
+
for (const [to, weight] of nbrs) {
|
|
88
|
+
if (!this.directed) {
|
|
89
|
+
const key = JSON.stringify([from, to].map(String).sort());
|
|
90
|
+
if (seen.has(key))
|
|
91
|
+
continue;
|
|
92
|
+
seen.add(key);
|
|
93
|
+
}
|
|
94
|
+
out.push({ from, to, weight });
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return out;
|
|
98
|
+
}
|
|
99
|
+
/** Breadth-first traversal order from `start`. */
|
|
100
|
+
bfs(start) {
|
|
101
|
+
const visited = new Set([start]);
|
|
102
|
+
const order = [];
|
|
103
|
+
const queue = [start];
|
|
104
|
+
while (queue.length) {
|
|
105
|
+
const v = queue.shift();
|
|
106
|
+
order.push(v);
|
|
107
|
+
for (const n of this.neighbors(v))
|
|
108
|
+
if (!visited.has(n)) {
|
|
109
|
+
visited.add(n);
|
|
110
|
+
queue.push(n);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return order;
|
|
114
|
+
}
|
|
115
|
+
/** Depth-first traversal order from `start`. */
|
|
116
|
+
dfs(start) {
|
|
117
|
+
const visited = new Set();
|
|
118
|
+
const order = [];
|
|
119
|
+
const visit = (v) => {
|
|
120
|
+
visited.add(v);
|
|
121
|
+
order.push(v);
|
|
122
|
+
for (const n of this.neighbors(v))
|
|
123
|
+
if (!visited.has(n))
|
|
124
|
+
visit(n);
|
|
125
|
+
};
|
|
126
|
+
visit(start);
|
|
127
|
+
return order;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Shared Dijkstra core used by {@link dijkstra} and {@link shortestPath}:
|
|
131
|
+
* a binary min-heap keyed on tentative distance replaces the O(V) linear
|
|
132
|
+
* scan for "closest unvisited vertex", bringing the algorithm from
|
|
133
|
+
* O(V²) down to the standard O((V+E) log V). Stale heap entries (pushed
|
|
134
|
+
* when a shorter distance was later found) are skipped lazily instead of
|
|
135
|
+
* removed, which is cheaper than a decrease-key operation.
|
|
136
|
+
*/
|
|
137
|
+
runDijkstra(start) {
|
|
138
|
+
const dist = new Map();
|
|
139
|
+
const prev = new Map();
|
|
140
|
+
for (const v of this.vertices())
|
|
141
|
+
dist.set(v, Number.POSITIVE_INFINITY);
|
|
142
|
+
dist.set(start, 0);
|
|
143
|
+
const visited = new Set();
|
|
144
|
+
const heap = new MinHeap();
|
|
145
|
+
heap.push(start, 0);
|
|
146
|
+
while (heap.size) {
|
|
147
|
+
const top = heap.pop();
|
|
148
|
+
const u = top.value;
|
|
149
|
+
if (visited.has(u))
|
|
150
|
+
continue;
|
|
151
|
+
if (top.priority > dist.get(u))
|
|
152
|
+
continue; // stale entry
|
|
153
|
+
visited.add(u);
|
|
154
|
+
for (const [n, w] of this.adjacency.get(u) ?? []) {
|
|
155
|
+
if (visited.has(n))
|
|
156
|
+
continue;
|
|
157
|
+
const nd = dist.get(u) + w;
|
|
158
|
+
if (nd < dist.get(n)) {
|
|
159
|
+
dist.set(n, nd);
|
|
160
|
+
prev.set(n, u);
|
|
161
|
+
heap.push(n, nd);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return { dist, prev };
|
|
166
|
+
}
|
|
167
|
+
/** Dijkstra shortest-path distances from `start` (non-negative weights). */
|
|
168
|
+
dijkstra(start) {
|
|
169
|
+
return this.runDijkstra(start).dist;
|
|
170
|
+
}
|
|
171
|
+
/** The shortest path from `start` to `end` as `{ distance, path }`. */
|
|
172
|
+
shortestPath(start, end) {
|
|
173
|
+
const { dist, prev } = this.runDijkstra(start);
|
|
174
|
+
if (dist.get(end) === Number.POSITIVE_INFINITY)
|
|
175
|
+
return { distance: Number.POSITIVE_INFINITY, path: [] };
|
|
176
|
+
const path = [];
|
|
177
|
+
let cur = end;
|
|
178
|
+
while (cur !== undefined) {
|
|
179
|
+
path.unshift(cur);
|
|
180
|
+
cur = cur === start ? undefined : prev.get(cur);
|
|
181
|
+
}
|
|
182
|
+
return { distance: dist.get(end), path };
|
|
183
|
+
}
|
|
184
|
+
/** Connected components (undirected graphs). */
|
|
185
|
+
connectedComponents() {
|
|
186
|
+
const seen = new Set();
|
|
187
|
+
const components = [];
|
|
188
|
+
for (const v of this.vertices()) {
|
|
189
|
+
if (seen.has(v))
|
|
190
|
+
continue;
|
|
191
|
+
const comp = this.bfs(v);
|
|
192
|
+
for (const c of comp)
|
|
193
|
+
seen.add(c);
|
|
194
|
+
components.push(comp);
|
|
195
|
+
}
|
|
196
|
+
return components;
|
|
197
|
+
}
|
|
198
|
+
/** Topological order for a DAG, or `null` if the graph has a cycle. */
|
|
199
|
+
topologicalSort() {
|
|
200
|
+
const inDegree = new Map();
|
|
201
|
+
for (const v of this.vertices())
|
|
202
|
+
inDegree.set(v, 0);
|
|
203
|
+
for (const [, nbrs] of this.adjacency)
|
|
204
|
+
for (const [to] of nbrs)
|
|
205
|
+
inDegree.set(to, inDegree.get(to) + 1);
|
|
206
|
+
const queue = this.vertices().filter((v) => inDegree.get(v) === 0);
|
|
207
|
+
const order = [];
|
|
208
|
+
while (queue.length) {
|
|
209
|
+
const v = queue.shift();
|
|
210
|
+
order.push(v);
|
|
211
|
+
for (const n of this.neighbors(v)) {
|
|
212
|
+
inDegree.set(n, inDegree.get(n) - 1);
|
|
213
|
+
if (inDegree.get(n) === 0)
|
|
214
|
+
queue.push(n);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
return order.length === this.vertices().length ? order : null;
|
|
218
|
+
}
|
|
219
|
+
/** True when the graph contains a cycle. */
|
|
220
|
+
hasCycle() {
|
|
221
|
+
if (this.directed)
|
|
222
|
+
return this.topologicalSort() === null;
|
|
223
|
+
const seen = new Set();
|
|
224
|
+
const visit = (v, parent) => {
|
|
225
|
+
seen.add(v);
|
|
226
|
+
for (const n of this.neighbors(v)) {
|
|
227
|
+
if (!seen.has(n)) {
|
|
228
|
+
if (visit(n, v))
|
|
229
|
+
return true;
|
|
230
|
+
}
|
|
231
|
+
else if (n !== parent)
|
|
232
|
+
return true;
|
|
233
|
+
}
|
|
234
|
+
return false;
|
|
235
|
+
};
|
|
236
|
+
for (const v of this.vertices())
|
|
237
|
+
if (!seen.has(v) && visit(v, null))
|
|
238
|
+
return true;
|
|
239
|
+
return false;
|
|
240
|
+
}
|
|
241
|
+
/** Minimum spanning tree (Kruskal) of an undirected graph, as a list of edges. */
|
|
242
|
+
minimumSpanningTree() {
|
|
243
|
+
const parent = new Map();
|
|
244
|
+
const find = (x) => {
|
|
245
|
+
while (parent.get(x) !== x) {
|
|
246
|
+
parent.set(x, parent.get(parent.get(x)));
|
|
247
|
+
x = parent.get(x);
|
|
248
|
+
}
|
|
249
|
+
return x;
|
|
250
|
+
};
|
|
251
|
+
for (const v of this.vertices())
|
|
252
|
+
parent.set(v, v);
|
|
253
|
+
const mst = [];
|
|
254
|
+
for (const e of this.edges().sort((a, b) => a.weight - b.weight)) {
|
|
255
|
+
const ra = find(e.from);
|
|
256
|
+
const rb = find(e.to);
|
|
257
|
+
if (ra !== rb) {
|
|
258
|
+
parent.set(ra, rb);
|
|
259
|
+
mst.push(e);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
return mst;
|
|
263
|
+
}
|
|
264
|
+
/** Adjacency matrix (rows/cols follow the returned `order`; `Infinity` = no edge). */
|
|
265
|
+
toAdjacencyMatrix() {
|
|
266
|
+
const order = this.vertices();
|
|
267
|
+
const index = new Map(order.map((v, i) => [v, i]));
|
|
268
|
+
const n = order.length;
|
|
269
|
+
const matrix = Array.from({ length: n }, (_, i) => Array.from({ length: n }, (_, j) => (i === j ? 0 : Number.POSITIVE_INFINITY)));
|
|
270
|
+
for (const [from, nbrs] of this.adjacency) {
|
|
271
|
+
for (const [to, w] of nbrs)
|
|
272
|
+
matrix[index.get(from)][index.get(to)] = w;
|
|
273
|
+
}
|
|
274
|
+
return { matrix, order };
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Strongly connected components (Tarjan's algorithm, single DFS pass,
|
|
278
|
+
* O(V+E)) — maximal vertex sets where every vertex can reach every
|
|
279
|
+
* other via directed edges. On an undirected graph this always reduces
|
|
280
|
+
* to {@link connectedComponents} (every edge is bidirectional, so
|
|
281
|
+
* "strongly connected" and "connected" coincide) — `connectedComponents`
|
|
282
|
+
* is the more direct choice there; this method exists for directed
|
|
283
|
+
* graphs, e.g. pruning a compatibility digraph down to the vertices
|
|
284
|
+
* that can actually participate in a cycle.
|
|
285
|
+
*/
|
|
286
|
+
stronglyConnectedComponents() {
|
|
287
|
+
let index = 0;
|
|
288
|
+
const indices = new Map();
|
|
289
|
+
const lowlink = new Map();
|
|
290
|
+
const onStack = new Set();
|
|
291
|
+
const stack = [];
|
|
292
|
+
const components = [];
|
|
293
|
+
const strongconnect = (v) => {
|
|
294
|
+
indices.set(v, index);
|
|
295
|
+
lowlink.set(v, index);
|
|
296
|
+
index++;
|
|
297
|
+
stack.push(v);
|
|
298
|
+
onStack.add(v);
|
|
299
|
+
for (const w of this.neighbors(v)) {
|
|
300
|
+
if (!indices.has(w)) {
|
|
301
|
+
strongconnect(w);
|
|
302
|
+
lowlink.set(v, Math.min(lowlink.get(v), lowlink.get(w)));
|
|
303
|
+
}
|
|
304
|
+
else if (onStack.has(w)) {
|
|
305
|
+
lowlink.set(v, Math.min(lowlink.get(v), indices.get(w)));
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
if (lowlink.get(v) === indices.get(v)) {
|
|
309
|
+
const component = [];
|
|
310
|
+
let w;
|
|
311
|
+
do {
|
|
312
|
+
w = stack.pop();
|
|
313
|
+
onStack.delete(w);
|
|
314
|
+
component.push(w);
|
|
315
|
+
} while (w !== v);
|
|
316
|
+
components.push(component);
|
|
317
|
+
}
|
|
318
|
+
};
|
|
319
|
+
for (const v of this.vertices())
|
|
320
|
+
if (!indices.has(v))
|
|
321
|
+
strongconnect(v);
|
|
322
|
+
return components;
|
|
323
|
+
}
|
|
324
|
+
/** All-pairs shortest distances by Floyd-Warshall. */
|
|
325
|
+
floydWarshall() {
|
|
326
|
+
const { matrix, order } = this.toAdjacencyMatrix();
|
|
327
|
+
const n = order.length;
|
|
328
|
+
const d = matrix.map((row) => [...row]);
|
|
329
|
+
for (let k = 0; k < n; k++)
|
|
330
|
+
for (let i = 0; i < n; i++)
|
|
331
|
+
for (let j = 0; j < n; j++)
|
|
332
|
+
if (d[i][k] + d[k][j] < d[i][j])
|
|
333
|
+
d[i][j] = d[i][k] + d[k][j];
|
|
334
|
+
return { distances: d, order };
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
//# sourceMappingURL=Graph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Graph.js","sourceRoot":"","sources":["../src/Graph.ts"],"names":[],"mappings":"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"}
|