@buley/hexgrid-3d 3.2.4 → 3.3.1
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/dist/algorithms/AdvancedStatistics.d.ts +2 -2
- package/dist/algorithms/AdvancedStatistics.d.ts.map +1 -1
- package/dist/algorithms/AdvancedStatistics.js +2 -2
- package/dist/algorithms/BayesianStatistics.d.ts +6 -0
- package/dist/algorithms/BayesianStatistics.d.ts.map +1 -1
- package/dist/algorithms/BayesianStatistics.js +54 -0
- package/dist/algorithms/FlowField.d.ts +11 -0
- package/dist/algorithms/FlowField.d.ts.map +1 -1
- package/dist/algorithms/FlowField.js +13 -0
- package/dist/algorithms/FluidSimulation.d.ts +21 -3
- package/dist/algorithms/FluidSimulation.d.ts.map +1 -1
- package/dist/algorithms/FluidSimulation.js +40 -0
- package/dist/algorithms/GraphAlgorithms.d.ts +1 -1
- package/dist/algorithms/GraphAlgorithms.d.ts.map +1 -1
- package/dist/algorithms/GraphAlgorithms.js +87 -15
- package/dist/algorithms/OutlierDetection.d.ts +4 -0
- package/dist/algorithms/OutlierDetection.d.ts.map +1 -1
- package/dist/algorithms/OutlierDetection.js +15 -3
- package/dist/algorithms/ParticleSystem.d.ts +46 -3
- package/dist/algorithms/ParticleSystem.d.ts.map +1 -1
- package/dist/algorithms/ParticleSystem.js +118 -15
- package/dist/components/HexGrid.d.ts +32 -2
- package/dist/components/HexGrid.d.ts.map +1 -1
- package/dist/components/HexGrid.js +5456 -25
- package/dist/components/NarrationOverlay.d.ts +2 -2
- package/dist/components/NarrationOverlay.d.ts.map +1 -1
- package/dist/components/NarrationOverlay.js +1 -1
- package/dist/components/debug/PoolStatsOverlay.d.ts +6 -0
- package/dist/components/debug/PoolStatsOverlay.d.ts.map +1 -0
- package/dist/components/debug/PoolStatsOverlay.js +18 -0
- package/dist/components/index.d.ts +3 -2
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +1 -1
- package/dist/lib/html-utils.d.ts +2 -0
- package/dist/lib/html-utils.d.ts.map +1 -0
- package/dist/lib/html-utils.js +7 -0
- package/dist/lib/logger.d.ts +20 -0
- package/dist/lib/logger.d.ts.map +1 -0
- package/dist/lib/logger.js +9 -0
- package/dist/lib/narration.d.ts +5 -0
- package/dist/lib/narration.d.ts.map +1 -1
- package/dist/lib/narration.js +19 -0
- package/dist/lib/stats-tracker.d.ts +2 -0
- package/dist/lib/stats-tracker.d.ts.map +1 -1
- package/dist/lib/stats-tracker.js +13 -0
- package/dist/lib/theme-colors.d.ts +9 -0
- package/dist/lib/theme-colors.d.ts.map +1 -1
- package/dist/lib/theme-colors.js +18 -1
- package/dist/math/Matrix4.d.ts +179 -2
- package/dist/math/Matrix4.d.ts.map +1 -1
- package/dist/math/Matrix4.js +528 -8
- package/dist/math/Quaternion.d.ts +69 -0
- package/dist/math/Quaternion.d.ts.map +1 -1
- package/dist/math/Quaternion.js +439 -0
- package/dist/math/SpatialIndex.d.ts +32 -13
- package/dist/math/SpatialIndex.d.ts.map +1 -1
- package/dist/math/SpatialIndex.js +239 -33
- 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
|
|
9
|
-
export declare function paretoRatio(values: number[], topFraction
|
|
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":"AAAA,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,YAAY,GAAG,YAAY,GAAG,QAAQ,CAAC;IAClD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAWxD;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAUnD;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,OAAO,
|
|
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;
|
|
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
|
|
5
|
-
diffusion
|
|
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
|
|
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;
|
|
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,
|
|
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
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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
|
|
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;
|
|
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:
|
|
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
|
|
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
|
-
|
|
17
|
-
|
|
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;
|
|
1
|
+
{"version":3,"file":"ParticleSystem.d.ts","sourceRoot":"","sources":["../../src/algorithms/ParticleSystem.ts"],"names":[],"mappings":"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"}
|