Julia Sets, Explained

After reading this you will know why every complex number c owns its own fractal, how the escape-time iteration z \leftarrow z^2 + c decides which points stay bounded, and how to read the difference between a fat blob, a lightning dendrite and scattered dust.

What a Julia set is

Pick a complex constant c. Then take any starting point z_0 in the plane and feed it through the rule z_{n+1} = z_n^2 + c over and over. Some starting points stay trapped near the origin forever. Others fly off to infinity. The boundary between "stays trapped" and "escapes" is the Julia set for that c.

The famous hook is the Douady rabbit at c = -0.123 + 0.745i. Its filled set breaks into three rounded lobes meeting at pinch points, and each lobe carries a smaller copy of the same three-lobe shape, down forever. Slide c a little and the rabbit becomes something else entirely. That extreme sensitivity is the whole point.

Note the difference between the Julia set (the boundary, a thin fractal curve or dust) and the filled Julia set (every point that never escapes, boundary plus interior). The explorer colours the interior black and paints the escaping outside by speed, so what you see filled is the filled set, and its edge is the Julia set proper.

When it helps and when it misleads

Use a Julia set explorer to build intuition about iterated maps, basins of attraction, and how a single parameter reshapes a dynamical system. It is the cleanest example of a system where the boundary between two fates is fractal. If you want the companion map that indexes all Julia sets at once, use the Mandelbrot Explorer.

The tool will mislead you in three ways if you forget the arithmetic. First, the picture is finite: you cap iterations, so any point that would escape after your cap looks trapped. Second, resolution hides the thinness of dust, where the true set has zero area. Third, this is a toy model of z^2 + c only. Real physical systems rarely follow that exact map, so do not read a weather forecast into a swirl.

The iteration and the escape test

Write z = x + yi and c = a + bi. Squaring a complex number gives:

z^2 + c = (x^2 - y^2 + a) + (2xy + b)\, i

Here x and y are the real and imaginary parts of the current point, a and b are the fixed parts of c, and i is the imaginary unit with i^2 = -1. The new real part is x^2 - y^2 + a; the new imaginary part is 2xy + b. You iterate this exact pair of updates.

To decide escape you watch the magnitude |z| = \sqrt{x^2 + y^2}. There is a clean threshold: once |z| \gt 2, the point is guaranteed to run to infinity and never returns. That is why the escape radius is 2, not some tuned guess.

\text{if } |z_n| \gt 2 \text{ then } |z_{n+1}| \gt |z_n| \text{ forever}

The reason: if |z| \gt 2 and |z| \ge |c|, then |z^2 + c| \ge |z|^2 - |c| \ge |z|^2 - |z| = |z|(|z| - 1) \gt |z|. Each step grows the magnitude by a factor above 1, so it diverges. To save arithmetic the tool compares x^2 + y^2 against 4 and skips the square root.

The escape-time colour of an outside point is the iteration count n at which |z_n| first exceeds 2. Small counts (fast escape) and large counts (slow escape, hugging the boundary) get different colours, which is why the bands crowd together near the edge of the set.

Worked example: reproducing the default view

Iterating the Douady rabbit at one point

Take the default parameter c = -0.123 + 0.745i, so a = -0.123 and b = 0.745. Test the starting pixel z_0 = 0.2 + 0.3i and follow the updates by hand.

  1. Start: x = 0.2,\ y = 0.3. Then x^2 + y^2 = 0.04 + 0.09 = 0.13, well under 4.
  2. Step 1: new x = 0.04 - 0.09 - 0.123 = -0.173; new y = 2(0.2)(0.3) + 0.745 = 0.865. Magnitude squared = 0.0299 + 0.7482 = 0.778.
  3. Step 2: x = (-0.173)^2 - (0.865)^2 - 0.123 = 0.0299 - 0.7482 - 0.123 = -0.841; y = 2(-0.173)(0.865) + 0.745 = -0.299 + 0.745 = 0.446. Magnitude squared = 0.707 + 0.199 = 0.906.
  4. Step 3: x = 0.707 - 0.199 - 0.123 = 0.385; y = 2(-0.841)(0.446) + 0.745 = -0.750 + 0.745 = -0.005. Magnitude squared \approx 0.148.

