diff options
| -rw-r--r-- | Makefile | 4 | ||||
| -rw-r--r-- | main.c | 98 |
2 files changed, 85 insertions, 17 deletions
@@ -1,6 +1,6 @@ CC = gcc -CFLAGS = -Wall -Wextra $(shell pkgconf --cflags sdl2) -LDFLAGS = $(shell pkgconf --libs sdl2) +CFLAGS = -Wall -Wextra $(shell pkgconf --cflags sdl2 SDL2_gfx) +LDFLAGS = -lm $(shell pkgconf --libs sdl2 SDL2_gfx) NAME = fourier-series-viz @@ -1,19 +1,33 @@ #include <stdio.h> #include <stdlib.h> #include <stdbool.h> +#include <math.h> #include <SDL2/SDL.h> +#include <SDL2/SDL2_gfxPrimitives.h> -#define WINDOW_WIDTH 648 -#define WINDOW_HEIGHT 480 -#define CIRCLE_SIZE 100 -#define HISTORY_SIZE WINDOW_WIDTH - CIRCLE_SIZE +#define FRAME_DELAY 5 +#define WINDOW_WIDTH 648 +#define WINDOW_HEIGHT 480 +#define CIRCLE_RAD 100 +#define CIRCLE_DIAMETER (CIRCLE_RAD * 2) +#define HISTORY_SIZE (WINDOW_WIDTH - CIRCLE_DIAMETER) -int g_history[HISTORY_SIZE] = {0}; +int g_history[HISTORY_SIZE] = {0}; +double g_angle = 0.0; +int g_circle_count = 1; -int main(void) +bool g_pause = false; +bool g_running = true; + +void reset_history(void) { for (size_t i = 0; i < HISTORY_SIZE; i++) - g_history[i] = 100; + g_history[i] = WINDOW_HEIGHT; +} + +int main(void) +{ + reset_history(); if (SDL_Init(SDL_INIT_VIDEO) != 0) exit(1); @@ -31,8 +45,7 @@ int main(void) if (renderer == NULL) exit(1); - bool running = true; - while (running) + while (g_running) { SDL_Event e; while (SDL_PollEvent(&e)) @@ -40,30 +53,85 @@ int main(void) switch (e.type) { case SDL_QUIT: - running = false; + g_running = false; break; case SDL_KEYDOWN: switch (e.key.keysym.sym) { case SDLK_q: case SDLK_ESCAPE: - running = false; + g_running = false; + break; + case SDLK_p: + case SDLK_SPACE: + g_pause = !g_pause; + break; + case SDLK_j: + case SDLK_MINUS: + g_circle_count--; + if (g_circle_count < 1) + g_circle_count = 1; + reset_history(); + break; + case SDLK_k: + case SDLK_EQUALS: + g_circle_count++; + reset_history(); break; } } } + if (g_pause) + { + SDL_Delay(FRAME_DELAY); + continue; + } SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); SDL_RenderClear(renderer); - SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255); - for (size_t i = 0; i < HISTORY_SIZE; i++) + /* SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255); */ + /* + ** n = range(1, inf, 2) + ** + ** 4 * sin(n * theta) + ** ----------------- + ** pi + ** + */ + + double sum_x = 0.0; + double sum_y = 0.0; + for (int circle_num = 0; circle_num < g_circle_count; circle_num++) { - SDL_RenderDrawPoint(renderer, CIRCLE_SIZE + i, g_history[i]); + int factor = 1 + circle_num * 2; + int radius = (CIRCLE_RAD - 25) * 4 / (factor * M_PI); + double x = radius * cos(factor * g_angle); + double y = radius * sin(factor * g_angle); + + int center_x = CIRCLE_RAD + sum_x; + int center_y = WINDOW_HEIGHT / 2 + sum_y; + aacircleColor(renderer, center_x, center_y, radius, 0xffffffff); + filledCircleColor(renderer, center_x + x, center_y + y, 3, 0xffffffff); + sum_x += x; + sum_y += y; } + g_angle += 0.01; + + memmove(g_history + 1, g_history, sizeof(g_history[0]) * (HISTORY_SIZE - 1)); + g_history[0] = sum_y; + + for (size_t i = 0; i < HISTORY_SIZE; i++) + { + SDL_RenderDrawPoint( + renderer, + CIRCLE_DIAMETER + i + 10, + WINDOW_HEIGHT / 2 + g_history[i] + ); + } SDL_RenderPresent(renderer); - SDL_Delay(5); + SDL_Delay(FRAME_DELAY); } SDL_DestroyRenderer(renderer); |
