123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- #include <stdio.h>
- #include "../libpng/img.h"
- #include "config.h"
- double map(int value, int min, int max, int map_min, int map_max)
- {
- double R = (double) (map_max - map_min) / (double) (max - min);
- double y = map_min + (value * R) + R;
- return y;
- }
- int mandelbrot_pix(double x, double y, int bail_out, int max_iter)
- {
- int k;
- double real, imaginary, x2, y2;
-
- x2 = x;
- y2 = y;
- // iterate a^2 - b^2 + 2ab
- for (k = 0; k < max_iter; k++) {
- // a^2 - b^2
- real = x * x - y * y;
- // 2ab
- imaginary = 2 * x * y;
- // x = real + c
- x = real + x2;
- // y = imaginary + c
- y = imaginary +y2;
- if ((x * x + y * y) >
- bail_out) {
- return k;
- }
- }
- return max_iter;
- }
- void mandelbrot(double *field, int w, int h, int bail_out, int max_iter)
- {
- double xPrime, yPrime;
- int x, y, k;
- for (x = 0; x < w; x++) {
- for (y = 0; y < h; y++)
- {
- xPrime = map(x, 0, w, -2, 2);
- yPrime = map(y, 0, h, -2, 2);
- mandelbrot_pix(xPrime, yPrime, bail_out, max_iter);
- }
- }
- }
- int main(int argc, char **argv)
- {
- double *pix_field;
- pix_field = malloc(WIDTH * HEIGHT * sizeof(double));
- mandelbrot(pix_field, WIDTH, HEIGHT, BAIL_OUT, MAX_ITER);
- pix_row rows[WIDTH];
- pix p;
- char filename[30];
- image img;
- p.r = 200;
- p.g = 200;
- p.b = 200;
- for (int i = 0; i < WIDTH; i++) {
- rows[i].p = malloc(HEIGHT * sizeof(pix));
- for (int j = 0; j < HEIGHT; j++) {
- p.r =
- map(pix_field[i * HEIGHT + j], 0, MAX_ITER, 0,
- 255);
- p.g =
- map(pix_field[i * HEIGHT + j], 0, MAX_ITER, 0,
- 255);
- p.b =
- map(pix_field[i * HEIGHT + j], 0, MAX_ITER, 0,
- 255);
- rows[i].p[j] = p;
- }
- }
- sprintf(filename, "mandel.png");
- img = initialize_png("mandelbrot", filename, WIDTH, HEIGHT);
- write_image(&img, rows);
- finish_image(&img);
- for (int i = 0; i < WIDTH; i++) {
- free(rows[i].p);
- }
- free(pix_field);
- return (0);
- }
|