C Мандельброт Набор раскраски

Я работаю над следующим кодом на C. До сих пор все работало, увеличено до нужного уровня и т. Д., Однако я изо всех сил пытаюсь заставить цвета работать так, как я хочу. В идеале я бы хотел получить что-то вроде этого независимо от цвета:

Набор Мандельброта с правильными цветами

однако моя программа, как показано ниже, в настоящее время производит что-то вроде этого:

Текущий набор Мандельброта

Поэтому я был бы признателен за любую помощь, которую я мог бы получить, чтобы цвета стали такими, как я хочу.

#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);
}

person Kane    schedule 02.05.2016    source источник
comment
Ваш цвет всегда один и тот же, потому что вы всегда устанавливаете значения R и B равными номеру итерации, а G равным нулю. Подумайте еще раз ...   -  person Eugene Sh.    schedule 03.05.2016
comment
Заранее установите цветовой массив из ITERMAX элементов, чтобы плавно переходить от R=0, G=0, B=255 к R=255, G=255, B=255 в диапазоне итераций. Это может быть массив struct или один массив для каждого цвета. Но если вы хотите, чтобы каждая карта меняла цвет с синего на белый, независимо от масштаба, вам нужно будет найти наименьшее количество итераций на каждой карте и отсчитать цвета оттуда.   -  person Weather Vane    schedule 03.05.2016
comment
Просто отступление о стиле кодирования: вы должны выбрать одну величину отступа для каждого уровня блока и придерживаться ее. 4 на уровень блока - довольно распространенное явление.   -  person lurker    schedule 03.05.2016


Ответы (1)


Чтобы исправить полосатость, вам нужно перебрать свои таблицы, чтобы найти максимальное значение для счетчика итераций, а затем масштабировать другие значения относительно этого максимума (т. Е. нормализовать значения). Вы также можете изменить масштаб значений логарифмически, чтобы отрегулировать наклон изменения цвета.

И вы, вероятно, не захотите работать непосредственно в пространстве RGB. Если вы определяете свои цвета в пространстве HSB, вы можете установить постоянный оттенок и насыщенность, а также изменять яркость пропорционально нормализованному количеству итераций.

person luser droog    schedule 03.05.2016
comment
первое изображение использует плавный цветовой градиент: stackoverflow.com / questions / 369438 /, метод установки второго уровня - person Adam; 07.05.2016