Improving my preset Mandelbrot code

I have the following Mandelbrot code set in C. I do the calculation and create a .ppm file for the final fractal image. The fact is that my fractal image is upside down, which means that it is rotated 90 degrees. You can verify this by running my code:. / mandel> test.ppm

On the other hand, I also want to change colors. I want to achieve this fractal image:

enter image description here

My last problem is that my code does not check the running time of my code. I also have code for this part, but when the code completes, it does not print the runtime. If someone can make the appropriate changes to my code and help me achieve this fractal image and display the elapsed time, I would be happy.

#include <math.h> #include <stdlib.h> #include <time.h> #include <stdio.h> void color(int red, int green, int blue) { fputc((char)red, stdout); fputc((char)green, stdout); fputc((char)blue, stdout); } int main(int argc, char *argv[]) { int w = 600, h = 400, x, y; //each iteration, it calculates: newz = oldz*oldz + p, where p is the current pixel, and oldz stars at the origin double pr, pi; //real and imaginary part of the pixel p double newRe, newIm, oldRe, oldIm; //real and imaginary parts of new and old z double zoom = 1, moveX = -0.5, moveY = 0; //you can change these to zoom and change position int maxIterations = 1000;//after how much iterations the function should stop clock_t begin, end; double time_spent; printf("P6\n# CREATOR: ET / mandel program\n"); printf("%d %d\n255\n",w,h); begin = clock(); //loop through every pixel for(x = 0; x < w; x++) for(y = 0; y < h; y++) { //calculate the initial real and imaginary part of z, based on the pixel location and zoom and position values pr = 1.5 * (x - w / 2) / (0.5 * zoom * w) + moveX; pi = (y - h / 2) / (0.5 * zoom * h) + moveY; newRe = newIm = oldRe = oldIm = 0; //these should start at 0,0 //"i" will represent the number of iterations int i; //start the iteration process for(i = 0; i < maxIterations; i++) { //remember value of previous iteration oldRe = newRe; oldIm = newIm; //the actual iteration, the real and imaginary part are calculated newRe = oldRe * oldRe - oldIm * oldIm + pr; newIm = 2 * oldRe * oldIm + pi; //if the point is outside the circle with radius 2: stop if((newRe * newRe + newIm * newIm) > 4) break; } color(i % 256, 255, 255 * (i < maxIterations)); } end = clock(); time_spent = (double)(end - begin) / CLOCKS_PER_SEC; printf("Elapsed time: %.2lf seconds.\n", time_spent); return 0; } 
+7
source share
1 answer

Part 1: You need to change the order of your loops to:

 for(y = 0; y < h; y++) for(x = 0; x < w; x++) 

This will give you a correctly oriented fractal.

Part 2: To get the time to print, you must print it in stderr, since you are printing ppm output to stdout:

 fprintf(stderr, "Elapsed time: %.2lf seconds.\n", time_spent); 

Part 3: To get a continuous smooth color, you need to use the Normalized Iteration Method method or something similar. Here you can replace your coloring section, which gives you something similar to what you want:

  if(i == maxIterations) color(0, 0, 0); // black else { double z = sqrt(newRe * newRe + newIm * newIm); int brightness = 256. * log2(1.75 + i - log2(log2(z))) / log2(double(maxIterations)); color(brightness, brightness, 255); } 

This is not entirely true, because I made a simple approximate implementation of the normalized iterative calculation method.

Mandelbrot using some semi-continuous coloring

This is not a completely continuous coloration, but it is close.

+8
source

All Articles