C Mandelbrot设置着色

时间:2016-05-02 21:24:48

标签: c mandelbrot

我正在使用C中的以下代码。到目前为止它已经全部工作并且它被缩放到正确的级别等,但是我正在努力让颜色按我的意愿工作。理想情况下,无论颜色如何,我都希望得到类似的东西:

Mandelbrot Set w/ correct colors

然而我现在的程序如下所示:

Current Mandelbrot Set

因此,如果我希望他们能够使颜色变好,我将不胜感激。

#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 r-g-b triple to the standard out */
 fputc(red, fp);
 fputc(green, fp);
 fputc(blue, fp);
}

1 个答案:

答案 0 :(得分:3)

要修复条带,您需要迭代表格以找到迭代计数的最大值,然后将其他值缩放为相对于此最大值(即规范化值) 。您可能还希望以对数方式重新调整值以调整颜色变化的斜率

你可能不想直接在RGB空间工作。如果在HSB空间中定义颜色,则可以设置恒定的色调和饱和度,并根据标准化的迭代计数按比例改变亮度。