After three steps the magnitude squared has wandered between 0.13 and 0.906 and never crossed 4. Continue and it keeps orbiting without escaping, so this pixel belongs to the filled rabbit and the tool paints it black. Move the start to z_0 = 1.2 + 0i and step 1 already gives x = 1.44 - 0.123 = 1.317,\ y = 0.745, magnitude squared = 2.29; step 2 gives magnitude squared above 4, so that pixel escapes in 2 iterations and gets an early colour band.

The orbit of z_0 = 0.2 + 0.3i stays far below the escape line at 4, so the point is inside the filled Julia set.

Reading the shapes

The single fact that organises every picture: the Julia set is connected (one piece) exactly when c lies inside the Mandelbrot set, and it shatters into disconnected dust when c lies outside. So the Mandelbrot set is a map of Julia connectedness, one dot per Julia set.

Fat connected set
When c sits deep inside a bulb of the Mandelbrot set, such as c = 0 (a plain disc) or the main cardioid, the filled set has a chunky interior with real area.
Dendrite
When c sits exactly on the Mandelbrot boundary, for example c = i, the set is connected but has no interior: a lightning-shaped tree of zero area.
Cantor dust
When c lies outside the Mandelbrot set, for example c = 0.4 + 0.4i, the set breaks into infinitely many separate specks, a totally disconnected fractal.

The named presets are all boundary or near-boundary points, which is why they look intricate. The Douady rabbit is a period-3 bulb interior; the dragon at roughly c = -0.8 + 0.156i is a twisting connected set; the San Marco set at c = -0.75 + 0i is a chain of touching discs whose reflection resembles a lagoon.

Without JavaScript, picture a horizontal number line for the real part of c from -2 to 0.5. At c = 0 the Julia set is a perfect circle. As c moves left to -0.75 the circle grows a waist and pinches into the San Marco chain. Past -1.4 it fragments toward dust.

Common mistakes

Do not confuse z_0 with c. For a Julia set you fix c and sweep the starting point z_0 across every pixel. For the Mandelbrot set you fix z_0 = 0 and sweep c across every pixel. Swapping them draws the wrong fractal.

A second trap is a low iteration cap. Points near the boundary escape only after hundreds of steps, so a cap of 30 fattens the set with false black pixels and blurs the fine dendrites. Raise the cap and the thin structure sharpens, at the cost of compute time.

A third is reading area into dust. When c is outside the Mandelbrot set the true set has zero area and is totally disconnected. The specks you see are pixels the grid could not resolve into separate points, not solid regions. Zoom in and each speck splits again.

Finally, remember the map is symmetric: z and -z share the same fate because squaring erases the sign. Every Julia set has a two-fold rotational symmetry about the origin. If your render looks lopsided, the parameter readout or the grid centre is off.

Related tools

The Mandelbrot set indexes all Julia sets, so the Mandelbrot Explorer is the natural next stop. For a different iterated map whose starting points get sorted into fractal basins, try the Newton Fractal and the Magnetic Pendulum Fractal. To measure how rough these boundaries are, the Box-Counting Dimension Lab fits a dimension to any such image. For one-parameter roads into chaos in a simpler setting, the Logistic Map Bifurcation and the Hénon Map Attractor show the same sensitivity in one and two dimensions.

Frequently asked questions

Why is the escape radius exactly 2?

Because for the map z^2 + c with the usual parameter range, once |z| \gt 2 the magnitude strictly grows every step and diverges. The inequality |z^2 + c| \ge |z|(|z|-1) beats 1 as soon as |z| \gt 2, so 2 is a proven cutoff, not a tuned number.

What makes the Douady rabbit have three lobes?

Its parameter c = -0.123 + 0.745i sits in a period-3 bulb of the Mandelbrot set. The iteration settles into a cycle of length 3, and that period stamps a three-way branching onto every scale of the set.

Why does a tiny change in c change everything?

Near the Mandelbrot boundary the system is on the knife-edge between connected and disconnected. A move of 0.01 in c can cross that boundary, so a fat blob can snap into dust, as our worked pixel showed by escaping in 2 steps once the start moved out.

Is the black region the Julia set?

Not quite. The black region is the filled Julia set: every point that never escapes. The Julia set proper is only its outer edge, the infinitely thin boundary where escaping and trapped points meet.

Does higher resolution ever reveal new detail?

Yes, without limit. The boundary is self-similar, so every zoom uncovers smaller copies of the same structure. The only ceilings are your iteration cap and the precision of the arithmetic.