mandelbrot.c 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  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. // real + c
  31. xPrime = real + x2;
  32. // 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, MAX_ITER);
  51. for (int i=0; i< WIDTH; i++)
  52. {
  53. for (int j=0; j<HEIGHT; j++)
  54. {
  55. printf("[%.2lf]", pix_field[i][j]);
  56. }
  57. printf("\n");
  58. }
  59. return (0);
  60. }