]> git.itanic.dy.fi Git - mandelbrot/commitdiff
Increase floating point precision
authorTimo Kokkonen <kaapeli@itanic.dy.fi>
Tue, 3 May 2011 19:42:19 +0000 (22:42 +0300)
committerTimo Kokkonen <kaapeli@itanic.dy.fi>
Tue, 3 May 2011 19:42:19 +0000 (22:42 +0300)
Signed-off-by: Timo Kokkonen <kaapeli@itanic.dy.fi>
mandelbrot.c

index 8ce33b9f8cca52b2345ef0b86523b192efb2ca3e..5dc9aed7f65f8054cc8161e09f874f453d4add28 100644 (file)
@@ -6,10 +6,11 @@
 
 struct context {
        struct SDL_Surface *screen;
-       double origo_x, origo_y;
+       long double origo_x, origo_y;
        int motion_x, motion_y;
-       double zoom;
+       long double zoom;
        int scroll_enabled;
+       int zooms;
 };
 
 static void putpixel(struct SDL_Surface *screen, const int x, const int y,
@@ -26,9 +27,9 @@ static void putpixel(struct SDL_Surface *screen, const int x, const int y,
 
 #define MAX_ITERATION 1000
 
-int get_mandelbrot_iterations(double x0, double y0)
+int get_mandelbrot_iterations(long double x0, long double y0)
 {
-       double x = 0, y = 0, xtemp;
+       long double x = 0, y = 0, xtemp;
        int iteration = 0;
 
        while ((x * x + y * y < 2 * 2) && iteration < MAX_ITERATION) {
@@ -43,16 +44,16 @@ int get_mandelbrot_iterations(double x0, double y0)
        return iteration;
 }
 
-int draw_mandelbrot(struct SDL_Surface *screen, double x1, double x2,
-               double y1, double y2)
+int draw_mandelbrot(struct SDL_Surface *screen, long double x1, long double x2,
+               long double y1, long double y2)
 {
-       double x0, y0, xlen, ylen, xstep, ystep;
+       long double x0, y0, xlen, ylen, xstep, ystep;
        int iteration, xs, ys;
 
        xlen = x2 - x1;
        ylen = y2 - y1;
-       xstep = xlen / (double)screen->w;
-       ystep = ylen / (double)screen->h;
+       xstep = xlen / (long double)screen->w;
+       ystep = ylen / (long double)screen->h;
 
        y0 = y1;
 #pragma omp parallel for private(xs, ys, x0, y0)
@@ -111,9 +112,11 @@ static int read_events(struct context *ctx)
                case SDL_MOUSEBUTTONDOWN:
                        if (event.button.button == 4) {
                                ctx->zoom *= 1.5;
-                               exit++;
+                               ctx->zooms++;
+                               delayed_exit++;
                        } else if (event.button.button == 5) {
                                ctx->zoom /= 1.5;
+                               ctx->zooms--;
                                delayed_exit++;
                        } else {
                                ctx->scroll_enabled = 1;
@@ -152,7 +155,8 @@ quit:
 
 static void loop(struct context *ctx)
 {
-       double aspect_ratio;
+       long double aspect_ratio;
+       long double x1, x2, y1, y2;
 
        do {
                aspect_ratio = ctx->screen->w / ctx->screen->h;
@@ -160,13 +164,13 @@ static void loop(struct context *ctx)
                ctx->origo_y += ctx->motion_y / ctx->zoom / ctx->screen->h;
                ctx->motion_x = ctx->motion_y = 0;
 
-               draw_mandelbrot(ctx->screen,
-                               ctx->origo_x - aspect_ratio / ctx->zoom,
-                               ctx->origo_x + aspect_ratio / ctx->zoom,
-                               ctx->origo_y - 1 / ctx->zoom,
-                               ctx->origo_y + 1 / ctx->zoom);
+               x1 = ctx->origo_x - aspect_ratio / ctx->zoom;
+               x2 = ctx->origo_x + aspect_ratio / ctx->zoom;
+               y1 = ctx->origo_y - 1 / ctx->zoom;
+               y2 = ctx->origo_y + 1 / ctx->zoom;
                printf("Drawing area (%f, %f)(%f, %f), zoom %d\n",
-                       x1, y1, x2, y2, ctx->zoom );
+                       x1, y1, x2, y2, ctx->zooms);
+               draw_mandelbrot(ctx->screen, x1, x2, y1, y2);
        } while (!read_events(ctx));
 }