From 49df2e4de31278d6725c7ab196c4ccfad19c74eb Mon Sep 17 00:00:00 2001 From: Alejandro Laguna Date: Tue, 14 Jul 2026 18:26:31 +0200 Subject: [PATCH] feat: zoom in and out --- src/main.c | 45 ++++++++++++++++++++++++++++++++++++++------- 1 file changed, 38 insertions(+), 7 deletions(-) diff --git a/src/main.c b/src/main.c index 607d64029437c77b4c7b75a0841e723e808eb149..79b5653d52f8253afbb4cd1a3dc0b25ab40a67e3 100644 --- a/src/main.c +++ b/src/main.c @@ -12,7 +12,6 @@ // TODO: GPU shadering option // TODO: flexible window size -// TODO: zooming in and out // TODO: maybe? change colors #define WINDOW_TITLE "Mandelbrot Visualization" @@ -21,14 +20,19 @@ 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; +typedef struct position_s { + double x_min; + double x_max; + double y_min; + double y_max; +} position_t; + +void calculate_points(position_t* pos) { 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); + double cr = pos->x_min + (pos->x_max - pos->x_min) * px / (WINDOW_WIDTH - 1); + double ci = pos->y_min + (pos->y_max - pos->y_min) * py / (WINDOW_HEIGHT - 1); points[py * WINDOW_WIDTH + px] = mandelbrot_iterations(cr, ci, max_iter); } } @@ -66,13 +70,40 @@ int main(void) { bool running = true; SDL_UpdateWindowSurface(window); SDL_ShowWindow(window); + position_t position; + position.x_min = -2.0; + position.x_max = 1.0; + position.y_min = -1.2; + position.y_max = 1.2; while (running) { while (SDL_PollEvent(&e)) { if (e.type == SDL_EVENT_QUIT) { running = false; } + if (e.type == SDL_EVENT_MOUSE_WHEEL) { + // 1. Get mouse pixel position + float mx, my; + SDL_GetMouseState(&mx, &my); + + double cr = + position.x_min + (position.x_max - position.x_min) * mx / (WINDOW_WIDTH - 1); + double ci = + position.y_min + (position.y_max - position.y_min) * my / (WINDOW_HEIGHT - 1); + + double range_y = position.y_max - position.y_min; + + float factor = (e.wheel.y > 0) ? 0.9f : 1.1f; + double new_height = range_y * factor; + double aspect = (double)WINDOW_WIDTH / WINDOW_HEIGHT; + double new_width = new_height * aspect; + + position.x_min = cr - (double)mx / (WINDOW_WIDTH - 1) * new_width; + position.x_max = position.x_min + new_width; + position.y_min = ci - (double)my / (WINDOW_HEIGHT - 1) * new_height; + position.y_max = position.y_min + new_height; + } } - calculate_points(); + calculate_points(&position); draw_points(surface); SDL_UpdateWindowSurface(window); SDL_Delay(16);