mandelbrot.c 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. #include <stdio.h>
  2. #define BAIL_OUT 16
  3. #define MAX_ITER 100
  4. #define WIDTH 800
  5. #define HEIGHT 800
  6. double map(int value, int min, int max, int map_min, int map_max)
  7. {
  8. double R = (double) (map_max - map_min) / (double) (max - min);
  9. double y = map_min + (value * R) + R;
  10. return y;
  11. }
  12. void mandelbrot(double *field, int w, int h, int bail_out, int max_iter)
  13. {
  14. double xPrime, yPrime, real, imaginary, realPrime,
  15. imaginaryPrime, x2, y2;
  16. int bailed = 0, 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. bailed = 0;
  26. // a^2 - b^2
  27. real = xPrime * xPrime - yPrime * yPrime;
  28. // 2ab
  29. imaginary = 2 * xPrime * yPrime;
  30. // x = real + c
  31. xPrime = real + x2;
  32. // y = imaginary + c
  33. yPrime = imaginary +y2;
  34. if ((xPrime * xPrime + yPrime * yPrime) >
  35. bail_out) {
  36. break;
  37. }
  38. }
  39. if (k == max_iter) {
  40. field[x * h + y] = 0;
  41. } else {
  42. field[x * h + y] = k;
  43. }
  44. }
  45. }
  46. }
  47. int main(int argc, char **argv)
  48. {
  49. double pix_field[WIDTH][HEIGHT];
  50. mandelbrot((double *) pix_field, WIDTH, HEIGHT, BAIL_OUT,
  51. MAX_ITER);
  52. for (int i = 0; i < WIDTH; i++) {
  53. for (int j = 0; j < HEIGHT; j++) {
  54. printf("[%.2lf]", pix_field[i][j]);
  55. }
  56. printf("\n");
  57. }
  58. return (0);
  59. }