DEVELOPMENT ENVIRONMENT

~alex/mandelbrot-set-gen

49df2e4de31278d6725c7ab196c4ccfad19c74eb — Alejandro Laguna a month ago b7b7cbb
feat: zoom in and out
1 files changed, 38 insertions(+), 7 deletions(-)

M src/main.c
M src/main.c => src/main.c +38 -7
@@ 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);