C Coloring Mandelbrot

I am working on the following code in C. So far, it has worked, and it has been scaled up to the right level, etc., however, I am struggling to make the colors work the way I want. Ideally, I would like to get something like this regardless of color:

Mandelbrot Set w / correct colors

however, my program, as it is below, is currently producing something like this:

Current mandelbrot set

Therefore, I would appreciate any help I could get to make the colors the way I want.

#include <stdio.h> #include <stdlib.h> #include <math.h> #define ITERMAX 100.0 #define DIVERGING 1.1 #define XMAX 500 #define YMAX 500 #define COLORINTENSITY 255 /* allow up to ITERMAX feedbacks searching for convergence for the feedback z0 = 0 + 0i znew = z^2 + c If we have not diverged to distance DIVERGING before ITERMAX feedbacks we will assume the feedback is convergent at this value of c. We will report divergence if |z|^2 > DIVERGING */ /* We will print color values for each pixel from (0, 0) to (XMAX, YMAX) The color of pixel (cx, cy) will be set by convergent() or by divergent() depending on the convergence or divergence of the feedback when c = cx + icy */ /* The max value of the red, green, or blue component of a color */ void convergent(); /* one color for convergence */ void divergent(); /* a different color for divergence */ void feedback(double *x, double *y, double cx, double cy); void pixel(char red, char green, char blue); FILE *fp; int main() { fp = fopen("mandelbrot.ppm", "wb"); double x, y, cx, cy; int iteration,squarex, squarey, pixelx, pixely; double grow=1.0; /* header for PPM output */ fprintf(fp, "P6\n# CREATOR: EK, BB, RPJ via the mandel program\n"); fprintf(fp, "%d %d\n%d\n",XMAX, YMAX, COLORINTENSITY); for (pixely = 0; pixely < YMAX; pixely++) { for (pixelx = 0; pixelx < XMAX; pixelx++) { cx = (((float)pixelx)/((float)XMAX)-0.5)/grow*3.0-0.7; cy = (((float)pixely)/((float)YMAX)-0.5)/grow*3.0; x = 0.0; y = 0.0; for (iteration=1;iteration<ITERMAX;iteration++) { feedback(&x, &y, cx, cy); if (x*x + y*y > 100.0) iteration = 1000; } if (iteration==ITERMAX) { iteration = x*x + y*y; pixel((char) 0, (char) 0, (char) 0); } else { iteration = sqrt(x*x + y*y); pixel((char) iteration, (char) 0, (char) iteration); } } } } void feedback(double *x, double *y, double cx, double cy) { /* Update x and y according to the feedback equation xnew = x^2 - y^2 + cx ynew = 2xy + cy (these are the real and imaginary parts of the complex equation: znew = z^2 + c) */ double xnew = (*x) * (*x) - (*y) * (*y) + cx; double ynew = 2 * *x * *y + cy; *x = xnew; *y = ynew; } void pixel(char red, char green, char blue) { /* put a rgb triple to the standard out */ fputc(red, fp); fputc(green, fp); fputc(blue, fp); } 
+6
source share
1 answer

To fix the strip, you need to iterate over your tables to find the maximum value for the iteration counter, and then scale other values โ€‹โ€‹relative to that maximum (i.e. normalize the values). You can also perform a logarithmic change of values โ€‹โ€‹to adjust the slope of the color change.

And you probably don't want to work directly in the RGB space. If you define your colors in the HSB space, you can set a constant hue and saturation and change the brightness in proportion to the normalized number of iterations.

+3
source

All Articles