mandelbrot.c 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. #include <stdio.h>
  2. #include "../libpng/img.h"
  3. #define BAIL_OUT 8192
  4. #define MAX_ITER 65536
  5. #define WIDTH 4096
  6. #define HEIGHT 4096
  7. double map(int value, int min, int max, int map_min, int map_max)
  8. {
  9. double R = (double) (map_max - map_min) / (double) (max - min);
  10. double y = map_min + (value * R) + R;
  11. return y;
  12. }
  13. void mandelbrot(double *field, int w, int h, int bail_out, int max_iter)
  14. {
  15. double xPrime, yPrime, real, imaginary, x2, y2;
  16. int x, y, k;
  17. for (x = 0; x < w; x++) {
  18. for (y = 0; y < h; y++) {
  19. xPrime = map(x, 0, w, -2, 2);
  20. yPrime = map(y, 0, h, -2, 2);
  21. x2 = xPrime;
  22. y2 = yPrime;
  23. // iterate a^2 - b^2 + 2ab
  24. for (k = 0; k < max_iter; k++) {
  25. // a^2 - b^2
  26. real = xPrime * xPrime - yPrime * yPrime;
  27. // 2ab
  28. imaginary = 2 * xPrime * yPrime;
  29. // x = real + c
  30. xPrime = real + x2;
  31. // y = imaginary + c
  32. yPrime = imaginary +y2;
  33. if ((xPrime * xPrime + yPrime * yPrime) >
  34. bail_out) {
  35. break;
  36. }
  37. }
  38. if (k == max_iter) {
  39. field[x * h + y] = max_iter;
  40. } else {
  41. field[x * h + y] = k;
  42. }
  43. }
  44. }
  45. }
  46. int main(int argc, char **argv)
  47. {
  48. double *pix_field;
  49. pix_field = malloc(WIDTH * HEIGHT * sizeof(double));
  50. mandelbrot(pix_field, WIDTH, HEIGHT, BAIL_OUT, MAX_ITER);
  51. pix_row rows[WIDTH];
  52. pix p;
  53. char filename[30];
  54. image img;
  55. p.r = 200;
  56. p.g = 200;
  57. p.b = 200;
  58. for (int i = 0; i < WIDTH; i++) {
  59. rows[i].p = malloc(HEIGHT * sizeof(pix));
  60. for (int j = 0; j < HEIGHT; j++) {
  61. p.r =
  62. map(pix_field[i * HEIGHT + j], 0, MAX_ITER, 0,
  63. 255);
  64. p.g =
  65. map(pix_field[i * HEIGHT + j], 0, MAX_ITER, 0,
  66. 255);
  67. p.b =
  68. map(pix_field[i * HEIGHT + j], 0, MAX_ITER, 0,
  69. 255);
  70. rows[i].p[j] = p;
  71. }
  72. }
  73. sprintf(filename, "mandel.png");
  74. img = initialize_png("mandelbrot", filename, WIDTH, HEIGHT);
  75. write_image(&img, rows);
  76. finish_image(&img);
  77. for (int i = 0; i < WIDTH; i++) {
  78. free(rows[i].p);
  79. }
  80. free(pix_field);
  81. return (0);
  82. }