# Mandelbrot Fractal - SDL3 Example **π Mandelbrot set visualization** with basic color cycling and zoom animation. Real-time fractal rendering that adapts to different ESP32 display sizes: - **Resolution Adaptation** - Scales to different display sizes - **Color Cycling** - Simple color schemes that change over time - **Progressive Rendering** - Renders in strips to maintain responsiveness - **Auto-Zoom** - Visits different areas of the fractal automatically - **Fixed-Point Math** - Optimized for embedded systems  ## β¨ Features ### π¨ Dynamic Color Schemes 1. **Fire** - Red β Orange β Yellow gradient 2. **Ocean** - Blue β Cyan β White gradient 3. **Sunset** - Purple β Pink β Orange gradient 4. **Psychedelic** - Rapid rainbow cycling ### π Exploration Journey Automatically visits famous Mandelbrot locations: - **Main Bulb** (-0.7, 0.0) - Classic view - **Spiral Region** (-0.8, 0.156) - Beautiful spirals - **Top Detail** (-0.16, 1.04) - Intricate patterns - **Right Side** (0.3, 0.5) - Edge details - **Left Spike** (-1.25, 0.02) - Sharp formations - **Feather Detail** (-0.235125, 0.827215) - Fine structures - **Upper Connection** (-0.4, 0.6) - Bulb connections ### β‘ Performance Optimizations - **Progressive Rendering** - Renders 1/4 of screen per frame for 60 FPS - **Adaptive Resolution** - Automatically optimizes for display size - **Efficient Math** - Fast complex number calculations - **Memory Efficient** - Minimal heap usage ## π Quick Start ### Create Project from Example ```bash # Create Mandelbrot project from component registry idf.py create-project-from-example "georgik/sdl:mandelbrot" cd mandelbrot # Configure board and build idf.py menuconfig # Select your board in "ESP-BSP SDL Configuration" idf.py build flash monitor ``` ### Alternative: Using ESPBrew ```bash # Multi-board build manager with TUI espbrew . # Interactive mode - select boards and press 'b' espbrew --cli-only . # Automatic mode - builds all detected boards ``` ### Legacy Board Selection (if not using new ESP-BSP-SDL) ```bash # M5 Atom S3 (128Γ128, No PSRAM) - Default idf.py -D SDKCONFIG_DEFAULTS="sdkconfig.defaults.m5_atom_s3" build flash monitor # ESP32-S3-BOX-3 (320Γ240, OCTAL PSRAM) idf.py -D SDKCONFIG_DEFAULTS="sdkconfig.defaults.esp-box-3" build flash monitor # M5Stack CoreS3 (320Γ240, QUAD PSRAM) idf.py -D SDKCONFIG_DEFAULTS="sdkconfig.defaults.m5stack_core_s3" build flash monitor # M5Stack Tab5 (1280Γ720, 32MB PSRAM, ESP32-P4) idf.py -D SDKCONFIG_DEFAULTS="sdkconfig.defaults.m5stack_tab5" build flash monitor # ESP32-P4 RISC-V (up to 1280Γ800, 32MB PSRAM) idf.py -D SDKCONFIG_DEFAULTS="sdkconfig.defaults.esp32_p4_function_ev_board" build flash monitor # Universal: ANY ESP32 DevKit + configurable display idf.py -D SDKCONFIG_DEFAULTS="sdkconfig.defaults.esp_bsp_generic" menuconfig # Configure your hardware idf.py -D SDKCONFIG_DEFAULTS="sdkconfig.defaults.esp_bsp_generic" build flash monitor # DevKit testing (virtual display, no physical display needed) idf.py -D SDKCONFIG_DEFAULTS="sdkconfig.defaults.esp_bsp_devkit" build flash monitor ``` ### First Time Setup (Default Board) ```bash # Uses M5 Atom S3 by default idf.py -D SDKCONFIG_DEFAULTS="sdkconfig.defaults.m5_atom_s3" build flash monitor ``` ### Using Component Registry ```bash idf.py create-project-from-example "georgik/sdl:mandelbrot" cd mandelbrot idf.py -D SDKCONFIG_DEFAULTS="sdkconfig.defaults.m5_atom_s3" build flash monitor ``` ## π±οΈ Supported Boards | Board | Architecture | Display | PSRAM | Key Features | |-------|-------------|---------|-------|--------------| | **`esp_bsp_generic`** | **Any ESP32** | **Configurable** | **Configurable** | **π§ Universal DevKit + Display** | | `m5_atom_s3` | ESP32-S3 (Xtensa) | 128Γ128 GC9A01 | None | β **Working** - Default board | | `m5stack_core_s3` | ESP32-S3 (Xtensa) | 320Γ240 ILI9341 | QUAD | Touch interface, large display | | `m5stack_tab5` | **ESP32-P4 (RISC-V)** | 1280Γ720 IPS via MIPI-DSI | 32MB | 5-inch display, GT911 touch | | `esp32_p4_function_ev` | **ESP32-P4 (RISC-V)** | up to 1280Γ800 | 32MB | PPA, H264, MIPI interfaces | | `esp32_s3_lcd_ev` | ESP32-S3 (Xtensa) | Multiple LCD types | 16MB OCTAL | Flexible interface support | | `esp32_s3_eye` | ESP32-S3 (Xtensa) | 240Γ240 circular | 8MB OCTAL | Camera + microphone | | `esp32_s3_korvo_2` | ESP32-S3 (Xtensa) | LCD + Camera | OCTAL | Audio focus, dual microphones | | `esp_bsp_devkit` | Any ESP32 | Virtual 240Γ320 | Configurable | LEDs/buttons, no display | | `esp_box_3` | ESP32-S3 (Xtensa) | 320Γ240 ILI9341 | OCTAL | β **Working** | ## π± Display Adaptation Examples | Board | Resolution | Detail Level | Colors | Performance | |-------|------------|--------------|---------|-------------| | M5 Atom S3 | 128Γ128 | Good | Full HSV | 60 FPS | | M5Stack CoreS3 | 320Γ240 | Excellent | Full HSV | 60 FPS | | ESP32-S3-BOX-3 | 320Γ240 | Excellent | Full HSV | 60 FPS | | ESP32-P4 Function EV | 1280Γ800 | Incredible | Full HSV | 15 FPS | ## ποΈ Visual Indicators ### Zoom Level Bar (Top-Right) - White bars showing current zoom level - More bars = deeper zoom (up to 20 levels) ### Color Scheme Indicator (Bottom-Right) - **Red Square** - Fire scheme - **Blue Square** - Ocean scheme - **Purple Square** - Sunset scheme - **Rainbow** - Psychedelic scheme ### Frame Counter (Bottom-Left) - Gray dots showing animation progress - Resets every 16 frames ## π¬ Technical Details ### Mandelbrot Algorithm ```c // For each pixel (cx, cy) in complex plane: double x = 0.0, y = 0.0; int iterations = 0; while (iterations < MAX_ITERATIONS && (x*x + y*y) < 4.0) { double temp = x*x - y*y + cx; y = 2*x*y + cy; x = temp; iterations++; } ``` ### Color Generation ```c // HSV to RGB conversion for smooth gradients Color hsv_to_rgb(float hue, float saturation, float value) // Multiple color schemes based on iteration count Color mandelbrot_color(int iterations, double color_offset) ``` ### Animation Timeline - **Color Cycling**: Continuous gradient shift - **Zoom Progress**: Every 100 frames zoom deeper - **Location Change**: Every 600 frames jump to new location - **Full Cycle**: ~1 hour to visit all locations ## πΎ Memory Usage - **Stack**: 32KB thread stack - **Heap**: Minimal (only state variables) - **ROM**: ~45KB code + mathematical constants - **RAM**: Progressive rendering keeps memory usage constant ## π Mathematical Beauty The Mandelbrot set demonstrates: - **Fractal Geometry** - Infinite detail at all scales - **Complex Dynamics** - Beautiful patterns from zΒ² + c iteration - **Computational Art** - Mathematics creating visual beauty - **Chaos Theory** - Order and chaos at fractal boundaries - **Universal Patterns** - Self-similarity across scales ### Famous Properties - **Self-Similar** - Patterns repeat at different scales - **Infinitely Complex** - Zoom reveals endless detail - **Mathematically Pure** - Simple formula, infinite complexity - **Universally Beautiful** - Appeals across cultures ## π Extensions Easy to enhance with: - **Touch Interaction** - Tap to zoom into specific areas - **Julia Sets** - Switch between Mandelbrot and Julia fractals - **Custom Color Maps** - User-defined color schemes - **Zoom Speed Control** - Variable zoom rates - **Location Bookmarks** - Save favorite fractal locations - **Export Images** - Save beautiful frames to SD card ## π Performance Analysis ### Computational Complexity - **Per Pixel**: O(MAX_ITERATIONS) worst case - **Per Frame**: O(WIDTH Γ HEIGHT Γ MAX_ITERATIONS) - **Memory**: O(1) - no framebuffers stored ### Optimization Techniques - **Progressive Rendering** - Splits work across frames - **Early Bailout** - Stops iteration when divergence detected - **Integer Math** - Fixed-point arithmetic where possible - **Strip Rendering** - Processes horizontal strips for cache efficiency ## π¨ Color Science ### HSV Color Space Advantages - **Perceptual Uniformity** - Colors transition smoothly - **Easy Manipulation** - Hue shifts create natural gradients - **Rich Saturation** - Vibrant colors throughout spectrum - **Mathematical Beauty** - Color mathematics matches fractal mathematics ### Scheme Design - **Fire**: Mimics thermal radiation spectrum - **Ocean**: Evokes water depth and clarity - **Sunset**: Natural atmospheric color progression - **Psychedelic**: Maximum color diversity and contrast ## π§ Troubleshooting ### Slow Performance - Progressive rendering maintains 60 FPS UI even with slow computation - Larger displays automatically reduce detail for performance - Monitor frame rates in serial output ### Color Issues - Color schemes cycle automatically every ~2.5 minutes - All schemes use full RGB range for maximum vibrancy - Black areas indicate points inside the Mandelbrot set ### Memory Problems - Very low memory usage due to progressive rendering - No large buffers allocated - PSRAM not required but improves responsiveness --- Explore the infinite beauty of mathematical fractals, perfectly adapted to your ESP32 development board! πβ¨ *"Mathematics is the art of giving the same name to different things."* - Henri PoincarΓ©
To create a project from this example, run:
idf.py create-project-from-example "georgik/sdl=3.3.0~7:mandelbrot"