Search code examples
pythonpython-3.xmathmandelbrot

Mandelbrot set smooth colouring function


I programmed the Mandelbrot set with python but that was weird looking so I searched for smooth colors. I've programmed a smooth colouring function using log and linear interpolation but whatever I try I can't get what I want:

self.palette = [(3, 25, 61),(5, 43, 107),(7, 61, 153),(20, 96, 226),(20, 164, 226),(74, 181, 226),(138, 211, 242),(205, 234, 247),(225, 237, 242),(255,255,255)]

Here is my palette

if n == self.max_iterations:
    self.screen.set_at((x, y), (110, 13, 13))
else:
    gradient = 1 + n - math.log(math.log(abs(m))) / math.log(2.0)
    iteration = n + 1 - gradient
    color1 = list(self.palette[n % 10])
    if n % 10 <= 8:
        color2 = list(self.palette[n % 10+1])
    else:
        color2 = list(self.palette[-1])

    color = [[], [], []]
    for number, elt in enumerate(color):
        color[number] = color1[number] + (iteration % 1)*(color2[number]-color1[number])

    self.screen.set_at((x, y), tuple(color))

Here my colouring function

And here what I get

As you can see colors are smooth but in the wrong way there is no continuity in the colors

I would like to have something like this :

ideal result

we do not see color gaps


Solution

  • It looks like you're selecting the pixel-color based on a discrete value (n, the escape-time).

    I would suggest:

    1) Plot your color-vs.-n on a 1D line. Does it appear continuous? If not, choose a color-map that appears continuous w.r.t. increasing n.

    2) Find a way to make n continuous, not discrete. One way to do this is by calculating your max-escape-time for the viewing window, and then dividing all other escape-times by this value, to yield a more continuous field. See this link on escape-time normalization:
    https://linas.org/art-gallery/escape/escape.html

    I believe if you meet both of the above criteria, the field surrounding the main image will appear continuous instead of having the 'iso-line' appearance.