@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.
Files changed (242) hide show
  1. package/README.md +165 -0
  2. package/dist/Bivector4.d.ts +52 -0
  3. package/dist/Bivector4.d.ts.map +1 -0
  4. package/dist/Bivector4.js +105 -0
  5. package/dist/Bivector4.js.map +1 -0
  6. package/dist/CellGraph.d.ts +259 -0
  7. package/dist/CellGraph.d.ts.map +1 -0
  8. package/dist/CellGraph.js +637 -0
  9. package/dist/CellGraph.js.map +1 -0
  10. package/dist/Clifford4Internal.d.ts +35 -0
  11. package/dist/Clifford4Internal.d.ts.map +1 -0
  12. package/dist/Clifford4Internal.js +86 -0
  13. package/dist/Clifford4Internal.js.map +1 -0
  14. package/dist/Combinatorics.d.ts +61 -0
  15. package/dist/Combinatorics.d.ts.map +1 -0
  16. package/dist/Combinatorics.js +186 -0
  17. package/dist/Combinatorics.js.map +1 -0
  18. package/dist/CombinatoricsGenerators.d.ts +44 -0
  19. package/dist/CombinatoricsGenerators.d.ts.map +1 -0
  20. package/dist/CombinatoricsGenerators.js +148 -0
  21. package/dist/CombinatoricsGenerators.js.map +1 -0
  22. package/dist/ComplexMath.d.ts +46 -0
  23. package/dist/ComplexMath.d.ts.map +1 -0
  24. package/dist/ComplexMath.js +98 -0
  25. package/dist/ComplexMath.js.map +1 -0
  26. package/dist/ComplexNumber.d.ts +174 -0
  27. package/dist/ComplexNumber.d.ts.map +1 -0
  28. package/dist/ComplexNumber.js +443 -0
  29. package/dist/ComplexNumber.js.map +1 -0
  30. package/dist/Cycle.d.ts +42 -0
  31. package/dist/Cycle.d.ts.map +1 -0
  32. package/dist/Cycle.js +120 -0
  33. package/dist/Cycle.js.map +1 -0
  34. package/dist/Decimal.d.ts +45 -0
  35. package/dist/Decimal.d.ts.map +1 -0
  36. package/dist/Decimal.js +135 -0
  37. package/dist/Decimal.js.map +1 -0
  38. package/dist/Distributions.d.ts +55 -0
  39. package/dist/Distributions.d.ts.map +1 -0
  40. package/dist/Distributions.js +222 -0
  41. package/dist/Distributions.js.map +1 -0
  42. package/dist/DualNumber.d.ts +42 -0
  43. package/dist/DualNumber.d.ts.map +1 -0
  44. package/dist/DualNumber.js +91 -0
  45. package/dist/DualNumber.js.map +1 -0
  46. package/dist/Environment.d.ts +44 -0
  47. package/dist/Environment.d.ts.map +1 -0
  48. package/dist/Environment.js +129 -0
  49. package/dist/Environment.js.map +1 -0
  50. package/dist/Expression.d.ts +19 -0
  51. package/dist/Expression.d.ts.map +1 -0
  52. package/dist/Expression.js +43 -0
  53. package/dist/Expression.js.map +1 -0
  54. package/dist/FFT.d.ts +21 -0
  55. package/dist/FFT.d.ts.map +1 -0
  56. package/dist/FFT.js +136 -0
  57. package/dist/FFT.js.map +1 -0
  58. package/dist/GeometricAlgebra4.d.ts +73 -0
  59. package/dist/GeometricAlgebra4.d.ts.map +1 -0
  60. package/dist/GeometricAlgebra4.js +115 -0
  61. package/dist/GeometricAlgebra4.js.map +1 -0
  62. package/dist/Geometry.d.ts +41 -0
  63. package/dist/Geometry.d.ts.map +1 -0
  64. package/dist/Geometry.js +167 -0
  65. package/dist/Geometry.js.map +1 -0
  66. package/dist/Graph.d.ts +72 -0
  67. package/dist/Graph.d.ts.map +1 -0
  68. package/dist/Graph.js +337 -0
  69. package/dist/Graph.js.map +1 -0
  70. package/dist/Graph3DUtils.d.ts +80 -0
  71. package/dist/Graph3DUtils.d.ts.map +1 -0
  72. package/dist/Graph3DUtils.js +156 -0
  73. package/dist/Graph3DUtils.js.map +1 -0
  74. package/dist/GraphUtils.d.ts +67 -0
  75. package/dist/GraphUtils.d.ts.map +1 -0
  76. package/dist/GraphUtils.js +72 -0
  77. package/dist/GraphUtils.js.map +1 -0
  78. package/dist/GroupTheory.d.ts +73 -0
  79. package/dist/GroupTheory.d.ts.map +1 -0
  80. package/dist/GroupTheory.js +194 -0
  81. package/dist/GroupTheory.js.map +1 -0
  82. package/dist/IntUtils.d.ts +33 -0
  83. package/dist/IntUtils.d.ts.map +1 -0
  84. package/dist/IntUtils.js +185 -0
  85. package/dist/IntUtils.js.map +1 -0
  86. package/dist/Interval.d.ts +44 -0
  87. package/dist/Interval.d.ts.map +1 -0
  88. package/dist/Interval.js +165 -0
  89. package/dist/Interval.js.map +1 -0
  90. package/dist/Lattice.d.ts +48 -0
  91. package/dist/Lattice.d.ts.map +1 -0
  92. package/dist/Lattice.js +65 -0
  93. package/dist/Lattice.js.map +1 -0
  94. package/dist/Logic.d.ts +22 -0
  95. package/dist/Logic.d.ts.map +1 -0
  96. package/dist/Logic.js +34 -0
  97. package/dist/Logic.js.map +1 -0
  98. package/dist/MatrixMath.d.ts +71 -0
  99. package/dist/MatrixMath.d.ts.map +1 -0
  100. package/dist/MatrixMath.js +302 -0
  101. package/dist/MatrixMath.js.map +1 -0
  102. package/dist/NumberTheory.d.ts +49 -0
  103. package/dist/NumberTheory.d.ts.map +1 -0
  104. package/dist/NumberTheory.js +230 -0
  105. package/dist/NumberTheory.js.map +1 -0
  106. package/dist/Numerical.d.ts +85 -0
  107. package/dist/Numerical.d.ts.map +1 -0
  108. package/dist/Numerical.js +343 -0
  109. package/dist/Numerical.js.map +1 -0
  110. package/dist/Permutation.d.ts +43 -0
  111. package/dist/Permutation.d.ts.map +1 -0
  112. package/dist/Permutation.js +142 -0
  113. package/dist/Permutation.js.map +1 -0
  114. package/dist/Polygon.d.ts +64 -0
  115. package/dist/Polygon.d.ts.map +1 -0
  116. package/dist/Polygon.js +221 -0
  117. package/dist/Polygon.js.map +1 -0
  118. package/dist/PolynomialRing.d.ts +74 -0
  119. package/dist/PolynomialRing.d.ts.map +1 -0
  120. package/dist/PolynomialRing.js +231 -0
  121. package/dist/PolynomialRing.js.map +1 -0
  122. package/dist/Quaternion.d.ts +37 -0
  123. package/dist/Quaternion.d.ts.map +1 -0
  124. package/dist/Quaternion.js +106 -0
  125. package/dist/Quaternion.js.map +1 -0
  126. package/dist/Rational.d.ts +34 -0
  127. package/dist/Rational.d.ts.map +1 -0
  128. package/dist/Rational.js +136 -0
  129. package/dist/Rational.js.map +1 -0
  130. package/dist/RealMath.d.ts +112 -0
  131. package/dist/RealMath.d.ts.map +1 -0
  132. package/dist/RealMath.js +262 -0
  133. package/dist/RealMath.js.map +1 -0
  134. package/dist/Rotor4.d.ts +180 -0
  135. package/dist/Rotor4.d.ts.map +1 -0
  136. package/dist/Rotor4.js +388 -0
  137. package/dist/Rotor4.js.map +1 -0
  138. package/dist/SpecialFunctions.d.ts +32 -0
  139. package/dist/SpecialFunctions.d.ts.map +1 -0
  140. package/dist/SpecialFunctions.js +161 -0
  141. package/dist/SpecialFunctions.js.map +1 -0
  142. package/dist/SpecialOperator.d.ts +21 -0
  143. package/dist/SpecialOperator.d.ts.map +1 -0
  144. package/dist/SpecialOperator.js +26 -0
  145. package/dist/SpecialOperator.js.map +1 -0
  146. package/dist/Statistics.d.ts +50 -0
  147. package/dist/Statistics.d.ts.map +1 -0
  148. package/dist/Statistics.js +131 -0
  149. package/dist/Statistics.js.map +1 -0
  150. package/dist/StringEvaluator.d.ts +48 -0
  151. package/dist/StringEvaluator.d.ts.map +1 -0
  152. package/dist/StringEvaluator.js +190 -0
  153. package/dist/StringEvaluator.js.map +1 -0
  154. package/dist/Structure.d.ts +130 -0
  155. package/dist/Structure.d.ts.map +1 -0
  156. package/dist/Structure.js +394 -0
  157. package/dist/Structure.js.map +1 -0
  158. package/dist/Symbolic.d.ts +501 -0
  159. package/dist/Symbolic.d.ts.map +1 -0
  160. package/dist/Symbolic.js +4077 -0
  161. package/dist/Symbolic.js.map +1 -0
  162. package/dist/Type.d.ts +31 -0
  163. package/dist/Type.d.ts.map +1 -0
  164. package/dist/Type.js +47 -0
  165. package/dist/Type.js.map +1 -0
  166. package/dist/Utilities.d.ts +27 -0
  167. package/dist/Utilities.d.ts.map +1 -0
  168. package/dist/Utilities.js +47 -0
  169. package/dist/Utilities.js.map +1 -0
  170. package/dist/Vec4.d.ts +39 -0
  171. package/dist/Vec4.d.ts.map +1 -0
  172. package/dist/Vec4.js +82 -0
  173. package/dist/Vec4.js.map +1 -0
  174. package/dist/Vector.d.ts +83 -0
  175. package/dist/Vector.d.ts.map +1 -0
  176. package/dist/Vector.js +173 -0
  177. package/dist/Vector.js.map +1 -0
  178. package/dist/VectorCalculus.d.ts +42 -0
  179. package/dist/VectorCalculus.d.ts.map +1 -0
  180. package/dist/VectorCalculus.js +82 -0
  181. package/dist/VectorCalculus.js.map +1 -0
  182. package/dist/VectorUtils.d.ts +172 -0
  183. package/dist/VectorUtils.d.ts.map +1 -0
  184. package/dist/VectorUtils.js +706 -0
  185. package/dist/VectorUtils.js.map +1 -0
  186. package/dist/differentiation-rules.d.ts +21 -0
  187. package/dist/differentiation-rules.d.ts.map +1 -0
  188. package/dist/differentiation-rules.js +52 -0
  189. package/dist/differentiation-rules.js.map +1 -0
  190. package/dist/index.d.ts +52 -0
  191. package/dist/index.d.ts.map +1 -0
  192. package/dist/index.js +66 -0
  193. package/dist/index.js.map +1 -0
  194. package/package.json +68 -0
  195. package/src/Bivector4.ts +136 -0
  196. package/src/CellGraph.ts +669 -0
  197. package/src/Clifford4Internal.ts +90 -0
  198. package/src/Combinatorics.ts +183 -0
  199. package/src/CombinatoricsGenerators.ts +144 -0
  200. package/src/ComplexMath.ts +162 -0
  201. package/src/ComplexNumber.ts +491 -0
  202. package/src/Cycle.ts +126 -0
  203. package/src/Decimal.ts +145 -0
  204. package/src/Distributions.ts +269 -0
  205. package/src/DualNumber.ts +105 -0
  206. package/src/Environment.ts +127 -0
  207. package/src/Expression.ts +48 -0
  208. package/src/FFT.ts +146 -0
  209. package/src/GeometricAlgebra4.ts +157 -0
  210. package/src/Geometry.ts +173 -0
  211. package/src/Graph.ts +337 -0
  212. package/src/Graph3DUtils.ts +269 -0
  213. package/src/GraphUtils.ts +159 -0
  214. package/src/GroupTheory.ts +214 -0
  215. package/src/IntUtils.ts +200 -0
  216. package/src/Interval.ts +171 -0
  217. package/src/Lattice.ts +87 -0
  218. package/src/Logic.ts +38 -0
  219. package/src/MatrixMath.ts +326 -0
  220. package/src/NumberTheory.ts +228 -0
  221. package/src/Numerical.ts +390 -0
  222. package/src/Permutation.ts +148 -0
  223. package/src/Polygon.ts +229 -0
  224. package/src/PolynomialRing.ts +242 -0
  225. package/src/Quaternion.ts +125 -0
  226. package/src/Rational.ts +148 -0
  227. package/src/RealMath.ts +346 -0
  228. package/src/Rotor4.ts +440 -0
  229. package/src/SpecialFunctions.ts +152 -0
  230. package/src/SpecialOperator.ts +28 -0
  231. package/src/Statistics.ts +170 -0
  232. package/src/StringEvaluator.ts +208 -0
  233. package/src/Structure.ts +481 -0
  234. package/src/Symbolic.ts +4313 -0
  235. package/src/Type.ts +48 -0
  236. package/src/Utilities.ts +49 -0
  237. package/src/Vec4.ts +98 -0
  238. package/src/Vector.ts +189 -0
  239. package/src/VectorCalculus.ts +87 -0
  240. package/src/VectorUtils.ts +797 -0
  241. package/src/differentiation-rules.ts +73 -0
  242. package/src/index.ts +140 -0
