2016-01-24 5 views
0

Я хочу нарисовать Mandelbrot в PPM-файле в C. Мой код работает, но мой рисунок всегда черный. У меня есть этот код из wikia. Ключом к моему успеху является мысль «альфа» (я так думаю). Я понятия не имею, что такое альфа. Вот мой код:Mandelbrot PPM чертеж всегда черный

#include <stdio.h> 
#include <stdlib.h> 

#define W 800 
#define H 800 

//rgb struct 
struct RGB { 
    int r; 
    int g; 
    int b; 
}; 
struct RGB picture[W][H]; 

void draw() { 
int i, j, iteration, max_iteration, alfa, color; 
float x, y, x0, y0, xtemp; 

for(i=0;i<W;++i) 
{ 
    for(j=0;j<H;++j) 
    { 
     x0 = 1; //scaled x (e.g interval(-2.5, 1)) 
     y0 = -1; //scaled y (e.g interval(-1, 1)) 
     x = 0.0; 
     y = 0.0; 
     iteration = 0; 
     max_iteration = 1000; 

     while (x*x + y*y < 2*2 && iteration < max_iteration) 
     { 
      xtemp = x*x - y*y + x0; 
      y = 2*x*y + y0; 
      x = xtemp; 
      iteration = iteration+ 1; 
      alfa = x*y; //??? 
     } 

     color = alfa * (iteration/max_iteration); 

     picture[i][j].r = color; 
     picture[i][j].g = color; 
     picture[i][j].b = color; 
    } 
} 
} 

int main() { 

//variables 
int i,j; 

draw(); 

FILE *fp; 
fp = fopen("picture.ppm", "w"); 
fprintf(fp,"P3\n#test\n%d %d\n256\n", W, H); 

for (i=0; i < W; ++i) 
    { 
     for (j=0; j < H; ++j) 
     { 
     fprintf(fp,"%d %d %d ", picture[i][j].r, picture[i][j].g , picture[i][j].b); 
     } 
    fprintf(fp, "\n"); 
    } 

fclose(fp); 

return 0; 
} 
+1

'итерация' и' max_interation' являются целыми числами, поэтому '(итерация/max_iteration)' является целым делением, которое всегда будет давать 0, когда 'iteration' меньше, чем' max_iteration'. Удалите круглые скобки, чтобы умножение было первым. –

+0

Ваш иритарный код, вероятно, должен что-то сделать в позиции 'i' и' j'. Вы используете их только при назначении цветов. Если вы инициализируете 'x0' и' y0' с помощью 'i' и' j', например. путем сопоставления их с интервалом желаний? –

+0

Наконец, я думаю, вы должны сопоставить значение Mandelbrodt с цветом в диапазоне от 0 до 255. –

ответ

1

В этой строке

color = alfa * (iteration/max_iteration); 

Divison iteration/max_iteration является int деление, результат которого всегда 0 (возможно 1, если когда-либо iteration == max_iteration).

Try работает в float или переставить как этот

color = alfa * iteration/max_iteration; 

удаление скобок. Но вам нужно будет следить за тем, чтобы диапазон int не был сломан.

Сказав это, кажется, вы не уверены, что такое alfa. Я предлагаю 255, чтобы вы получили изображение серого цвета.

+0

О! Сначала я не читал комментарии. @MOehm уже указал на эту ошибку. –