The Mandelbrot Set

The Mandelbrot set in the complex plane with smooth navy, teal, ivory, and amber escape-time coloring

If we plot the escape times for points in this complex plane series, we end up with one of the most famous visualizations in mathematics.

zn+1=zn2+c,i=−1z_{n+1} = z_n^2 + c, \quad{i = \sqrt{-1}}

World overview

If we consider an escape radius of 2, the world also has a radius of 2, since any points starting outside of the world diverge right away.

Full Mandelbrot set world overview within the escape radius of 2 from -2.2 to 2.2

The set lies roughly on the real axis between −2 and 0.5, with the imaginary extent reaching about ±1.25.

The main cardioid is centered near the origin, with the period-2 bulb to its left at about −1.

Mandelbrot set overview centered on the main cardioid and period-2 bulb from x = -2.2 to 0.8

Mandelbrot set equation

The equation using complex numbers is:

zn+1=zn2+cz_{n+1} = z_n^2 + c

z is a complex number composed of real and imaginary parts:

z=x+iy,i=−1z = x + iy, \quad{i = \sqrt{-1}}

Fractal images are generated by varying the value of c:

c=(x0,y0)c = (x_0, y_0)

If we expand the complex squaring, the iteration reduces to:

xn+1=xn2−yn2+x0x_{n+1} = x_n^2 - y_n^2 + x_0
yn+1=2xnyn+y0y_{n+1} = 2x_ny_n + y_0

A common way of exploring fractals is by putting different starting (x0, y0) numbers into the equation and making note of whether the series:

  • diverges to infinity or stays within a limit
  • if the series diverges, we make note of:
    • the number of iterations until reaching the escape radius
    • the distance from zero (0, 0) during the escape

Sub-structures

Beyond the main cardioid and bulbs, the fractal boundary is filled with spirals, scepters, dendrites, and miniature copies of the entire set. Zooming into its valleys and filaments uncovers new structures at every scale.

Overview

At shallow magnifications, every pixel runs its own independent escape-time loop inside a WebGL fragment shader using native 32-bit GPU floats, with analytic checks that skip the interior of the main cardioid and period-2 bulb.

Fibonacci Bulb Wakes

Along the upper shoulder between the period-1 cardioid and the period-2 bulb, primary bulbs and their branching antenna wakes follow the Fibonacci sequence 1, 2, 3, 5, 8, 13, and 21, with the largest wake between periods 1 and 2 belonging to the period-3 bulb.

Fibonacci Bulb Wakes — Along the upper shoulder between the period-1 cardioid and the period-2 bulb, primary bulbs and their branching antenna wakes follow the Fibonacci sequence 1, 2, 3, 5, 8, 13, and 21, with the largest wake between periods 1 and 2 belonging to the period-3 bulb.
span 1.00e+01,024 iter max · Ready

Upside-Down 25-Spoke Seahorse

Centred at −0.743030 + 0.126433i at a 1.21 × 10⁻² vertical span (191× magnification), smooth escape-time contours outline the 25 spokes of a single inverted seahorse—two groups of 12 spokes plus one link to the main cardioid—meeting at a central Misiurewicz hub.

Upside-Down 25-Spoke Seahorse — Centred at −0.743030 + 0.126433i at a 1.21 × 10⁻² vertical span (191× magnification), smooth escape-time contours outline the 25 spokes of a single inverted seahorse—two groups of 12 spokes plus one link to the main cardioid—meeting at a central Misiurewicz hub.
span 1.61e-21,024 iter max · Ready

Seahorse Valley

A close-up of the curled branches between the main cardioid and the period-2 bulb, centred near −0.747 + 0.108i.

Seahorse Valley — A close-up of the curled branches between the main cardioid and the period-2 bulb, centred near −0.747 + 0.108i.
span 8.00e-31,024 iter max · Ready

Seahorse Valley Spiral Sanctuary

Counter-rotating seahorse tails between the main cardioid and the period-2 bulb, centred near −0.747 + 0.108i at a 5.8 × 10⁻³ vertical span, separating deep navy water from warm ivory and amber curls.

Seahorse Valley Spiral Sanctuary — Counter-rotating seahorse tails between the main cardioid and the period-2 bulb, centred near −0.747 + 0.108i at a 5.8 × 10⁻³ vertical span, separating deep navy water from warm ivory and amber curls.
span 7.73e-31,024 iter max · Ready

Seahorse Tail Misiurewicz Endpoint

