From 9f204ddb1b46dcb3554ca44296dec00891a67267 Mon Sep 17 00:00:00 2001 From: Tanjita Date: Sat, 11 May 2013 21:34:34 +0200 Subject: [PATCH] restructure --- mandelbrot.c | 71 +++++++++++++++++++++++++++++++++------------------- 1 file changed, 45 insertions(+), 26 deletions(-) diff --git a/mandelbrot.c b/mandelbrot.c index 0ea47ea..1612916 100644 --- a/mandelbrot.c +++ b/mandelbrot.c @@ -2,31 +2,35 @@ #include #include -int main(int argc, char *argv[]) { - SDL_Surface *screen = NULL; - if (SDL_Init(SDL_INIT_EVERYTHING) < 0) { - printf("Error: Could not initialize SDL: %s.\n", SDL_GetError()); - exit(1); - } - screen = SDL_SetVideoMode(1280, 800, 32, SDL_SWSURFACE); +/* Compute the out-coloring based on the iteration counter. */ +Uint32 outcolor(int it) { + return 0x00010001 * it; +} - if (SDL_MUSTLOCK(screen)) { - SDL_LockSurface(screen); +/* Compute the in-coloring. */ +Uint32 incolor() { + return 0x00000000; /* black */ +} + +void drawmandelbrot(SDL_Surface *surface) { + if (SDL_MUSTLOCK(surface)) { + SDL_LockSurface(surface); } - Uint32 *pixels = (Uint32 *) screen->pixels; - for (int i = 0; i < screen->w * screen->h; i++) { - int y = i / screen->w; - int x = i % screen->w; + Uint32 *pixels = (Uint32 *) surface->pixels; + + for (int i = 0; i < surface->w * surface->h; i++) { + int y = i / surface->w; + int x = i % surface->w; - float complex c = ((3.0 * x / screen->w) - 2.0) - + I * ((2.0 * y / screen->h) - 1.0); + float complex c = ((3.0 * x / surface->w) - 2.0) + + I * ((2.0 * y / surface->h) - 1.0); bool diverges = false; float complex z = 0; int it; for (it = 1; it < 256; it++) { z = cpowf(z, 2) + c; - if (cabs(z) > 100) { + if (cabs(z) > 2) { diverges = true; break; } @@ -34,28 +38,43 @@ int main(int argc, char *argv[]) { Uint32 color; if (diverges) { - color = 0x00010001 * it; + color = outcolor(it); } else { - color = 0x00000000; + color = incolor(); } pixels[i] = color; - if (y % 10 == 0) - SDL_Flip(screen); + + /* Update the screen every 10 lines. */ + if (y % 10 == 0) { + SDL_Flip(surface); + } } + if (SDL_MUSTLOCK(surface)) { + SDL_UnlockSurface(surface); + } + SDL_Flip(surface); +} + +int main(int argc, char *argv[]) { + /* Set up SDL. */ + if (SDL_Init(SDL_INIT_EVERYTHING) < 0) { + fprintf(stderr, "Error: Could not initialize SDL: %s.\n", SDL_GetError()); + exit(1); + } + SDL_Surface *screen = SDL_SetVideoMode(320, 240, 32, SDL_SWSURFACE); + + /* Do the mandelbrot. */ + drawmandelbrot(screen); + /* Save BMP */ char *file = "mandelbrot.bmp"; if (SDL_SaveBMP(screen, file) != 0) { fprintf(stderr, "Could not write %s!\n", file); } - if (SDL_MUSTLOCK(screen)) { - SDL_UnlockSurface(screen); - } - SDL_Flip(screen); - + /* Quit. */ SDL_Delay(20000); - SDL_Quit(); }