@buley/hexgrid-3d 3.2.3 → 3.3.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 (55) hide show
  1. package/dist/algorithms/AdvancedStatistics.d.ts +2 -2
  2. package/dist/algorithms/AdvancedStatistics.d.ts.map +1 -1
  3. package/dist/algorithms/AdvancedStatistics.js +2 -2
  4. package/dist/algorithms/BayesianStatistics.d.ts +6 -0
  5. package/dist/algorithms/BayesianStatistics.d.ts.map +1 -1
  6. package/dist/algorithms/BayesianStatistics.js +54 -0
  7. package/dist/algorithms/FlowField.d.ts +11 -0
  8. package/dist/algorithms/FlowField.d.ts.map +1 -1
  9. package/dist/algorithms/FlowField.js +13 -0
  10. package/dist/algorithms/FluidSimulation.d.ts +21 -3
  11. package/dist/algorithms/FluidSimulation.d.ts.map +1 -1
  12. package/dist/algorithms/FluidSimulation.js +40 -0
  13. package/dist/algorithms/GraphAlgorithms.d.ts +1 -1
  14. package/dist/algorithms/GraphAlgorithms.d.ts.map +1 -1
  15. package/dist/algorithms/GraphAlgorithms.js +87 -15
  16. package/dist/algorithms/OutlierDetection.d.ts +4 -0
  17. package/dist/algorithms/OutlierDetection.d.ts.map +1 -1
  18. package/dist/algorithms/OutlierDetection.js +15 -3
  19. package/dist/algorithms/ParticleSystem.d.ts +46 -3
  20. package/dist/algorithms/ParticleSystem.d.ts.map +1 -1
  21. package/dist/algorithms/ParticleSystem.js +118 -15
  22. package/dist/components/HexGrid.d.ts +32 -2
  23. package/dist/components/HexGrid.d.ts.map +1 -1
  24. package/dist/components/HexGrid.js +5456 -25
  25. package/dist/components/debug/PoolStatsOverlay.d.ts +6 -0
  26. package/dist/components/debug/PoolStatsOverlay.d.ts.map +1 -0
  27. package/dist/components/debug/PoolStatsOverlay.js +18 -0
  28. package/dist/components/index.d.ts +3 -2
  29. package/dist/components/index.d.ts.map +1 -1
  30. package/dist/components/index.js +1 -1
  31. package/dist/lib/html-utils.d.ts +2 -0
  32. package/dist/lib/html-utils.d.ts.map +1 -0
  33. package/dist/lib/html-utils.js +7 -0
  34. package/dist/lib/logger.d.ts +20 -0
  35. package/dist/lib/logger.d.ts.map +1 -0
  36. package/dist/lib/logger.js +9 -0
  37. package/dist/lib/narration.d.ts +5 -0
  38. package/dist/lib/narration.d.ts.map +1 -1
  39. package/dist/lib/narration.js +19 -0
  40. package/dist/lib/stats-tracker.d.ts +2 -0
  41. package/dist/lib/stats-tracker.d.ts.map +1 -1
  42. package/dist/lib/stats-tracker.js +13 -0
  43. package/dist/lib/theme-colors.d.ts +9 -0
  44. package/dist/lib/theme-colors.d.ts.map +1 -1
  45. package/dist/lib/theme-colors.js +18 -1
  46. package/dist/math/Matrix4.d.ts +179 -2
  47. package/dist/math/Matrix4.d.ts.map +1 -1
  48. package/dist/math/Matrix4.js +528 -8
  49. package/dist/math/Quaternion.d.ts +69 -0
  50. package/dist/math/Quaternion.d.ts.map +1 -1
  51. package/dist/math/Quaternion.js +439 -0
  52. package/dist/math/SpatialIndex.d.ts +32 -13
  53. package/dist/math/SpatialIndex.d.ts.map +1 -1
  54. package/dist/math/SpatialIndex.js +239 -33
  55. package/package.json +4 -2
@@ -5,8 +5,8 @@ export interface TrendResult {
5
5
  }
6
6
  export declare function giniCoefficient(values: number[]): number;
7
7
  export declare function theilIndex(values: number[]): number;
8
- export declare function atkinsonIndex(values: number[], epsilon: number): number;
9
- export declare function paretoRatio(values: number[], topFraction: number): {
8
+ export declare function atkinsonIndex(values: number[], epsilon?: number): number;
9
+ export declare function paretoRatio(values: number[], topFraction?: number): {
10
10
  ratioHeld: number;
11
11
  paretoIndex: number;
12
12
  };
@@ -1 +1 @@
1
- {"version":3,"file":"AdvancedStatistics.d.ts","sourceRoot":"","sources":["../../src/algorithms/AdvancedStatistics.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AdvancedStatistics.d.ts","sourceRoot":"","sources":["../../src/algorithms/AdvancedStatistics.ts"],"names":[],"mappings":"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"}
@@ -23,7 +23,7 @@ export function theilIndex(values) {
23
23
  return sum + (ratio === 0 ? 0 : ratio * Math.log(ratio));
24
24
  }, 0) / values.length);