Centred at −0.7435669 + 0.1314023i at a 1.72 × 10⁻³ vertical span (1,345× magnification), a seahorse tail winds into its terminal Misiurewicz point, where preperiodic orbits form an asymptotic logarithmic spiral.

Seahorse Tail Misiurewicz Endpoint — Centred at −0.7435669 + 0.1314023i at a 1.72 × 10⁻³ vertical span (1,345× magnification), a seahorse tail winds into its terminal Misiurewicz point, where preperiodic orbits form an asymptotic logarithmic spiral.
span 2.29e-31,024 iter max · Ready

Elephant Valley

The region near 0.3 on the real axis, with trunk-like spiral structures.

Elephant Valley — The region near 0.3 on the real axis, with trunk-like spiral structures.
span 1.33e-11,024 iter max · Ready

Antenna

The tip of the antenna at −2.0 — Misiurewicz point.

Antenna — The tip of the antenna at −2.0 — Misiurewicz point.
span 8.00e-21,024 iter max · Ready

Feigenbaum Cascade

Follow the shrinking chain of bulbs as their periods double from 2 to 4, 8, 16, and beyond. Zoom toward the point near −1.401155 on the real axis to explore where the chain accumulates.

Feigenbaum Cascade — Follow the shrinking chain of bulbs as their periods double from 2 to 4, 8, 16, and beyond. Zoom toward the point near −1.401155 on the real axis to explore where the chain accumulates.
span 8.67e-21,024 iter max · Ready

Double Spiral Valley

On the period-2 bulb side of Seahorse Valley, two intertwined arms wind into a shared centre. Zoom in to find smaller curls repeating along their branching edges.

Double Spiral Valley — On the period-2 bulb side of Seahorse Valley, two intertwined arms wind into a shared centre. Zoom in to find smaller curls repeating along their branching edges.
span 2.40e-31,024 iter max · Ready

Double Spiral Nexus

Centred near −0.77568377 + 0.13646737i at a 1.2 × 10⁻³ vertical span, paired logarithmic spirals wind into a shared preperiodic core on the period-2 bulb side of Seahorse Valley.

Double Spiral Nexus — Centred near −0.77568377 + 0.13646737i at a 1.2 × 10⁻³ vertical span, paired logarithmic spirals wind into a shared preperiodic core on the period-2 bulb side of Seahorse Valley.
span 1.60e-31,024 iter max · Ready

Triple Spiral Valley

Near the upper period-3 bulb, the boundary curls into spirals with three arms. Zoom in to follow the smaller spirals along each branch.

Triple Spiral Valley — Near the upper period-3 bulb, the boundary curls into spirals with three arms. Zoom in to follow the smaller spirals along each branch.
span 5.87e-31,024 iter max · Ready

Quad Spiral Valley

Near the upper period-4 bulb, the filaments form spirals with four arms. Follow each arm outward to see it branch into smaller spirals, adding another turn to the patterns of Double and Triple Spiral Valley.

Quad Spiral Valley — Near the upper period-4 bulb, the filaments form spirals with four arms. Follow each arm outward to see it branch into smaller spirals, adding another turn to the patterns of Double and Triple Spiral Valley.
span 5.33e-31,024 iter max · Ready

Mini Mandelbrot

Near −1.75 on the real axis, a miniature Mandelbrot set appears among delicate filaments. This period-3 island repeats the familiar cardioid and bulbs, with its own valleys waiting to be explored.

Mini Mandelbrot — Near −1.75 on the real axis, a miniature Mandelbrot set appears among delicate filaments. This period-3 island repeats the familiar cardioid and bulbs, with its own valleys waiting to be explored.
span 8.67e-21,024 iter max · Ready

Scepter Valley

Also known as Seahorse Valley West, this region lies between the period-2 and period-4 bulbs. Its curled filaments sprout long, branching spikes that resemble ornate scepters.

Scepter Valley — Also known as Seahorse Valley West, this region lies between the period-2 and period-4 bulbs. Its curled filaments sprout long, branching spikes that resemble ornate scepters.
span 1.20e-31,024 iter max · Ready

Deep zoom

Once the viewport narrows past 10-7, single-precision float32 shaders lose subpixel spacing. These views step up to compensated double-single (dsAdd / dsMul) Dekker-split shaders and 53-bit significand float64 workers to keep filaments razor-sharp down to the 10-15 IEEE 754 precision floor.

Simply Connected Zigzag Tail Path

Centred at −0.74364990 + 0.13188204i at a 5.54 × 10⁻⁴ vertical span (4,169× magnification), a single continuous filament zigzags through successive 25-spoke hubs toward the central spiral without forming closed loops.

