|
@@ -0,0 +1,76 @@
|
|
|
+#include <stdio.h>
|
|
|
+
|
|
|
+#define BAIL_OUT 16
|
|
|
+#define MAX_ITER 100
|
|
|
+
|
|
|
+#define WIDTH 800
|
|
|
+#define HEIGHT 800
|
|
|
+
|
|
|
+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;
|
|
|
+}
|
|
|
+
|
|
|
+void mandelbrot(double *field, int w, int h, int bail_out, int max_iter)
|
|
|
+{
|
|
|
+ double xPrime, yPrime, real, imaginary, realPrime,
|
|
|
+ imaginaryPrime,x2, y2;
|
|
|
+ int bailed = 0, 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);
|
|
|
+ x2 = xPrime;
|
|
|
+ y2 = yPrime;
|
|
|
+
|
|
|
+ // iterate a^2 - b^2 + 2ab
|
|
|
+ for (k = 0; k < max_iter; k++) {
|
|
|
+ bailed = 0;
|
|
|
+ // a^2 - b^2
|
|
|
+ real = xPrime * xPrime - yPrime * yPrime;
|
|
|
+ // 2ab
|
|
|
+ imaginary = 2 * xPrime * yPrime;
|
|
|
+
|
|
|
+ // real + c
|
|
|
+ xPrime = real + x2;
|
|
|
+ // imaginary + c
|
|
|
+ yPrime = imaginary + y2;
|
|
|
+
|
|
|
+ if ((xPrime * xPrime + yPrime * yPrime) >
|
|
|
+ bail_out) {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (k == max_iter) {
|
|
|
+ field[x * h + y] = 0;
|
|
|
+ } else {
|
|
|
+ field[x * h + y] = k;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+int main(int argc, char **argv)
|
|
|
+{
|
|
|
+
|
|
|
+ double pix_field[WIDTH][HEIGHT];
|
|
|
+
|
|
|
+ mandelbrot((double *) pix_field, WIDTH, HEIGHT, BAIL_OUT, MAX_ITER);
|
|
|
+
|
|
|
+ for (int i=0; i< WIDTH; i++)
|
|
|
+ {
|
|
|
+ for (int j=0; j<HEIGHT; j++)
|
|
|
+ {
|
|
|
+ printf("[%.2lf]", pix_field[i][j]);
|
|
|
+ }
|
|
|
+
|
|
|
+ printf("\n");
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ return (0);
|
|
|
+
|
|
|
+}
|