@prachwal/mandelbrot-generator
Version:
Professional Mandelbrot fractal generator with TypeScript support, interactive web interface, and multiple output formats
111 lines • 3.61 kB
JavaScript
/**
* @fileoverview Central fractal engine and algorithm registry
* @module FractalEngine
*/
/**
* Central registry and manager for all fractal algorithms
* Provides plugin-like architecture for adding new fractals
*/
export class FractalEngine {
constructor() {
this.algorithms = new Map();
this.defaultAlgorithm = null;
}
/**
* Register a new fractal algorithm
* @param algorithm - Fractal algorithm instance
*/
register(algorithm) {
this.algorithms.set(algorithm.id, algorithm);
// Set first registered algorithm as default
if (!this.defaultAlgorithm) {
this.defaultAlgorithm = algorithm.id;
}
}
/**
* Get algorithm by ID
* @param id - Algorithm identifier
* @returns Fractal algorithm instance
*/
getAlgorithm(id) {
return this.algorithms.get(id);
}
/**
* Get default algorithm
*/
getDefaultAlgorithm() {
return this.defaultAlgorithm ? this.algorithms.get(this.defaultAlgorithm) : undefined;
}
/**
* Get all available algorithms
* @returns Array of algorithm metadata
*/
getAllAlgorithms() {
return Array.from(this.algorithms.values()).map(alg => ({
id: alg.id,
name: alg.name,
description: alg.description,
category: this.categorizeAlgorithm(alg),
defaultConfig: alg.defaultConfig,
parameterSchema: alg.parameterSchema
}));
}
/**
* Generate fractal data using specified algorithm
* @param algorithmId - Algorithm to use
* @param config - Generation configuration
* @returns Generated image data
*/
generateFractal(algorithmId, config) {
const algorithm = this.algorithms.get(algorithmId);
if (!algorithm) {
throw new Error(`Unknown algorithm: ${algorithmId}`);
}
// Validate config
if (!algorithm.validateConfig(config)) {
throw new Error(`Invalid configuration for algorithm: ${algorithmId}`);
}
return algorithm.generateData(config);
}
/**
* Get iteration result for single point
* @param algorithmId - Algorithm to use
* @param point - Point in complex plane
* @param config - Algorithm configuration
*/
iteratePoint(algorithmId, point, config) {
const algorithm = this.algorithms.get(algorithmId);
if (!algorithm) {
throw new Error(`Unknown algorithm: ${algorithmId}`);
}
return algorithm.iterate(point, config);
}
/**
* Get merged configuration with algorithm defaults
* @param algorithmId - Algorithm ID
* @param userConfig - User-provided configuration
* @returns Merged configuration
*/
getMergedConfig(algorithmId, userConfig) {
const algorithm = this.algorithms.get(algorithmId);
if (!algorithm) {
throw new Error(`Unknown algorithm: ${algorithmId}`);
}
return {
...algorithm.defaultConfig,
...userConfig
};
}
categorizeAlgorithm(algorithm) {
// Simple categorization based on algorithm name
// Could be made more sophisticated with proper metadata
if (algorithm.id.includes('newton'))
return 'newton';
if (algorithm.id.includes('ifs') || algorithm.id.includes('barnsley'))
return 'ifs';
return 'escape_time';
}
}
// Global instance
export const fractalEngine = new FractalEngine();
//# sourceMappingURL=fractal-engine.js.map