Simply Connected Zigzag Tail Path — Centred at −0.74364990 + 0.13188204i at a 5.54 × 10⁻⁴ vertical span (4,169× magnification), a single continuous filament zigzags through successive 25-spoke hubs toward the central spiral without forming closed loops.
span 7.38e-41,024 iter max · Ready

Double-Hook Dendritic Gateway

Centred at −0.74364085 + 0.13182733i at a 9.05 × 10⁻⁵ vertical span (25,497× magnification), two opposing dendritic seahorse tails curve inward to form the outer double-hook ring around a central satellite.

Double-Hook Dendritic Gateway — Centred at −0.74364085 + 0.13182733i at a 9.05 × 10⁻⁵ vertical span (25,497× magnification), two opposing dendritic seahorse tails curve inward to form the outer double-hook ring around a central satellite.
span 1.21e-41,024 iter max · Ready

Double-spiral Julia Medallion

Near a miniature Mandelbrot's Seahorse Valley, curling filaments form a pattern resembling a Julia set. Explore the paired spirals and the smaller curls along their edges.

Double-spiral Julia Medallion — Near a miniature Mandelbrot's Seahorse Valley, curling filaments form a pattern resembling a Julia set. Explore the paired spirals and the smaller curls along their edges.
span 1.20e-51,024 iter max · Ready

Elephant’s Trunk

Deeper inside Elephant Valley, long curved branches curl into tightly wound tips. Follow a trunk to find smaller versions of the same pattern along its sides.

Elephant’s Trunk — Deeper inside Elephant Valley, long curved branches curl into tightly wound tips. Follow a trunk to find smaller versions of the same pattern along its sides.
span 2.97e-51,024 iter max · Ready

Scepter Crown

Centred near −1.25066 + 0.02012i at a 5.2 × 10⁻⁴ vertical span inside Scepter Valley, spiked arches and counter-rotating double spirals link into an ornate diagonal crown.

Scepter Crown — Centred near −1.25066 + 0.02012i at a 5.2 × 10⁻⁴ vertical span inside Scepter Valley, spiked arches and counter-rotating double spirals link into an ornate diagonal crown.
span 6.93e-41,024 iter max · Ready

Snowflake

Fine, feathery branches form clusters resembling snowflakes near −0.658448 − 0.466852i. Zoom in to find the pattern repeating along smaller branches.

Snowflake — Fine, feathery branches form clusters resembling snowflakes near −0.658448 − 0.466852i. Zoom in to find the pattern repeating along smaller branches.
span 8.67e-41,024 iter max · Ready

Concentric Satellite Crowns

Centred at −0.743643135 + 0.131825963i at a 1.10 × 10⁻⁵ vertical span (210,350× magnification), concentric crowns of seahorse tails double in count with each inward ring around a distorted period-28 satellite minibrot.

Concentric Satellite Crowns — Centred at −0.743643135 + 0.131825963i at a 1.10 × 10⁻⁵ vertical span (210,350× magnification), concentric crowns of seahorse tails double in count with each inward ring around a distorted period-28 satellite minibrot.

Second-Order Satellite Double Spirals

At 3.70 × 10⁻⁸ vertical span (6.24 × 10⁷× magnification) inside the satellite’s own Seahorse Valley, double spirals sprout seahorse-tail appendices along their outer rims and harbour second-order satellites.

Second-Order Satellite Double Spirals — At 3.70 × 10⁻⁸ vertical span (6.24 × 10⁷× magnification) inside the satellite’s own Seahorse Valley, double spirals sprout seahorse-tail appendices along their outer rims and harbour second-order satellites.

Cantor-Like Embedded Julia Island

At 3.85 × 10⁻¹¹ vertical span (6.00 × 10¹⁰× magnification) in the outer appendices of the satellite, an embedded Julia set that resembles a disconnected Cantor dust at low iterations resolves into a single connected filigree island.

Cantor-Like Embedded Julia Island — At 3.85 × 10⁻¹¹ vertical span (6.00 × 10¹⁰× magnification) in the outer appendices of the satellite, an embedded Julia set that resembles a disconnected Cantor dust at low iterations resolves into a single connected filigree island.

Elephant’s Trunk Filaments

At 10⁻¹⁰ vertical span inside an Elephant Valley spiral, compensated double-single and perturbation passes resolve fine concentric rings around a buried miniature spiral.

