mandelbrot.c 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. #include <stdio.h>
  2. #include "../libpng/img.h"
  3. #include "config.h"
  4. double map(int value, int min, int max, int map_min, int map_max)
  5. {
  6. double R = (double) (map_max - map_min) / (double) (max - min);
  7. double y = map_min + (value * R) + R;
  8. return y;
  9. }
  10. int mandelbrot_pix(double x, double y, int bail_out, int max_iter)
  11. {
  12. int k;
  13. double real, imaginary, x2, y2;
  14. x2 = x;
  15. y2 = y;
  16. // iterate a^2 - b^2 + 2ab
  17. for (k = 0; k < max_iter; k++) {
  18. // a^2 - b^2
  19. real = x * x - y * y;
  20. // 2ab
  21. imaginary = 2 * x * y;
  22. // x = real + c
  23. x = real + x2;
  24. // y = imaginary + c
  25. y = imaginary +y2;
  26. if ((x * x + y * y) >
  27. bail_out) {
  28. return k;
  29. }
  30. }
  31. return max_iter;
  32. }
  33. void mandelbrot(double *field, int w, int h, int bail_out, int max_iter)
  34. {
  35. double xPrime, yPrime;
  36. int x, y, k;
  37. for (x = 0; x < w; x++) {
  38. for (y = 0; y < h; y++)
  39. {
  40. xPrime = map(x, 0, w, -2, 2);
  41. yPrime = map(y, 0, h, -2, 2);
  42. mandelbrot_pix(xPrime, yPrime, bail_out, max_iter);
  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. }