#include "SDL3/SDL.h" #include "mandelbrot.h" #include #include #include #include #include #include #include #include #include // TODO: GPU shadering option // TODO: flexible window size // TODO: zooming in and out // TODO: maybe? change colors #define WINDOW_TITLE "Mandelbrot Visualization" #define WINDOW_WIDTH 800 #define WINDOW_HEIGHT 600 static int points[WINDOW_WIDTH * WINDOW_HEIGHT]; void calculate_points() { double x_min = -2.0, x_max = 1.0; double y_min = -1.2, y_max = 1.2; int max_iter = 100; for (int py = 0; py < WINDOW_HEIGHT; py++) { for (int px = 0; px < WINDOW_WIDTH; px++) { double cr = x_min + (x_max - x_min) * px / (WINDOW_WIDTH - 1); double ci = y_min + (y_max - y_min) * py / (WINDOW_HEIGHT - 1); points[py * WINDOW_WIDTH + px] = mandelbrot_iterations(cr, ci, max_iter); } } } void draw_points(SDL_Surface* surface) { for (int py = 0; py < WINDOW_HEIGHT; py++) { for (int px = 0; px < WINDOW_WIDTH; px++) { int r, g, b; get_color(points[py * WINDOW_WIDTH + px], 100, &r, &g, &b); SDL_WriteSurfacePixel(surface, px, py, r, g, b, 255); } } }; int main(void) { if (!SDL_Init(SDL_INIT_VIDEO | SDL_INIT_EVENTS)) { fprintf(stderr, "SDL_Init failed: %s\n", SDL_GetError()); return -1; } SDL_Window* window = SDL_CreateWindow(WINDOW_TITLE, WINDOW_WIDTH, WINDOW_HEIGHT, SDL_WINDOW_HIDDEN); if (window == NULL) { fprintf(stderr, "CreateWindowAndRenderer failed: %s\n", SDL_GetError()); SDL_Quit(); return -1; } SDL_Surface* surface = SDL_GetWindowSurface(window); if (!surface) { return -1; } SDL_Event e; bool running = true; SDL_UpdateWindowSurface(window); SDL_ShowWindow(window); while (running) { while (SDL_PollEvent(&e)) { if (e.type == SDL_EVENT_QUIT) { running = false; } } calculate_points(); draw_points(surface); SDL_UpdateWindowSurface(window); SDL_Delay(16); } SDL_DestroyWindow(window); SDL_Quit(); return 0; }