Elephant’s Trunk Filaments — At 10⁻¹⁰ vertical span inside an Elephant Valley spiral, compensated double-single and perturbation passes resolve fine concentric rings around a buried miniature spiral.

Labyrinthine zoom

Along these labyrinthine corridors past 10-16, standard 64-bit numbers can no longer tell neighboring pixels apart, and running custom big-number math for every pixel would bring the browser to a crawl. Instead, the renderer uses perturbation theory: it traces a single high-precision reference orbit through the center of the frame and measures how surrounding pixels drift from that path, using Bivariate Linear Approximation (BLA) jump tables to skip linear stretches and multi-center rebasing to repair local glitches.

Seahorse Spiral Island Nucleus

At 6.50 × 10⁻²¹ vertical span around the period-8007 nucleus at −0.7436438870371587 + 0.1318259042053120i, four self-similar spiral arms and nested satellite medallions converge on the core of the embedded Julia island.

Seahorse Spiral Island Nucleus — At 6.50 × 10⁻²¹ vertical span around the period-8007 nucleus at −0.7436438870371587 + 0.1318259042053120i, four self-similar spiral arms and nested satellite medallions converge on the core of the embedded Julia island.

Seahorse Labyrinthine Spiral

At 10⁻²² span deep inside Seahorse Valley, standard 64-bit floats collapse into flat blocks while a single high-precision reference orbit and Bivariate Linear Approximation keep every filament sharp.

Seahorse Labyrinthine Spiral — At 10⁻²² span deep inside Seahorse Valley, standard 64-bit floats collapse into flat blocks while a single high-precision reference orbit and Bivariate Linear Approximation keep every filament sharp.

Misiurewicz Dendrite Tip at i

Zoomed to 10⁻³⁰ around the preperiodic Misiurewicz point c = i, self-similar lightning branches twist at fixed angles around the terminal tip of the upper filament.

Misiurewicz Dendrite Tip at i — Zoomed to 10⁻³⁰ around the preperiodic Misiurewicz point c = i, self-similar lightning branches twist at fixed angles around the terminal tip of the upper filament.

Sixteen-Ray Crystalline Pine Compass

At 1.02 × 10⁻³⁴ vertical span on the real axis near −1.4303584327, second-order inflection around a period-70 nucleus doubles an eight-branch Koch candelabrum into a sixteen-ray crystalline compass rose.

Sixteen-Ray Crystalline Pine Compass — At 1.02 × 10⁻³⁴ vertical span on the real axis near −1.4303584327, second-order inflection around a period-70 nucleus doubles an eight-branch Koch candelabrum into a sixteen-ray crystalline compass rose.

Transfinite zoom

Crossing 10-38 exhausts the exponent range of standard 32-bit floats. Beyond this limit, the engine pairs a WebAssembly libmpdec arbitrary-precision decimal runtime with detached-exponent floatExp perturbation math and analytic hyperbolic interior certificates, evaluating thousands of iterations per pixel without underflowing.

Stained-Glass Cathedral Rose Window

At 2.03 × 10⁻⁴² vertical span inside Seahorse Valley, twenty-four radial filigree spokes and an eight-fold ring of golden crescents frame a nested central oculus.

Stained-Glass Cathedral Rose Window — At 2.03 × 10⁻⁴² vertical span inside Seahorse Valley, twenty-four radial filigree spokes and an eight-fold ring of golden crescents frame a nested central oculus.

Quad-Spiral Octagonal Star Sanctuary

At 5.18 × 10⁻⁵⁴ vertical span inside Quad Spiral Valley, second-order inflection around a buried Quad Spiral nucleus resolves a multi-ringed octagonal starburst sanctuary of eight radial spiral arms.

Quad-Spiral Octagonal Star Sanctuary — At 5.18 × 10⁻⁵⁴ vertical span inside Quad Spiral Valley, second-order inflection around a buried Quad Spiral nucleus resolves a multi-ringed octagonal starburst sanctuary of eight radial spiral arms.

Western Needle at 10⁻⁶⁰

Past the 10⁻³⁸ hardware float exponent limit near the western antenna tip at −2, detached-exponent floatExp arithmetic and the WebAssembly libmpdec kernel trace filaments across 60 orders of magnitude.

Western Needle at 10⁻⁶⁰ — Past the 10⁻³⁸ hardware float exponent limit near the western antenna tip at −2, detached-exponent floatExp arithmetic and the WebAssembly libmpdec kernel trace filaments across 60 orders of magnitude.

Transfinite Antenna Boundary at 10⁻¹⁰⁰

