【问题标题】:C Mandelbrot Set ColoringC Mandelbrot 套装着色
【发布时间】:2016-05-02 21:24:47
【问题描述】:

我正在使用 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);
}

【问题讨论】:

  • 您的颜色始终相同,因为您始终将 R 和 B 值设置为迭代次数,并将 G 设置为零。重新考虑...
  • 预设ITERMAX 元素的颜色数组,在迭代范围内从R=0, G=0, B=255 淡出到R=255, G=255, B=255。它可以是struct 的数组,也可以是每种颜色的一个数组。但是,如果您希望每个地图都从蓝色变为白色,而不管缩放如何,您必须在每个地图中找到最少的迭代次数,并从那里确定颜色范围。
  • 只是关于编码风格的旁白:您应该为每个块级别选择一个缩进量并坚持下去。每个块级别 4 个很常见。

标签: c mandelbrot


【解决方案1】:

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

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2014-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-08
  • 1970-01-01
相关资源
最近更新 更多