Thank you for your interest in contributing! This guide will help you add new visualizations and extend the system.
- Architecture Overview
- Adding a New Visualization
- Adding Presets
- Display Options
- Performance Considerations
- Testing Guidelines
- IVisualization - Interface all visualizations implement
- VisualizationConfig - Base configuration class
- VisualizationFactory - Creates visualization instances
- VisualizationPresets - Predefined configurations
- Canvas - Main UI coordinator
VisualizationConfig (base)
├─ ShowAxes (universal)
├─ MaxIterations
└─ Tolerance
NewtonConfig : VisualizationConfig
└─ HueSpread
MandelbrotConfig : VisualizationConfig
├─ EscapeRadius
└─ Color mapping parameters
HailstoneConfig : VisualizationConfig
├─ ShowPointLabels (specific)
├─ ShowDots (specific)
└─ Path rendering parameters
Follow these steps to add a new visualization type.
using System.ComponentModel;
public class MyVisualizationConfig : VisualizationConfig
{
[Category("Algorithm")]
[Description("Your algorithm parameter")]
public int MyParameter { get; set; } = 100;
[Category("Appearance")]
[Description("Visual parameter")]
public double MyVisualSetting { get; set; } = 1.0;
public MyVisualizationConfig()
{
MaxIterations = 500;
Tolerance = 1e-8;
ShowAxes = false;
}
}public class MyVisualization : IVisualization
{
private readonly MyVisualizationConfig _config;
public string Name => "My Visualization";
public string Description => "Description of what it visualizes";
public MyVisualization(MyVisualizationConfig? config = null)
{
_config = config ?? new MyVisualizationConfig();
}
public VisualizationConfig GetConfig() => _config;
public IVisualization WithConfig(VisualizationConfig config)
{
return new MyVisualization(config as MyVisualizationConfig);
}
public Bitmap Render(int width, int height, double xRange, double yRange)
{
var bitmap = new Bitmap(width, height);
// For pixel-based rendering
RenderingHelpers.RenderFast(bitmap, xRange, yRange, (x, y) =>
{
// Your computation
return Color.FromArgb(r, g, b);
});
// Add axes if enabled
if (_config.ShowAxes)
{
RenderingHelpers.DrawAxesOnBitmap(bitmap, xRange, yRange);
}
return bitmap;
}
}Update VisualizationFactory.cs to include your new type.
Add menu integration in Canvas.cs and Canvas.Designer.cs.
Presets focus on analytical perspectives, not display options.
- Same starting conditions for comparable results
- Different analytical views - Vary iterations, scale
- Descriptive names - Indicate what the preset shows
- 3-5 presets - Don't overwhelm users
public static Dictionary<string, MyVisualizationConfig> MyVisualizationPresets = new()
{
["Default - Balanced View"] = new MyVisualizationConfig
{
MaxIterations = 500,
ShowAxes = true
},
["High Detail"] = new MyVisualizationConfig
{
MaxIterations = 2000,
ShowAxes = true
}
};ShowAxes - Available for all visualizations
- Add to toolbar for live toggling
- Use cached overlay for fractals (performance)
Add to derived configs when needed:
[Category("Display - MyVisualization Specific")]
[Description("Show custom feature")]
public bool ShowCustomFeature { get; set; } = true;Pixel-Based: Use RenderingHelpers.RenderFast() with parallel computation
Vector-Based: Use Graphics API, integrate axes into rendering
- Use LockBits for pixel manipulation
- Parallelize with
Parallel.For - Cache overlays for expensive computations
- Dispose resources properly
- Visualization renders correctly
- Presets load and apply
- Settings dialog works
- Toolbar buttons update correctly
- Axes toggle works
- No memory leaks
Check existing visualizations as examples or review the documentation files.
Thank you for contributing! 🎨✨