A googol-scale (10¹⁰⁰×) magnification along the off-axis boundary near c = −2, where 256-digit libmpdec reference orbits and full-range GPU perturbation resolve sub-float32 geometry.

Transfinite Antenna Boundary at 10⁻¹⁰⁰ — A googol-scale (10¹⁰⁰×) magnification along the off-axis boundary near c = −2, where 256-digit libmpdec reference orbits and full-range GPU perturbation resolve sub-float32 geometry.

Octogintillion Scepter Star-Heart

At 2.86 × 10⁻¹¹¹ vertical span inside Scepter Valley, concentric scepter coronas and radiant filigree rings surround a buried satellite minibrot beyond 10⁻¹⁰⁰.

Octogintillion Scepter Star-Heart — At 2.86 × 10⁻¹¹¹ vertical span inside Scepter Valley, concentric scepter coronas and radiant filigree rings surround a buried satellite minibrot beyond 10⁻¹⁰⁰.

Fractal coloring

Escape time

Given a starting point (x0, y0), we can give each point a color by calculating the number of iterations it takes for the series to diverge, and the distance from zero when escaping.

const ESCAPE_THRESHOLD = 4;
const MAX_ITERATIONS = 1024;

function iterateUntilEscape(x0, y0) {
  let x = 0, y = 0;
  let numIterations = 0;
  while ((x*x + y*y <= ESCAPE_THRESHOLD) &&
         (numIterations < MAX_ITERATIONS)) {
    const x_next = x*x - y*y + x0;
    const y_next = 2*x*y + y0;
    x = x_next;
    y = y_next;
    numIterations++;
  }
  const escaped = x*x + y*y > ESCAPE_THRESHOLD;
  return [numIterations, x*x + y*y, escaped];
}

We'll set the RGBA colors of every pixel in the image based on the number of iterations. Here's an example of a fiery yellow/red color palette by scaling just the green and alpha values of each pixel.

function getColor(numIterations) {
  return [
    255,                // red
    numIterations * 7,  // green
    0,                  // blue
    numIterations * 15  // alpha
  ];
}

Here's a general function for drawing fractals onto canvas elements. Changing the iterateUntilEscape function will change the drawn fractal.

function drawFractal(canvasEl, xRange, yRange, getColor) {
  const canvasWidth = canvasEl.width;
  const canvasHeight = canvasEl.height;
  const context = canvasEl.getContext('2d');
  const canvasImageData =
    context.createImageData(canvasWidth, canvasHeight);
  const image = canvasImageData.data;
  for (let i = 0; i < canvasHeight; i++) {
    for (let j = 0; j < canvasWidth; j++) {
      const x0 = xRange[0] +
        j*(xRange[1] - xRange[0]) / canvasWidth;
      const y0 = yRange[0] +
        i*(yRange[1] - yRange[0]) / canvasHeight;
      const [numIterations, escapeDistance, escaped] =
        iterateUntilEscape(x0, y0);
      const pixelIndex = 4*i*canvasWidth + 4*j;
      if (escaped) {
        const mu = getMu(numIterations, escapeDistance);
        const pixels = getColor({ numIterations, mu });
        for (let p = 0; p < 4; p++) {
          image[pixelIndex + p] = pixels[p];
        }
      }
    }
  }
  context.putImageData(canvasImageData, 0, 0);
}

Here's the main cardioid colored based on number of iterations alone.

Main cardioid of the Mandelbrot set colored using discrete integer iteration counts, showing contour bands

By considering escape distances on a logarithmic scale, we can use this extra information to smooth the color transitions.

const ESCAPE_RADIUS = 2;

function getMu(numIterations, distanceSquared) {
  return numIterations + 1 -
    Math.log(0.5 * Math.log(distanceSquared)) /
    Math.log(ESCAPE_RADIUS);
}

function getColor(mu) {
  return [ 255, mu * 7, 0, mu * 15 ];
}

Here's the same image with continuous escape counts and a smooth, repeating navy, teal, ivory, and amber palette. Extra iterations after escape soften contour seams, while a 1,024-iteration budget reveals finer boundary detail.

Main cardioid of the Mandelbrot set colored with continuous logarithmic escape-time smoothing

Field & normal shading

Escape-time palettes only read how quickly an orbit leaves the escape disk, discarding the angle at which it exits and how fast neighboring orbits diverge. Incorporating the escaped coordinate zn and its running complex derivative dzn/dc turns the exterior into a coordinate field with equipotential contours, external-ray cells, and three-dimensional surface relief.