@@ -0,0 +1,80 @@
1
+ import type { Polygon } from "./Polygon.ts";
2
+ import type { Vector } from "./Vector.ts";
3
+ /**
4
+ * Graph3DUtils — helpers for turning functions and points into 3D mesh data.
5
+ *
6
+ * Ported from Mallory's ActionScript `Graph3DUtils`, which produced
7
+ * papervision3d `Mesh3D`/`Vertex3D`/`Face3D` objects. Those Flash libraries do
8
+ * not exist here, so the geometry is emitted as plain, renderer-agnostic data
9
+ * ({@link Mesh} = a coloured list of triangular {@link Face}s). The underlying
10
+ * geometry math is preserved.
11
+ *
12
+ * Bug fixes from the AS3 original:
13
+ * - `nRangeVector` only worked in one dimension (it returned `null` otherwise)
14
+ * and mutated its `mins`/`maxes`/`steps` arguments via `shift()`; it now
15
+ * handles any dimensionality without mutating its inputs.
16
+ * - `pointMatrixToMesh3D` used `alpha2` for the first material (should be
17
+ * `alpha1`) and had unreachable dead code after its `return`.
18
+ *
19
+ * NOTE: `create3DCurveSegment`/`create3DPrism` reproduce the original ribbon
20
+ * geometry, but with one fix: the AS3 original computed `phi` by converting
21
+ * an `atan2` result (radians) to degrees, then passed that degrees value
22
+ * straight into `Math.cos`/`Math.sin` (which expect radians) — a unit
23
+ * mismatch, not a deliberate choice. `phi` is now kept in radians throughout.
24
+ * The on-screen appearance still cannot be pixel-verified against the
25
+ * original Flash renderer (papervision3d no longer runs anywhere), so this is
26
+ * a best-effort mathematical correction, not a confirmed visual match.
27
+ */
28
+ export interface Vec3 {
29
+ x: number;
30
+ y: number;
31
+ z: number;
32
+ }
33
+ /** A triangular face. */
34
+ export type Face = [Vec3, Vec3, Vec3];
35
+ export interface Material {
36
+ color: number;
37
+ alpha: number;
38
+ oneSide: boolean;
39
+ }
40
+ export interface Mesh {
41
+ material: Material;
42
+ faces: Face[];
43
+ }
44
+ export interface Placement3D {
45
+ x: number;
46
+ y: number;
47
+ z: number;
48
+ scaleX: number;
49
+ scaleY: number;
50
+ scaleZ: number;
51
+ }
52
+ export declare class Graph3DUtils {
53
+ /** Sample `binaryOperation` over a 2D grid, returning a matrix of results. */
54
+ static dualRangeVector<T>(binaryOperation: (x: number, y: number) => T, xMin?: number, xMax?: number, xStep?: number, yMin?: number, yMax?: number, yStep?: number): Vector<Vector<T>>;
55
+ /**
56
+ * Sample `nOperation` over an N-dimensional grid (bug fix: the AS3 version
57
+ * only handled N=1 and mutated its arguments). `nOperation` receives the
58
+ * coordinate array for each grid point.
59
+ */
60
+ static nRangeVector<T>(nOperation: (coords: number[]) => T, mins: readonly number[], maxes: readonly number[], steps: readonly number[]): Vector<unknown>;
61
+ /** Placement descriptor for a point in 3D (position + optional uniform scale from `t`). */
62
+ static placement3D(p: Vector<number>, altProperties?: string[] | null): Placement3D | Record<string, number>;
63
+ static placement3DBarGraph(p: Vector<number>): Placement3D;
64
+ /** A flat two-triangle ribbon between two points (see the class NOTE). */
65
+ static create3DCurveSegment(firstPoint: Vector<number>, secondPoint: Vector<number>, color?: number, alpha?: number, planeThickness?: number, planeAngle?: number): Mesh;
66
+ /** A rectangular prism (tube) between two points (see the class NOTE). */
67
+ static create3DPrism(firstPoint: Vector<number>, secondPoint: Vector<number>, color?: number, alpha?: number, planeThickness?: number): Mesh;
68
+ /** A tube following a poly-line, as one prism mesh per segment. */
69
+ static vectorTo3DPrism(points: Vector<Vector<number>>, color?: number, alpha?: number, planeThickness?: number): Mesh[];
70
+ /** Alias of {@link vectorTo3DPrism} (the AS3 `VectorTo3DCurve` was identical). */
71
+ static vectorTo3DCurve(points: Vector<Vector<number>>, color?: number, alpha?: number, planeThickness?: number): Mesh[];
72
+ /** Triangulate a polygon into a mesh (fan from vertex 0). */
73
+ static polygonToMesh3D(polygon: Polygon, color?: number, alpha?: number): Mesh;
74
+ /**
75
+ * Build a surface mesh from a grid (matrix) of points, as two triangle
76
+ * sweeps with distinct materials (bug fix: the first sweep now uses `alpha1`).
77
+ */
78
+ static pointMatrixToMesh3D(vector: Vector<Vector<Vector<number>>>, color1?: number, alpha1?: number, color2?: number, alpha2?: number): Mesh[];
79
+ }
80
+ //# sourceMappingURL=Graph3DUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Graph3DUtils.d.ts","sourceRoot":"","sources":["../src/Graph3DUtils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,156 @@
1
+ import { VectorUtils } from "./VectorUtils.js";
2
+ const v3 = (x, y, z = 0) => ({ x, y, z });
3
+ const asPoint = (p) => ({ x: p.x, y: p.y, z: p.z });
4
+ export class Graph3DUtils {
5
+ /** Sample `binaryOperation` over a 2D grid, returning a matrix of results. */
6
+ static dualRangeVector(binaryOperation, xMin = -10, xMax = 10, xStep = 1, yMin = -10, yMax = 10, yStep = 1) {
7
+ const xValues = VectorUtils.arithmeticSequence(xMin, xMax, xStep);
8
+ // yValues is loop-invariant across the x loop — compute it once, not per x.
9
+ const yValues = VectorUtils.arithmeticSequence(yMin, yMax, yStep);
10
+ return VectorUtils.transform(xValues, (x) => VectorUtils.transform(yValues, (y) => binaryOperation(x, y)));
11
+ }
12
+ /**
13
+ * Sample `nOperation` over an N-dimensional grid (bug fix: the AS3 version
14
+ * only handled N=1 and mutated its arguments). `nOperation` receives the
15
+ * coordinate array for each grid point.
16
+ */
17
+ static nRangeVector(nOperation, mins, maxes, steps) {
18
+ // Each dimension's sequence of values is loop-invariant across the recursion
19
+ // (it depends only on `dim`, not on `prefix`) — compute all of them once
20
+ // up front instead of recomputing per recursive call.
21
+ const dimValues = mins.map((min, dim) => VectorUtils.arithmeticSequence(min, maxes[dim], steps[dim]));
22
+ const recurse = (dim, prefix) => {
23
+ if (dim >= mins.length)
24
+ return nOperation(prefix);
25
+ return VectorUtils.transform(dimValues[dim], (v) => recurse(dim + 1, [...prefix, v]));
26
+ };
27
+ return recurse(0, []);
28
+ }
29
+ /** Placement descriptor for a point in 3D (position + optional uniform scale from `t`). */
30
+ static placement3D(p, altProperties = null) {
31
+ if (altProperties) {
32
+ const out = {};
33
+ const max = Math.max(p.length, altProperties.length);
34
+ for (let i = 0; i < max; i++)
35
+ out[altProperties[i]] = p[i];
36
+ return out;
37
+ }
38
+ const scale = p.t !== 0 ? p.t : 1;
39
+ return { x: p.x, y: p.y, z: p.z, scaleX: scale, scaleY: scale, scaleZ: scale };
40
+ }
41
+ static placement3DBarGraph(p) {
42
+ return { x: p.x, y: p.y, z: p.z, scaleX: 1, scaleY: 1, scaleZ: 1 };
43
+ }
44
+ /** A flat two-triangle ribbon between two points (see the class NOTE). */
45
+ static create3DCurveSegment(firstPoint, secondPoint, color = 0x000000, alpha = 1, planeThickness = 1, planeAngle = 0) {
46
+ const t = planeThickness / 2;
47
+ const a = asPoint(firstPoint);
48
+ const b = asPoint(secondPoint);
49
+ const phi = Math.PI / 2 - Math.atan2(b.y - a.y, b.x - a.x);
50
+ const a1 = v3(a.x - Math.cos(phi) * t * Math.cos(planeAngle), a.y + Math.sin(phi) * t * Math.sin(planeAngle));
51
+ const a2 = v3(a.x + Math.cos(phi) * t * Math.cos(planeAngle), a.y - Math.sin(phi) * t * Math.sin(planeAngle));
52
+ const b1 = v3(b.x - Math.cos(phi) * t * Math.cos(planeAngle), b.y + Math.sin(phi) * t * Math.sin(planeAngle));
53
+ const b2 = v3(b.x + Math.cos(phi) * t * Math.cos(planeAngle), b.y - Math.sin(phi) * t * Math.sin(planeAngle));
54
+ return {
55
+ material: { color, alpha, oneSide: false },
56
+ faces: [
57
+ [a1, b1, a2],
58
+ [b1, b2, a2],
59
+ ],
60
+ };
61
+ }
62
+ /** A rectangular prism (tube) between two points (see the class NOTE). */
63
+ static create3DPrism(firstPoint, secondPoint, color = 0x000000, alpha = 1, planeThickness = 1) {
64
+ const t = planeThickness / 2;
65
+ const a = asPoint(firstPoint);
66
+ const b = asPoint(secondPoint);
67
+ const phi = Math.PI / 2 - Math.atan2(b.y - a.y, b.x - a.x);
68
+ const a1 = v3(a.x - Math.cos(phi), a.y + Math.sin(phi) * t, a.z);
69
+ const a11 = v3(a1.x, a1.y, a1.z + t);
70
+ const a12 = v3(a1.x, a1.y, a1.z - t);
71
+ const a2 = v3(a.x + Math.cos(phi), a.y - Math.sin(phi) * t, a.z);
72
+ const a21 = v3(a2.x, a2.y, a2.z + t);
73
+ const a22 = v3(a2.x, a2.y, a2.z - t);
74
+ const b1 = v3(b.x - Math.cos(phi), b.y + Math.sin(phi) * t, a.z);
75
+ const b11 = v3(b1.x, b1.y, b1.z + t);
76
+ const b12 = v3(b1.x, b1.y, b1.z - t);
77
+ const b2 = v3(b.x + Math.cos(phi), b.y - Math.sin(phi) * t, a.z);
78
+ const b21 = v3(b2.x, b2.y, b2.z + t);
79
+ const b22 = v3(b2.x, b2.y, b2.z - t);
80
+ const faces = [
81
+ [a11, a12, a22],
82
+ [a11, a21, a22],
83
+ [b11, b12, b22],
84
+ [b11, b21, b22],
85
+ [a11, a21, b21],
86
+ [a11, b11, b21],
87
+ [a21, b21, b22],
88
+ [a21, a22, b22],
89
+ [a22, b22, b12],
90
+ [a22, a12, b12],
91
+ [a12, a11, b11],
92
+ [a12, b12, b11],
93
+ ];
94
+ return { material: { color, alpha, oneSide: false }, faces };
95
+ }
96
+ /** A tube following a poly-line, as one prism mesh per segment. */
97
+ static vectorTo3DPrism(points, color = 0, alpha = 1, planeThickness = 1) {
98
+ const out = [];
99
+ for (let i = 0; i < points.length - 1; i++) {
100
+ out.push(Graph3DUtils.create3DPrism(points[i], points[i + 1], color, alpha, planeThickness));
101
+ }
102
+ return out;
103
+ }
104
+ /** Alias of {@link vectorTo3DPrism} (the AS3 `VectorTo3DCurve` was identical). */
105
+ static vectorTo3DCurve(points, color = 0, alpha = 1, planeThickness = 1) {
106
+ return Graph3DUtils.vectorTo3DPrism(points, color, alpha, planeThickness);
107
+ }
108
+ /** Triangulate a polygon into a mesh (fan from vertex 0). */
109
+ static polygonToMesh3D(polygon, color = 0, alpha = 1) {
110
+ const faces = [];
111
+ const degenerate = polygon.clone();
112
+ while (degenerate.length > 2) {
113
+ faces.push([asPoint(degenerate.vertex(0)), asPoint(degenerate.vertex(1)), asPoint(degenerate.vertex(2))]);
114
+ degenerate.splice(1, 1);
115
+ }
116
+ return { material: { color, alpha, oneSide: false }, faces };
117
+ }
118
+ /**
119
+ * Build a surface mesh from a grid (matrix) of points, as two triangle
120
+ * sweeps with distinct materials (bug fix: the first sweep now uses `alpha1`).
121
+ */
122
+ static pointMatrixToMesh3D(vector, color1 = 0, alpha1 = 1, color2 = 0xffffff, alpha2 = 1) {
123
+ const width = VectorUtils.width(vector);
124
+ const height = VectorUtils.height(vector);
125
+ const at = (i, j) => vector[i]?.[j];
126
+ const faces1 = [];
127
+ for (let i = 0; i < width - 1; i++) {
128
+ for (let j = 0; j < height - 1; j++) {
129
+ if (at(i, j) && vector[i + 1] && at(i, j + 1)) {
130
+ faces1.push([
131
+ asPoint(at(i, j)),
132
+ asPoint(at(i + 1, j)),
133
+ asPoint(at(i, j + 1)),
134
+ ]);
135
+ }
136
+ }
137
+ }
138
+ const faces2 = [];
139
+ for (let i = 1; i < width; i++) {
140
+ for (let j = 1; j < height; j++) {
141
+ if (at(i, j) && vector[i - 1] && at(i, j - 1)) {
142
+ faces2.push([
143
+ asPoint(at(i, j)),
144
+ asPoint(at(i - 1, j)),
145
+ asPoint(at(i, j - 1)),
146
+ ]);
147
+ }
148
+ }
149
+ }
150
+ return [
151
+ { material: { color: color1, alpha: alpha1, oneSide: false }, faces: faces1 },
152
+ { material: { color: color2, alpha: alpha2, oneSide: false }, faces: faces2 },
153
+ ];
154
+ }
155
+ }
156
+ //# sourceMappingURL=Graph3DUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Graph3DUtils.js","sourceRoot":"","sources":["../src/Graph3DUtils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ import type { Polygon } from "./Polygon.ts";
2
+ import type { Vector } from "./Vector.ts";
3
+ /**
4
+ * GraphUtils — helpers for turning functions and points into 2D drawing data.
5
+ *
6
+ * Ported from Mallory's ActionScript `GraphUtils`, which mutated Flash
7
+ * `DisplayObject`s and drew into a `Graphics` context. Since neither exists
8
+ * outside Flash, the drawing operations are re-targeted to emit renderer-
9
+ * agnostic data — placement descriptors and vector paths — which the original
10
+ * comments themselves noted would be a cleaner separation. `if(point.x)`-style
11
+ * truthiness checks (which dropped legitimate zero coordinates) are fixed.
12
+ */
13
+ export interface Placement2D {
14
+ x: number;
15
+ y: number;
16
+ scaleX: number;
17
+ scaleY: number;
18
+ }
19
+ export interface BarPlacement2D {
20
+ x: number;
21
+ y: number;
22
+ width: number;
23
+ height: number;
24
+ scaleY: number;
25
+ }
26
+ export interface StrokeStyle {
27
+ thickness: number;
28
+ color: number;
29
+ alpha: number;
30
+ pixelHinting: boolean;
31
+ scaleMode: string;
32
+ caps: string | null;
33
+ joints: string | null;
34
+ miterLimit: number;
35
+ }
36
+ export interface FillStyle {
37
+ color: number;
38
+ alpha: number;
39
+ }
40
+ export interface PathCommand {
41
+ op: "moveTo" | "lineTo";
42
+ x: number;
43
+ y: number;
44
+ }
45
+ export interface Path2D {
46
+ stroke: StrokeStyle;
47
+ fill?: FillStyle;
48
+ commands: PathCommand[];
49
+ }
50
+ export declare class GraphUtils {
51
+ /** Sample `unaryOperation` across `[xMin, xMax]` in `xStep` increments. */
52
+ static singleRangeVector<T>(unaryOperation: (x: number) => T, xMin?: number, xMax?: number, xStep?: number): Vector<T>;
53
+ /**
54
+ * Placement descriptor for a point. With `altProperties`, maps each component
55
+ * to a named property; otherwise x/y position and (from z) a uniform scale.
56
+ */
57
+ static placement(p: Vector<number>, altProperties?: string[] | null): Placement2D | Record<string, number>;
58
+ /** Placement descriptor for a bar in a bar graph. */
59
+ static barPlacement(p: Vector<number>, barWidth?: number): BarPlacement2D;
60
+ static placements(points: Vector<Vector<number>>, altProperties?: string[] | null): Array<Placement2D | Record<string, number>>;
61
+ static barPlacements(points: Vector<Vector<number>>, barWidth?: number): BarPlacement2D[];
62
+ /** A poly-line path through the given points. */
63
+ static vectorToCurve(points: Vector<Vector<number>>, thickness?: number, color?: number, alpha?: number, pixelHinting?: boolean, scaleMode?: string, caps?: string | null, joints?: string | null, miterLimit?: number): Path2D;
64
+ /** A filled, closed path tracing a polygon's edges. */
65
+ static polygonToCurve(polygon: Polygon, strokeThickness?: number, strokeColor?: number, strokeAlpha?: number, fillColor?: number, fillAlpha?: number, pixelHinting?: boolean, scaleMode?: string, caps?: string | null, joints?: string | null, miterLimit?: number): Path2D;
66
+ }
67
+ //# sourceMappingURL=GraphUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GraphUtils.d.ts","sourceRoot":"","sources":["../src/GraphUtils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ import { VectorUtils } from "./VectorUtils.js";
2
+ const point = (p) => ({ x: p.x, y: p.y, z: p.z, t: p.t });
3
+ export class GraphUtils {
4
+ /** Sample `unaryOperation` across `[xMin, xMax]` in `xStep` increments. */
5
+ static singleRangeVector(unaryOperation, xMin = -10, xMax = 10, xStep = 1) {
6
+ const xValues = VectorUtils.arithmeticSequence(xMin, xMax, xStep);
7
+ return VectorUtils.transform(xValues, unaryOperation);
8
+ }
9
+ /**
10
+ * Placement descriptor for a point. With `altProperties`, maps each component
11
+ * to a named property; otherwise x/y position and (from z) a uniform scale.
12
+ */
13
+ static placement(p, altProperties = null) {
14
+ if (altProperties) {
15
+ const out = {};
16
+ const max = Math.max(p.length, altProperties.length);
17
+ for (let i = 0; i < max; i++)
18
+ out[altProperties[i]] = p[i];
19
+ return out;
20
+ }
21
+ const { x, y, z } = point(p);
22
+ const scale = z !== 0 ? Math.abs(z) : 1;
23
+ return { x, y, scaleX: scale, scaleY: scale };
24
+ }
25
+ /** Placement descriptor for a bar in a bar graph. */
26
+ static barPlacement(p, barWidth = 40) {
27
+ const { x, y } = point(p);
28
+ return { x, y: 0, width: barWidth, height: y, scaleY: y < 0 ? -1 : 1 };
29
+ }
30
+ static placements(points, altProperties = null) {
31
+ return [...points].map((p) => GraphUtils.placement(p, altProperties));
32
+ }
33
+ static barPlacements(points, barWidth = 40) {
34
+ return [...points].map((p) => GraphUtils.barPlacement(p, barWidth));
35
+ }
36
+ /** A poly-line path through the given points. */
37
+ static vectorToCurve(points, thickness = 0, color = 0, alpha = 1, pixelHinting = false, scaleMode = "normal", caps = null, joints = null, miterLimit = 3) {
38
+ const stroke = { thickness, color, alpha, pixelHinting, scaleMode, caps, joints, miterLimit };
39
+ const commands = [];
40
+ if (points.length > 0) {
41
+ const first = point(points[0]);
42
+ commands.push({ op: "moveTo", x: first.x, y: first.y });
43
+ for (let i = 1; i < points.length; i++) {
44
+ const pt = point(points[i]);
45
+ commands.push({ op: "lineTo", x: pt.x, y: pt.y });
46
+ }
47
+ }
48
+ return { stroke, commands };
49
+ }
50
+ /** A filled, closed path tracing a polygon's edges. */
51
+ static polygonToCurve(polygon, strokeThickness = 0, strokeColor = 0, strokeAlpha = 1, fillColor = 0xffffff, fillAlpha = 1, pixelHinting = false, scaleMode = "normal", caps = null, joints = null, miterLimit = 3) {
52
+ const stroke = {
53
+ thickness: strokeThickness,
54
+ color: strokeColor,
55
+ alpha: strokeAlpha,
56
+ pixelHinting,
57
+ scaleMode,
58
+ caps,
59
+ joints,
60
+ miterLimit,
61
+ };
62
+ const commands = [];
63
+ const start = point(polygon.vertex(0));
64
+ commands.push({ op: "moveTo", x: start.x, y: start.y });
65
+ for (let i = 1; i <= polygon.edgeCount; i++) {
66
+ const pt = point(polygon.vertex(i));
67
+ commands.push({ op: "lineTo", x: pt.x, y: pt.y });
68
+ }
69
+ return { stroke, fill: { color: fillColor, alpha: fillAlpha }, commands };
70
+ }
71
+ }
72
+ //# sourceMappingURL=GraphUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GraphUtils.js","sourceRoot":"","sources":["../src/GraphUtils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ import { Permutation } from "./Permutation.ts";
2
+ /**
3
+ * GroupTheory — algorithms over a finite group given as a set of elements plus a
4
+ * binary operation and an equality test. Composes with {@link Structure} (pass
5
+ * `structure.multiply`/`structure.add`) and {@link Permutation} (pass
6
+ * `Permutation.compose`). Covers Cayley tables, axiom checking, element orders,
7
+ * generated subgroups, cosets, Lagrange's index, and group actions/orbits.
8
+ */
9
+ type BinOp<T> = (a: T, b: T) => T;
10
+ type Eq<T> = (a: T, b: T) => boolean;
11
+ export declare class GroupTheory {
12
+ /** The Cayley (multiplication) table: `table[i][j] = op(elements[i], elements[j])`. */
13
+ static cayleyTable<T>(elements: readonly T[], op: BinOp<T>): T[][];
14
+ /** True when the set is closed under `op`. */
15
+ static isClosed<T>(elements: readonly T[], op: BinOp<T>, eq: Eq<T>): boolean;
16
+ /** The identity element, or `null` if none exists. */
17
+ static findIdentity<T>(elements: readonly T[], op: BinOp<T>, eq: Eq<T>): T | null;
18
+ /** True when `op` is associative over the set (O(n³) check). */
19
+ static isAssociative<T>(elements: readonly T[], op: BinOp<T>, eq: Eq<T>): boolean;
20
+ /** True when every element has an inverse relative to `identity`. */
21
+ static hasInverses<T>(elements: readonly T[], op: BinOp<T>, eq: Eq<T>, identity: T): boolean;
22
+ /** Verify all four group axioms (closure, associativity, identity, inverses). */
23
+ static isGroup<T>(elements: readonly T[], op: BinOp<T>, eq: Eq<T>): boolean;
24
+ /** True when the group is also abelian (commutative). */
25
+ static isAbelian<T>(elements: readonly T[], op: BinOp<T>, eq: Eq<T>): boolean;
26
+ /** The order of an element: the least `k ≥ 1` with `elementᵏ = identity`. */
27
+ static elementOrder<T>(element: T, op: BinOp<T>, eq: Eq<T>, identity: T, max?: number): number;
28
+ /**
29
+ * The subgroup generated by `generators`: the closure of the generators (and
30
+ * the identity) under `op`. `identity` may be supplied when it is not itself a
31
+ * generator; otherwise closure alone recovers it for a finite group — except
32
+ * when `generators` is empty, in which case there is nothing to multiply out
33
+ * and `identity` must be supplied explicitly to get the trivial subgroup
34
+ * `[identity]` back (omitting it returns `[]`, since no identity can be
35
+ * discovered from zero elements and `op` alone).
36
+ */
37
+ static closure<T>(generators: readonly T[], op: BinOp<T>, eq: Eq<T>, identity?: T, cap?: number): T[];
38
+ /** True when `sub` is a subgroup of `group` under `op`. */
39
+ static isSubgroup<T>(sub: readonly T[], group: readonly T[], op: BinOp<T>, eq: Eq<T>): boolean;
40
+ /** The distinct left cosets `gH` of subgroup `H` in `group`. */
41
+ static leftCosets<T>(subgroup: readonly T[], group: readonly T[], op: BinOp<T>, eq: Eq<T>): T[][];
42
+ /** Lagrange index `[G : H] = |G| / |H|`. */
43
+ static index<T>(group: readonly T[], subgroup: readonly T[]): number;
44
+ /** The orbit of `x` under a group action, given the generators and the action map. */
45
+ static orbit<T, X>(x: X, generators: readonly T[], action: (g: T, x: X) => X, eqX: Eq<X>, cap?: number): X[];
46
+ /** The cyclic group Zₙ as `{0, …, n-1}` under addition mod n. */
47
+ static cyclicGroup(n: number): {
48
+ elements: number[];
49
+ op: BinOp<number>;
50
+ identity: number;
51
+ };
52
+ /**
53
+ * The dihedral group Dₙ (order 2n): symmetries of a regular n-gon, as
54
+ * permutations of its n vertices `{0, …, n-1}`. n rotations `ρₖ: i ↦ (i+k)
55
+ * mod n` plus n reflections `σₖ: i ↦ (k-i) mod n` (reflecting through the
56
+ * axis fixing vertex k/2 when k is even, or the edge midpoint between
57
+ * ⌊k/2⌋ and ⌈k/2⌉ when k is odd). For n=3 this is exactly (element-for-
58
+ * element, not just isomorphic) {@link symmetricGroup}(3) — the two
59
+ * constructions coincide since S₃ has only 6 permutations total, matching
60
+ * D₃'s own order 2·3=6.
61
+ */
62
+ static dihedralGroup(n: number): Array<Permutation<number>>;
63
+ /**
64
+ * The stabilizer of `x` under a group action: the elements of `group`
65
+ * fixing `x`. Complements {@link orbit} — the orbit-stabilizer theorem
66
+ * (`|orbit(x)| · |stabilizer(x)| = |G|`) holds for any finite group action.
67
+ */
68
+ static stabilizer<T, X>(x: X, group: readonly T[], action: (g: T, x: X) => X, eqX: Eq<X>): T[];
69
+ /** The symmetric group Sₙ: every permutation of `{0, …, n-1}`. */
70
+ static symmetricGroup(n: number): Array<Permutation<number>>;
71
+ }
72
+ export {};
73
+ //# sourceMappingURL=GroupTheory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GroupTheory.d.ts","sourceRoot":"","sources":["../src/GroupTheory.ts"],"names":[],"mappings":"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"}