Search code examples
javaprocessingmandelbrot

Mandelbrot set visualization


I'm trying to visualize Mandelbrot's set with processing, and it's the first time I do something like this. My approach is pretty simple. I have a function Z, which is literally just the set's main function (f(z)=z^2+c) and i do a loop for each pixel of the screen, every time i repeat the process of using Z() and using the result as the new z parameter in the function Z() For some reason what shows up on the screen is only a diagonal line, and i have no idea of why that is.

Here's the full code:

void draw() {

int max_iterations = 100, infinity_treshold = 16;
for (int y = 0; y < 360; y++) {
  for (int x = 0; x < 480; x++) {

    float z = 0; // the result of the function, (y)
    float real = map(x,0,480,-2,2); // map "scales" the coordinate as if the pixel 0 was -2 and the pixel 480 was 2
    float imaginary = map(y,0,360,-2,2); // same thing with the height
    int func_iterations = 0; // how many times the process of the equation has been excecuted

    while (func_iterations < max_iterations) {
      z = Z(z, real+imaginary);
      if (abs(z) > infinity_treshold) break;
      func_iterations++;
    }

    if (func_iterations == max_iterations) rect(x,y,1,1);
    }
  }
  noLoop();
}

private float Z(float z, float c) {
  return pow(z,2)+c;
}

Solution

  • The formula z = z^2 +c is meant to operate with Complex numbers. I recommend to use PVector to represent a complex number. e.g.:

    private PVector Z(PVector z, PVector c) {
        return new PVector(z.x * z.x - z.y * z.y + c.x, 2.0 * z.x * z.y + c.y);
    }
    

    See the example:

    void setup() {
        size(400, 400);
    }
    
    void draw() {
    
        background(255);
        int max_iterations = 100;
        float infinity_treshold = 16.0;
        for (int y = 0; y < width; y++) {
            for (int x = 0; x < height; x++) {
    
                float real = map(x, 0, width, -2.5, 1.5); 
                float imaginary = map(y, 0, height, -2, 2); 
                PVector c = new PVector(real, imaginary);
                PVector z = new PVector(0, 0);
    
                int func_iterations = 0; 
                while (func_iterations < max_iterations) {
                    z = Z(z, c);
                    if (z.magSq() > infinity_treshold)
                        break;
                    func_iterations++;
                }
    
                if (func_iterations == max_iterations) {
                    point(x, y);
                }
            }
        }
        noLoop();
    }
    
    private PVector Z(PVector z, PVector c) {
        return new PVector(z.x * z.x - z.y * z.y + c.x, 2.0 * z.x * z.y + c.y);
    }
    

    See also
    wikipedia - Mandelbrot set
    Mandelbrot.java