Modulating the continuous potential with periodic waves in both escape time and escape angle overlays equipotential rings and external-ray spokes across the 1, 2, 3, 5, 8, 13, and 21 Fibonacci bulb wakes on the upper shoulder of the main cardioid.

Fibonacci bulb wakes along the upper shoulder of the Mandelbrot cardioid colored with equipotential rings and external-ray spokes

At a higher bailout radius, partitioning each escaped point by the binary sign of its escape angle and fractional iteration level reveals the Douady-Hubbard cellular parquet mosaic spiralling into Seahorse Valley.

Douady-Hubbard binary angle decomposition parquet mosaic spiralling into Seahorse Valley

Tracking the running complex derivative alongside the orbit yields the exterior surface normal zn / z′n. Applying directional Lambertian lighting to that normal field highlights the 25 spokes of an upside-down seahorse in three-dimensional relief.

Upside-down 25-spoke seahorse illuminated with complex-derivative 3D Lambertian normal shading

Orbit traps & stripe averages

Instead of inspecting only the final iterate after escape, orbit-trap and average colorings accumulate measurements across every step of the trajectory z2, …, zn. Geometric traps record how closely an orbit approaches a target curve in the complex plane, while angular averages blend trigonometric samples along the entire path.

Measuring each orbit’s closest approach to the real or imaginary axis produces Pickover stalks that trace the single simply connected zigzag filament threading through Seahorse Valley’s 25-spoke hubs.

Pickover stalk axis orbit traps illuminating the simply connected zigzag filament in Seahorse Valley

Replacing the coordinate axes with the circle |z| = 1.25 traps orbits along a ring, weaving a glowing cellular astrolabe web across the four-armed spirals of Quad Spiral Valley.

Circular ring orbit trap at |z| = 1.25 weaving a cellular web across Quad Spiral Valley

Jussi Härkönen’s trigonometric stripe-average coloring averages sin(6 arg zn) over all escaped iterates and interpolates the final step by fractional escape count, revealing electric field streams spiralling into the terminal Misiurewicz point at c = i.

Stripe-average coloring at the terminal Misiurewicz point c = i showing spiraling electric field streams

Buddhabrot

While escape-time coloring only cares how long a point takes to escape, a Buddhabrot tracks every step along the way and brightens pixels that get visited the most. Introduced by Melinda Green, this technique—often called a Nebulabrot when it layers three orbit-density exposure tiers—combines fast, medium, and slow-escaping trajectories like astronomical false-color exposures into atmospheric purple, luminous electric sapphire, and radiant ice-white channels.

Tracing those paths fills the dark interior of the main cardioid and period-2 bulb with an ethereal lotus-like silhouette and a glowing cyan-white caustic crown along the boundary.

Ethereal celestial Buddhabrot render of the Mandelbrot set colored by orbit visit frequency in deep violet, electric sapphire, and radiant white

Along the western needle from the mini-Mandelbrot at −1.75 toward the period-2 bulb, a chain of island copies glows with electric dendrite spokes against a deep cosmic nebula.

Wide Buddhabrot view along the western needle from x = -1.86 to -1.20 showing the mini-Mandelbrot, period-doubling bulbs, and electric dendrite filaments

Across the neck between the period-2 bulb and the main cardioid, trajectories fold into symmetric rows of amethyst, cobalt, and electric cyan parabolic blades.

Buddhabrot render of curved amethyst, cobalt, and electric cyan parabolic caustic blades converging across the Seahorse Valley neck

About

All fractals on the page are interactive and rendered when they're in view. Every image can be expanded into full-screen mode using the button in its bottom-right corner. Full-screen views also display live complex-plane coordinates and let you undo camera steps or reset to the starting view.

As you zoom deeper, each canvas automatically switches to more sophisticated rendering pipelines to stay fast and avoid pixelation. Shallow views run per-pixel escape loops in 32-bit WebGL fragment shaders.

Zooming past 10-7 switches to compensated double-single shaders and 64-bit workers. Beyond 10-16, the renderer switches to perturbation theory and arbitrary-precision decimal math so you can keep zooming without losing detail.

Fractal image controls when hovering

  • shift + scroll mouse wheel — zoom in/out
  • double-click (or shift + double-click) — zoom in/out at cursor
  • + / − keys — zoom in/out
  • pinch — zoom in/out
  • click and drag — pan the view
  • two-finger swipe — pan the view on touchscreens
  • one-finger swipe — scroll the page
  • cmd-z — undo the last camera action
  • 0 — reset view to its initial position