Sfoglia il codice sorgente

mandelbrot: initial commit

cmte 5 anni fa
parent
commit
ddd3b4235f
3 ha cambiato i file con 98 aggiunte e 0 eliminazioni
  1. 2 0
      .gitignore
  2. 20 0
      mandelbrot/Makefile
  3. 76 0
      mandelbrot/mandelbrot.c

+ 2 - 0
.gitignore

@@ -28,3 +28,5 @@ _testmain.go
 *.exe
 *.o
 */bin/*
+*.c~
+*.h~

+ 20 - 0
mandelbrot/Makefile

@@ -0,0 +1,20 @@
+CC=/usr/bin/gcc
+CFLAGS=-g -Werror -pthread -pedantic -pedantic-errors -fno-fast-math -fno-builtin -m64 -std=iso9899:1999 -I${PWD} -lX11 -lm
+OUT=bin
+OBJ=$(OUT)/obj
+OBJS=$(OBJ)/mandelbrot.o
+
+
+all: pre bin/mandelbrot
+
+bin/mandelbrot: $(OBJS)
+	$(CC) $(CFLAGS) $(OBJS) -o $(OUT)/mandelbrot
+
+bin/obj/mandelbrot.o: mandelbrot.c
+	$(CC) $(CFLAGS) -c mandelbrot.c -o $(OBJ)/mandelbrot.o
+
+pre:
+	mkdir -p bin/obj
+
+clean:
+	find ./bin -type f -exec rm {} \;

+ 76 - 0
mandelbrot/mandelbrot.c

@@ -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);
+
+}