25
25
  }
26
- export function atkinsonIndex(values, epsilon) {
26
+ export function atkinsonIndex(values, epsilon = 1) {
27
27
  if (values.length === 0)
28
28
  return 0;
29
29
  const avg = values.reduce((sum, val) => sum + val, 0) / values.length;
@@ -39,7 +39,7 @@ export function atkinsonIndex(values, epsilon) {
39
39
  const eq = Math.pow(meanPower, 1 / (1 - epsilon));
40
40
  return 1 - eq / avg;
41
41
  }
42
- export function paretoRatio(values, topFraction) {
42
+ export function paretoRatio(values, topFraction = 0.2) {
43
43
  if (values.length === 0)
44
44
  return { ratioHeld: 0, paretoIndex: 0 };
45
45
  const sorted = [...values].sort((a, b) => b - a);
@@ -83,4 +83,10 @@ export declare function monteCarloIntegrate(fn: (x: number) => number, a: number
83
83
  export declare function mutualInformation(x: number[], y: number[]): number;
84
84
  export declare function conditionalEntropy(x: number[], y: number[]): number;
85
85
  export declare function normalizedMutualInformation(x: number[], y: number[]): number;
86
+ export declare function logGamma(x: number): number;
87
+ export declare function gamma(x: number): number;
88
+ export declare function logBeta(a: number, b: number): number;
89
+ export declare function betaFunction(a: number, b: number): number;
90
+ export declare function factorial(n: number): number;
91
+ export declare function binomial(n: number, k: number): number;
86
92
  //# sourceMappingURL=BayesianStatistics.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"BayesianStatistics.d.ts","sourceRoot":"","sources":["../../src/algorithms/BayesianStatistics.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"BayesianStatistics.d.ts","sourceRoot":"","sources":["../../src/algorithms/BayesianStatistics.ts"],"names":[],"mappings":"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"}
@@ -261,3 +261,57 @@ export function normalizedMutualInformation(x, y) {
261
261
  const denom = Math.sqrt(hx * hy);
262
262
  return denom === 0 ? 0 : mi / denom;
263
263
  }
264
+ // Math Utilities
265
+ const LANCZOS_COEFFICIENTS = [
266
+ 76.18009172947146, -86.50532032941677, 24.01409824083091,
267
+ -1.231739572450155, 0.1208650973866179e-2, -0.5395239384953e-5,
268
+ ];
269
+ export function logGamma(x) {
270
+ if (x <= 0)
271
+ return Infinity;
272
+ if (x < 0.5) {
273
+ return Math.log(Math.PI / Math.sin(Math.PI * x)) - logGamma(1 - x);
274
+ }
275
+ x -= 1;
276
+ let a = 0.99999999999980993;
277
+ for (let i = 0; i < LANCZOS_COEFFICIENTS.length; i++) {
278
+ a += LANCZOS_COEFFICIENTS[i] / (x + 1 + i);
279
+ }
280
+ const t = x + LANCZOS_COEFFICIENTS.length - 0.5;
281
+ return 0.5 * Math.log(2 * Math.PI) + (x + 0.5) * Math.log(t) - t + Math.log(a);
282
+ }
283
+ export function gamma(x) {
284
+ return Math.exp(logGamma(x));
285
+ }
286
+ export function logBeta(a, b) {
287
+ return logGamma(a) + logGamma(b) - logGamma(a + b);
288
+ }
289
+ export function betaFunction(a, b) {
290
+ return Math.exp(logBeta(a, b));
291
+ }
292
+ export function factorial(n) {
293
+ if (n < 0)
294
+ return NaN;
295
+ if (n === 0 || n === 1)
296
+ return 1;
297
+ if (n >= 171)
298
+ return Infinity;
299
+ let result = 1;
300
+ for (let i = 2; i <= n; i++) {
301
+ result *= i;
302
+ }
303
+ return result;
304
+ }
305
+ export function binomial(n, k) {
306
+ if (k < 0 || k > n)
307
+ return 0;
308
+ if (k === 0 || k === n)
309
+ return 1;
310
+ if (k > n - k)
311
+ k = n - k;
312
+ let result = 1;
313
+ for (let i = 0; i < k; i++) {
314
+ result = (result * (n - i)) / (i + 1);
315
+ }
316
+ return Math.round(result);
317
+ }
@@ -3,6 +3,8 @@ export interface FlowFieldConfig {
3
3
  width: number;
4
4
  height: number;
5
5
  resolution: number;
6
+ decayRate?: number;
7
+ diffusionRate?: number;
6
8
  }
7
9
  export interface Streamline {
8
10
  points: Vector2[];
@@ -10,8 +12,17 @@ export interface Streamline {
10
12
  export declare class FlowField2D {
11
13
  private config;
12
14
  private sources;
15
+ readonly width: number;
16
+ readonly height: number;
17
+ readonly resolution: number;
18
+ readonly cols: number;
19
+ readonly rows: number;
20
+ readonly decayRate: number;
21
+ readonly diffusionRate: number;
13
22
  constructor(config: FlowFieldConfig);
14
23
  clear(): void;
24
+ addVelocity(x: number, y: number, vx: number, vy: number): void;
25
+ addVortex(x: number, y: number, strength: number, radius: number): void;
15
26
  addSource(x: number, y: number, vx: number, vy: number, strength: number): void;
16
27
  update(_deltaTime: number): void;
17
28
  sample(x: number, y: number): Vector2;
@@ -1 +1 @@
1
- {"version":3,"file":"FlowField.d.ts","sourceRoot":"","sources":["../../src/algorithms/FlowField.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE1C,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,OAAO,EAAE,CAAC;CACnB;AAUD,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,OAAO,CAAgB;gBAEnB,MAAM,EAAE,eAAe;IAInC,KAAK,IAAI,IAAI;IAIb,SAAS,CACP,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,MAAM,GACf,IAAI;IAIP,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAIhC,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO;IAiBrC,UAAU,CACR,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,GACR;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE;IAS1D,eAAe,CACb,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,OAAO,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GACjE,UAAU;CAiBd;AAED,qBAAa,qBAAqB;IAChC,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,MAAM,CAAS;gBAEX,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAKzC,WAAW,CACT,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,UAAU,EAAE,KAAK,CAAC;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,GAC1C,KAAK,CAAC;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAA;KAAE,CAAC;CAGnD;AAED,qBAAa,OAAO;IAClB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,IAAI,CAAe;gBAEf,MAAM,EAAE;QAClB,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC;KACtB;IAOD,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAanD,OAAO,IAAI,YAAY;CAGxB"}
1
+ {"version":3,"file":"FlowField.d.ts","sourceRoot":"","sources":["../../src/algorithms/FlowField.ts"],"names":[],"mappings":"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"}
@@ -3,10 +3,23 @@ export class FlowField2D {
3
3
  constructor(config) {
4
4
  this.sources = [];
5
5
  this.config = config;
6
+ this.width = config.width;
7
+ this.height = config.height;
8
+ this.resolution = config.resolution;
9
+ this.cols = Math.ceil(config.width / config.resolution);
10
+ this.rows = Math.ceil(config.height / config.resolution);
11
+ this.decayRate = config.decayRate ?? 0.99;
12
+ this.diffusionRate = config.diffusionRate ?? 0.1;
6
13
  }
7
14
  clear() {
8
15
  this.sources = [];
9
16
  }
17
+ addVelocity(x, y, vx, vy) {
18
+ this.sources.push({ x, y, vx, vy, strength: 1 });
19
+ }
20
+ addVortex(x, y, strength, radius) {
21
+ this.sources.push({ x, y, vx: -strength, vy: strength, strength: radius });
22
+ }
10
23
  addSource(x, y, vx, vy, strength) {
11
24
  this.sources.push({ x, y, vx, vy, strength });
12
25
  }
@@ -1,8 +1,21 @@
1
1
  export interface FluidConfig {
2
2
  width: number;
3
3
  height: number;
4
- viscosity: number;
5
- diffusion: number;
4
+ viscosity?: number;
5
+ diffusion?: number;
6
+ pressureIterations?: number;
7
+ dt?: number;
8
+ vorticityConfinement?: number;
9
+ dissipation?: number;
10
+ }
11
+ export interface FluidSource {
12
+ x: number;
13
+ y: number;
14
+ radius: number;
15
+ density: number;
16
+ velocityX: number;
17
+ velocityY: number;
18
+ color?: [number, number, number];
6
19
  }
7
20
  export declare class StableFluids {
8
21
  private width;
@@ -10,15 +23,20 @@ export declare class StableFluids {
10
23
  private density;
11
24
  private velocityX;
12
25
  private velocityY;
26
+ private colorR;
27
+ private colorG;
28
+ private colorB;
13
29
  constructor(config: FluidConfig);
30
+ addSource(source: FluidSource): void;
14
31
  addDensity(x: number, y: number, amount: number, radius: number): void;
15
32
  addForce(x: number, y: number, vx: number, vy: number, _radius: number): void;
16
- step(_deltaTime: number): void;
33
+ step(_deltaTime?: number): void;
17
34
  getDensity(x: number, y: number): number;
18
35
  getVelocity(x: number, y: number): {
19
36
  x: number;
20
37
  y: number;
21
38
  };
39
+ getColor(x: number, y: number): [number, number, number];
22
40
  getDensityField(): Float32Array;
23
41
  getVelocityField(): {
24
42
  x: Float32Array;
@@ -1 +1 @@
1
- {"version":3,"file":"FluidSimulation.d.ts","sourceRoot":"","sources":["../../src/algorithms/FluidSimulation.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAe;IAC9B,OAAO,CAAC,SAAS,CAAe;IAChC,OAAO,CAAC,SAAS,CAAe;gBAEpB,MAAM,EAAE,WAAW;IAS/B,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAKtE,QAAQ,CACN,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,MAAM,GACd,IAAI;IAMP,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAQ9B,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM;IAIxC,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE;IAK3D,eAAe,IAAI,YAAY;IAI/B,gBAAgB,IAAI;QAAE,CAAC,EAAE,YAAY,CAAC;QAAC,CAAC,EAAE,YAAY,CAAA;KAAE;IAIxD,KAAK,IAAI,IAAI;IAMb,OAAO,CAAC,QAAQ;CAKjB;AAED,qBAAa,gBAAgB;gBACf,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAC5C;AAED,qBAAa,uBAAuB;IAClC,OAAO,CAAC,KAAK,CAAe;gBAEhB,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IASzC,iBAAiB,CACf,QAAQ,EAAE,MAAM,EAChB,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,SAAS,EAAE,MAAM,GAChB,IAAI;IAIP,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAI/B,QAAQ,IAAI,YAAY;IAIxB,KAAK,IAAI,IAAI;CAGd"}
1
+ {"version":3,"file":"FluidSimulation.d.ts","sourceRoot":"","sources":["../../src/algorithms/FluidSimulation.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAe;IAC9B,OAAO,CAAC,SAAS,CAAe;IAChC,OAAO,CAAC,SAAS,CAAe;IAChC,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,MAAM,CAAe;gBAEjB,MAAM,EAAE,WAAW;IAY/B,SAAS,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IA4BpC,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAKtE,QAAQ,CACN,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,MAAM,GACd,IAAI;IAMP,IAAI,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI;IAQ/B,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM;IAIxC,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE;IAK3D,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;IASxD,eAAe,IAAI,YAAY;IAI/B,gBAAgB,IAAI;QAAE,CAAC,EAAE,YAAY,CAAC;QAAC,CAAC,EAAE,YAAY,CAAA;KAAE;IAIxD,KAAK,IAAI,IAAI;IASb,OAAO,CAAC,QAAQ;CAKjB;AAED,qBAAa,gBAAgB;gBACf,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAC5C;AAED,qBAAa,uBAAuB;IAClC,OAAO,CAAC,KAAK,CAAe;gBAEhB,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IASzC,iBAAiB,CACf,QAAQ,EAAE,MAAM,EAChB,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,SAAS,EAAE,MAAM,GAChB,IAAI;IAIP,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAI/B,QAAQ,IAAI,YAAY;IAIxB,KAAK,IAAI,IAAI;CAGd"}
@@ -6,6 +6,35 @@ export class StableFluids {
6
6
  this.density = new Float32Array(size);
7
7
  this.velocityX = new Float32Array(size);
8
8
  this.velocityY = new Float32Array(size);
9
+ this.colorR = new Float32Array(size);
10
+ this.colorG = new Float32Array(size);
11
+ this.colorB = new Float32Array(size);
12
+ }
13
+ addSource(source) {
14
+ const { x, y, radius, density, velocityX, velocityY, color } = source;
15
+ const minX = Math.max(0, Math.floor(x - radius));
16
+ const maxX = Math.min(this.width - 1, Math.ceil(x + radius));
17
+ const minY = Math.max(0, Math.floor(y - radius));
18
+ const maxY = Math.min(this.height - 1, Math.ceil(y + radius));
19
+ for (let iy = minY; iy <= maxY; iy++) {
20
+ for (let ix = minX; ix <= maxX; ix++) {
21
+ const dx = ix - x;
22
+ const dy = iy - y;
23
+ const dist = Math.sqrt(dx * dx + dy * dy);
24
+ if (dist <= radius) {
25
+ const falloff = 1 - dist / radius;
26
+ const index = iy * this.width + ix;
27
+ this.density[index] += density * falloff;
28
+ this.velocityX[index] += velocityX * falloff;
29
+ this.velocityY[index] += velocityY * falloff;
30
+ if (color) {
31
+ this.colorR[index] = color[0];
32
+ this.colorG[index] = color[1];
33
+ this.colorB[index] = color[2];
34
+ }
35
+ }
36
+ }
37
+ }
9
38
  }
10
39
  addDensity(x, y, amount, radius) {
11
40
  const index = this.indexFor(x, y);
@@ -30,6 +59,14 @@ export class StableFluids {
30
59
  const index = this.indexFor(x, y);
31
60
  return { x: this.velocityX[index] || 0, y: this.velocityY[index] || 0 };
32
61
  }
62
+ getColor(x, y) {
63
+ const index = this.indexFor(x, y);
64
+ return [
65
+ this.colorR[index] || 0,
66
+ this.colorG[index] || 0,
67
+ this.colorB[index] || 0,
68
+ ];
69
+ }
33
70
  getDensityField() {
34
71
  return this.density;
35
72
  }
@@ -40,6 +77,9 @@ export class StableFluids {
40
77
  this.density.fill(0);
41
78
  this.velocityX.fill(0);
42
79
  this.velocityY.fill(0);
80
+ this.colorR.fill(0);
81
+ this.colorG.fill(0);
82
+ this.colorB.fill(0);
43
83
  }
44
84
  indexFor(x, y) {
45
85
  const ix = Math.min(this.width - 1, Math.max(0, Math.floor(x)));
@@ -15,7 +15,7 @@ export interface VoronoiDiagram {
15
15
  vertices: Array<[number, number]>;
16
16
  edges: Array<[[number, number], [number, number]]>;
17
17
  }
18
- export declare function kMeansClustering(points: number[][], k: number): Cluster[];
18
+ export declare function kMeansClustering(points: number[][], k: number, maxIterations?: number, tolerance?: number): Cluster[];
19
19
  export declare function dbscan(points: number[][], _eps: number, _minPoints: number): Cluster[];
20
20
  export declare function computeVoronoi(sites: Array<[number, number]>, bounds: {
21
21
  minX: number;
@@ -1 +1 @@
1
- {"version":3,"file":"GraphAlgorithms.d.ts","sourceRoot":"","sources":["../../src/algorithms/GraphAlgorithms.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,OAAO;IACtB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvB,QAAQ,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAClC,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,QAAQ,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAClC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;CACpD;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,EAAE,CAqCzE;AAED,wBAAgB,MAAM,CACpB,MAAM,EAAE,MAAM,EAAE,EAAE,EAClB,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,GACjB,OAAO,EAAE,CAGX;AAED,wBAAgB,cAAc,CAC5B,KAAK,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAC9B,MAAM,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACjE,cAAc,CAuBhB;AAED,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,EAC5C,SAAS,EAAE,MAAM,EAAE,EAAE,GACpB;IACD,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,CAiBA;AAED,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAC/B,CAAC,EAAE,MAAM,GACR,OAAO,EAAE,CAGX;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE;IAC7C,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CAC9B,GAAG,MAAM,EAAE,EAAE,CA0Bb;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE;IACxC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7B,OAAO,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/B,GAAG,KAAK,CAAC;IAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CAMnD;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,kBAOjE;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,EAAE,CAEtE;AAED,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,MAAM,EAAE,EAAE,EAClB,CAAC,EAAE,MAAM,GACR,OAAO,EAAE,CAEX"}
1
+ {"version":3,"file":"GraphAlgorithms.d.ts","sourceRoot":"","sources":["../../src/algorithms/GraphAlgorithms.ts"],"names":[],"mappings":"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"}
@@ -1,23 +1,80 @@
1
- export function kMeansClustering(points, k) {
1
+ export function kMeansClustering(points, k, maxIterations = 100, tolerance = 0.001) {
2
2
  if (points.length === 0 || k <= 0)
3
3
  return [];
4
- const clusters = Array.from({ length: k }, () => ({
5
- centroid: new Array(points[0]?.length || 0).fill(0),
6
- members: [],
7
- cohesion: 0,
8
- separation: 0,
9
- }));
10
- points.forEach((_point, index) => {
11
- clusters[index % k].members.push(index);
12
- });
4
+ const dims = points[0]?.length || 0;
5
+ const effectiveK = Math.min(k, points.length);
6
+ // Initialize centroids from the first effectiveK points
7
+ let centroids = [];
8
+ for (let i = 0; i < effectiveK; i++) {
9
+ centroids.push([...(points[i] ?? new Array(dims).fill(0))]);
10
+ }
11
+ let clusters = [];
12
+ for (let iter = 0; iter < maxIterations; iter++) {
13
+ // Assign points to nearest centroid
14
+ clusters = Array.from({ length: effectiveK }, (_, i) => ({
15
+ centroid: centroids[i] ?? new Array(dims).fill(0),
16
+ members: [],
17
+ cohesion: 0,
18
+ separation: 0,
19
+ }));
20
+ for (let pi = 0; pi < points.length; pi++) {
21
+ const point = points[pi];
22
+ let bestCluster = 0;
23
+ let bestDist = Infinity;
24
+ for (let ci = 0; ci < effectiveK; ci++) {
25
+ const c = centroids[ci];
26
+ let dist = 0;
27
+ for (let d = 0; d < dims; d++) {
28
+ const diff = (point[d] ?? 0) - (c[d] ?? 0);
29
+ dist += diff * diff;
30
+ }
31
+ if (dist < bestDist) {
32
+ bestDist = dist;
33
+ bestCluster = ci;
34
+ }
35
+ }
36
+ clusters[bestCluster].members.push(pi);
37
+ }
38
+ // Recompute centroids
39
+ const newCentroids = [];
40
+ let converged = true;
41
+ for (let ci = 0; ci < effectiveK; ci++) {
42
+ const members = clusters[ci].members;
43
+ if (members.length === 0) {
44
+ newCentroids.push(centroids[ci] ?? new Array(dims).fill(0));
45
+ continue;
46
+ }
47
+ const newCentroid = new Array(dims).fill(0);
48
+ for (const mi of members) {
49
+ const point = points[mi];
50
+ for (let d = 0; d < dims; d++) {
51
+ newCentroid[d] += point[d] ?? 0;
52
+ }
53
+ }
54
+ for (let d = 0; d < dims; d++) {
55
+ newCentroid[d] /= members.length;
56
+ }
57
+ // Check convergence
58
+ let shift = 0;
59
+ const oldC = centroids[ci];
60
+ for (let d = 0; d < dims; d++) {
61
+ const diff = newCentroid[d] - (oldC[d] ?? 0);
62
+ shift += diff * diff;
63
+ }
64
+ if (Math.sqrt(shift) > tolerance) {
65
+ converged = false;
66
+ }
67
+ newCentroids.push(newCentroid);
68
+ }
69
+ centroids = newCentroids;
70
+ if (converged)
71
+ break;
72
+ }
73
+ // Finalize clusters with cohesion
13
74
  for (const cluster of clusters) {
14
75
  if (cluster.members.length === 0)
15
76
  continue;
16
- const centroid = cluster.centroid.map((_, dim) => {
17
- const sum = cluster.members.reduce((acc, memberIdx) => acc + (points[memberIdx]?.[dim] ?? 0), 0);
18
- return sum / cluster.members.length;
19
- });
20
- cluster.centroid = centroid;
77
+ const centroid = cluster.centroid;
21
78
  cluster.cohesion =
22
79
  cluster.members.reduce((sum, idx) => {
23
80
  const point = points[idx];
@@ -28,6 +85,21 @@ export function kMeansClustering(points, k) {
28
85
  return sum + distance;
29
86
  }, 0) / cluster.members.length;
30
87
  }
88
+ // Calculate separation between clusters
89
+ for (let i = 0; i < clusters.length; i++) {
90
+ let minDist = Infinity;
91
+ for (let j = 0; j < clusters.length; j++) {
92
+ if (i === j)
93
+ continue;
94
+ let dist = 0;
95
+ for (let d = 0; d < dims; d++) {
96
+ const diff = (clusters[i].centroid[d] ?? 0) - (clusters[j].centroid[d] ?? 0);
97
+ dist += diff * diff;
98
+ }
99
+ minDist = Math.min(minDist, Math.sqrt(dist));
100
+ }
101
+ clusters[i].separation = minDist === Infinity ? 0 : minDist;
102
+ }
31
103
  return clusters;
32
104
  }
33
105
  export function dbscan(points, _eps, _minPoints) {
@@ -1,12 +1,16 @@
1
1
  export interface OutlierStats {
2
2
  mean: number;
3
3
  stdDev: number;
4
+ median?: number;
5
+ iqr?: number;
6
+ mad?: number;
4
7
  }
5
8
  export interface OutlierResult {
6
9
  outlierIndices: number[];
7
10
  scores: number[];
8
11
  stats: OutlierStats;
9
12
  threshold: number;
13
+ method: string;
10
14
  }
11
15
  export interface TimeSeriesAnomaly {
12
16
  index: number;
@@ -1 +1 @@
1
- {"version":3,"file":"OutlierDetection.d.ts","sourceRoot":"","sources":["../../src/algorithms/OutlierDetection.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,EAAE,YAAY,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;CAC1C;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;CACvB;AAcD,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,MAAM,EAAE,EAChB,SAAS,GAAE,MAAU,GACpB,aAAa,CAkBf;AAED,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,MAAM,EAAE,EAChB,SAAS,GAAE,MAAY,GACtB,aAAa,CA+Bf;AAED,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,MAAM,EAAE,EAChB,SAAS,GAAE,MAAY,GACtB,aAAa,CAmCf;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,iBAAiB,EAAE,CAmBxE;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,EAAE,GACf,oBAAoB,EAAE,CAwBxB;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EAAE,EAChB,SAAS,GAAE,MAAU,GACpB,aAAa,CAEf;AAGD,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,eAAe,GAAG,eAAe,GAAG,qBAAqB,CAAC;IAChE,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EAAE,EAChB,UAAU,GAAE,MAAU,GACrB,WAAW,EAAE,CAwBf;AAGD,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,MAAM,EAAE,GACf,yBAAyB,CAiB3B;AAGD,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EAAE,EAChB,CAAC,GAAE,MAAU,GACZ,aAAa,CA2Cf;AAGD,wBAAgB,eAAe,CAC7B,MAAM,EAAE,MAAM,EAAE,EAChB,KAAK,GAAE,MAAY,EACnB,OAAO,GAAE,MAAY,GACpB,aAAa,CAwCf;AAGD,wBAAgB,UAAU,CACxB,MAAM,EAAE,MAAM,EAAE,EAChB,MAAM,EAAE,MAAM,EACd,CAAC,GAAE,MAAU,EACb,CAAC,GAAE,MAAY,GACd,iBAAiB,EAAE,CAwBrB;AAGD,wBAAgB,SAAS,CACvB,MAAM,EAAE,MAAM,EAAE,EAChB,MAAM,GAAE,MAAY,EACpB,GAAG,GAAE,MAAW,EAChB,GAAG,GAAE,MAAU,GACd,iBAAiB,EAAE,CA6BrB"}
1
+ {"version":3,"file":"OutlierDetection.d.ts","sourceRoot":"","sources":["../../src/algorithms/OutlierDetection.ts"],"names":[],"mappings":"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"}
@@ -17,11 +17,14 @@ export function detectOutliersZScore(values, threshold = 3) {
17
17
  .map((score, index) => ({ score, index }))
18
18
  .filter(({ score }) => Math.abs(score) >= threshold)
19
19
  .map(({ index }) => index);
20
+ const sorted = [...values].sort((a, b) => a - b);
21
+ const median = sorted.length > 0 ? sorted[Math.floor(sorted.length / 2)] ?? 0 : 0;
20
22
  return {
21
23
  outlierIndices,
22
24
  scores,
23
- stats: { mean: avg, stdDev: deviation },
25
+ stats: { mean: avg, stdDev: deviation, median },
24
26
  threshold,
27
+ method: 'zscore',
25
28
  };
26
29
  }
27
30
  export function detectOutliersModifiedZScore(values, threshold = 3.5) {
@@ -31,6 +34,7 @@ export function detectOutliersModifiedZScore(values, threshold = 3.5) {
31
34
  scores: [],
32
35
  stats: { mean: 0, stdDev: 0 },
33
36
  threshold,
37
+ method: 'modified_zscore',
34
38
  };
35
39
  }
36
40
  const sorted = [...values].sort((a, b) => a - b);
@@ -43,11 +47,14 @@ export function detectOutliersModifiedZScore(values, threshold = 3.5) {
43
47
  .map((score, index) => ({ score, index }))
44
48
  .filter(({ score }) => Math.abs(score) >= threshold)
45
49
  .map(({ index }) => index);
50
+ const avg = mean(values);
51
+ const deviation = stdDev(values, avg);
46
52
  return {
47
53
  outlierIndices,
48
54
  scores,
49
- stats: { mean: median, stdDev: mad },
55
+ stats: { mean: avg, stdDev: deviation, median, mad },
50
56
  threshold,
57
+ method: 'modified_zscore',
51
58
  };
52
59
  }
53
60
  export function detectOutliersIQR(values, threshold = 1.5) {
@@ -57,6 +64,7 @@ export function detectOutliersIQR(values, threshold = 1.5) {
57
64
  scores: [],
58
65
  stats: { mean: 0, stdDev: 0 },
59
66
  threshold,
67
+ method: 'iqr',
60
68
  };
61
69
  }
62
70
  const sorted = [...values].sort((a, b) => a - b);
@@ -75,8 +83,9 @@ export function detectOutliersIQR(values, threshold = 1.5) {
75
83
  return {
76
84
  outlierIndices,
77
85
  scores,
78
- stats: { mean: avg, stdDev: deviation },
86
+ stats: { mean: avg, stdDev: deviation, iqr },
79
87
  threshold,
88
+ method: 'iqr',
80
89
  };
81
90
  }
82
91
  export function detectGrowthSpikes(values) {
@@ -166,6 +175,7 @@ export function localOutlierFactor(values, k = 5) {
166
175
  scores: values.map(() => 0),
167
176
  stats: { mean: 0, stdDev: 0 },
168
177
  threshold: 1.5,
178
+ method: 'lof',
169
179
  };
170
180
  }
171
181
  const scores = [];
@@ -193,6 +203,7 @@ export function localOutlierFactor(values, k = 5) {
193
203
  scores: lofScores,
194
204
  stats: { mean: avg, stdDev },
195
205
  threshold,
206
+ method: 'lof',
196
207
  };
197
208
  }
198
209
  // Isolation Forest (simplified)
@@ -230,6 +241,7 @@ export function isolationForest(values, trees = 100, samples = 256) {
230
241
  scores,
231
242
  stats: { mean: avg, stdDev },
232
243
  threshold,
244
+ method: 'isolation_forest',
233
245
  };
234
246
  }
235
247
  // CUSUM Chart
@@ -2,19 +2,62 @@ import { Vector2 } from '../math/Vector3';
2
2
  type ParticleEffect = 'birth' | 'trail' | 'victory' | 'sparkle';
3
3
  export interface ParticleConfig {
4
4
  maxParticles: number;
5
- gravity: Vector2;
5
+ gravity?: Vector2;
6
+ }
7
+ export interface ParticleSystemConfig {
8
+ maxParticles: number;
9
+ emissionRate?: number;
10
+ gravity?: Vector2;
11
+ drag?: number;
12
+ bounds?: {
13
+ minX: number;
14
+ maxX: number;
15
+ minY: number;
16
+ maxY: number;
17
+ };
18
+ wrapBounds?: boolean;
19
+ }
20
+ export interface EmitterConfig {
21
+ position: Vector2;
22
+ velocity: Vector2;
23
+ velocitySpread: Vector2;
24
+ lifetime: number;
25
+ size: number;
26
+ color: [number, number, number, number];
6
27
  }
7
28
  export interface Particle {
8
29
  x: number;
9
30
  y: number;
31
+ vx: number;
32
+ vy: number;
10
33
  size: number;
11
34
  color: string;
12
35
  alpha: number;
36
+ lifetime: number;
37
+ age: number;
38
+ }
39
+ export declare class ParticleEmitter {
40
+ config: EmitterConfig;
41
+ constructor(config: EmitterConfig);
42
+ emit(): Particle;
13
43
  }
14
44
  export declare class ParticleSystem {
15
45
  private particles;
16
- addParticle(particle: Particle): void;
17
- update(_deltaTime: number): void;
46
+ private emitters;
47
+ private config;
48
+ constructor(config: ParticleSystemConfig);
49
+ createEmitter(emitterConfig: EmitterConfig): ParticleEmitter;
50
+ removeEmitter(emitter: ParticleEmitter): void;
51
+ update(deltaTime: number): void;
52
+ burst(position: Vector2, count: number, options: {
53
+ velocity: Vector2;
54
+ velocitySpread: Vector2;
55
+ lifetime: number;
56
+ size: number;
57
+ color: [number, number, number, number];
58
+ }): void;
59
+ spawn(config: EmitterConfig): void;
60
+ getActiveCount(): number;
18
61
  getPositions(): Particle[];
19
62
  clear(): void;
20
63
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ParticleSystem.d.ts","sourceRoot":"","sources":["../../src/algorithms/ParticleSystem.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE1C,KAAK,cAAc,GAAG,OAAO,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;AAEhE,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,QAAQ;IACvB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,SAAS,CAAkB;IAEnC,WAAW,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAIrC,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAIhC,YAAY,IAAI,QAAQ,EAAE;IAI1B,KAAK,IAAI,IAAI;CAGd;AAED,qBAAa,qBAAqB;IAChC,OAAO,CAAC,OAAO,CAA0C;IACzD,OAAO,CAAC,MAAM,CAAiB;gBAEnB,MAAM,EAAE,cAAc;IAKlC,aAAa,CACX,MAAM,EAAE,cAAc,EACtB,QAAQ,EAAE,OAAO,EACjB,OAAO,CAAC,EAAE;QACR,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QACjC,QAAQ,CAAC,EAAE,OAAO,CAAC;KACpB,GACA,IAAI;IAkBP,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAM/B,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAInD,QAAQ,IAAI,IAAI;CAKjB;AAED,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAK1D,CAAC"}
1
+ {"version":3,"file":"ParticleSystem.d.ts","sourceRoot":"","sources":["../../src/algorithms/ParticleSystem.ts"],"names":[],"mappings":"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"}