3dickulus: The article you reference is similar to the Wikipedia smooth color article

https://en.wikipedia.org/wiki/Mandelbrot_set#Continuous_.28smooth.29_coloring. It is nice that Inigo emphasizes that the usual method only works for second degree polynomials and that it must be adjusted for higher degree polynomials. These methods still work for polynomials only. Since they require the f(z) = z

^{d} approximation for large z.

Here is a smooth color technique I think you will like. For now I will present a 1D version, in another post I will add some easy 2D extensions. The math is very easy, nothing deep. The motivation is purely artistic, this is not based on any mathematical property of the fractal. Also, it works for any fractal formula. I think I talked about this in the old alt.fractal newsgroup. However I was unable to find any reference to the few articles I checked on coloring techniques.

Now I am going to make this look very mathematical, but that is just for fun, it really is extremely simple. Skip to the TL;DR if you want.

There are two obvious prerequisites, the underlying formula, f(z) must be continuous, and the escape radius, R, must be large enough. But even then, the discontinuity in the colors shows the discontinuity in the function, and/or the chopped off non-escaping orbits due to small R as it should.

Let f(z,c) be our fractal formula, it is continuous in both z and c. For the mandelbrot treatment, set z

_{0} as the starting point and let f

^{i}(c) be the ith iteration of f. f

^{0}=z

_{0}, f

^{i}(c) = f(f

^{i-1}(c),c). Each iteration function is continuous as it is a composition of continuous functions. For Julia sets the iteration is defined slightly differently, but pretty much any way of defining the iteration if you start with a continuous function then each iteration is continuous.

Let me drop the functional notation where it is convenient and set z

_{i} = f

^{i}(c).

Let R be a proper escape radius. That is \[ (|z_i| \geq R) \text{ & } (j > i) \Rightarrow |z_j| \geq R \]

Now define

\[

g(z) = \begin{cases} R - |z| & \text{if} |z| < R \\ 0 & \text{if} |z| \geq R \end{cases}

\]

This is a continuous function from complex numbers to non-negative reals. It is defined piece-wise from two continuous functions. You only need to verify that the two pieces agree on the seam, for |z|=R both cases are = 0.

Now set a(c) = \( \sum_{i=0}^{N}g(f^i(c) \). a is a sum of a composition of continuous functions, so a is a continuous function of c.

For most values of c you cannot compute a(c) directly. The intermediate value will overflow from iterating f too many times. But the definition for proper escape radius ensures that \[ (|z_i| \geq R) \text{ & } (j \geq i) \Rightarrow g(z_j) = 0 \] So after we hit the escape radius are we are just adding zeros in the summation. Thus a(c) is a continuous function of the pixel variable suitable for smooth 1D coloring

TL;DR:

If you build a sum of R-|z| while doing the fractal calculation, the result will a continuous value suitable for smooth 1D coloring.