Mercurial > public > algo-animator
changeset 9:b7da0083b706
removing struct?
author | Dennis C. M. <dennis@denniscm.com> |
---|---|
date | Fri, 23 Jun 2023 18:26:31 +0100 |
parents | f7af7255705e |
children | f4e0c266321a |
files | algos.c algos.h main.c utils.c utils.h |
diffstat | 4 files changed, 68 insertions(+), 37 deletions(-) [+] |
line wrap: on
line diff
--- a/algos.h Fri Jun 23 16:46:43 2023 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,5 +0,0 @@ -#ifndef ALGOS_H -#define ALGOS_H - - -#endif
--- a/main.c Fri Jun 23 16:46:43 2023 +0100 +++ b/main.c Fri Jun 23 18:26:31 2023 +0100 @@ -1,6 +1,7 @@ -#include "utils.h" #include <stdio.h> +#include <stdlib.h> #include <GL/glut.h> +#include <math.h> #define WINDOW_HEIGHT 1080 @@ -9,18 +10,58 @@ #define SPACE 5 +// Globals +char* algos[] = {"Bubble sort", "Selection sort", "Insertion sort", "Quick sort"}; + +int selected_algo = 0; +int n_algos = sizeof(algos) / sizeof(algos[0]); +int n_rectangles; + struct Rectangle { int width; int height; int x; }; -// Globals struct Rectangle* rectangles; -int n_rectangles; -int test_counter = 0; +// Algos +void bubble_sort() { + for (int i = 0; i < n_rectangles; i++) { + + struct Rectangle current = rectangles[i]; + struct Rectangle next = rectangles[i + 1]; + + printf("Current pos: %i\n", current.x); + printf("Next pos: %i\n", next.x); + + // Place largest element at the end of the array + if (current.height > next.height) { + rectangles[i + 1].x = current.x; + rectangles[i].x = next.x; + } + } +} + + +// Utils +int random_int(int min, int max) { + return rand() % ((max - min) + 1) + min; +} + + +void algo_selector(int direction) { + int selection = selected_algo + direction; + int lower = 0; + int upper = (sizeof(algos) / sizeof(algos[0])) - 1; + + if (selection >= lower && selection <= upper) { + selected_algo = selection; + } +} + +// GL and GLUT void setup() { // Set background dark @@ -54,8 +95,8 @@ glBegin(GL_QUADS); for (int i = 0; i < n_rectangles; i++) { - glVertex2f(rectangles[i].x, WINDOW_HEIGHT - 100); - glVertex2f(rectangles[i].x + rectangles[i].width, WINDOW_HEIGHT - 100); + glVertex2f(rectangles[i].x, WINDOW_HEIGHT - 200); + glVertex2f(rectangles[i].x + rectangles[i].width, WINDOW_HEIGHT - 200); glVertex2f(rectangles[i].x + rectangles[i].width, rectangles[i].height); glVertex2d(rectangles[i].x, rectangles[i].height); } @@ -64,11 +105,15 @@ // Render text char text[256]; - sprintf(text, "Number of elements: %i", n_rectangles); - render_text(40.0, WINDOW_HEIGHT - 50, text); + + sprintf(text, "Algorithm: %s", algos[selected_algo]); + render_text(20.0, WINDOW_HEIGHT - 130, text); - sprintf(text, "Test counter: %i", test_counter); - render_text(540.0, WINDOW_HEIGHT - 50, text); + sprintf(text, "Number of elements: %i", n_rectangles); + render_text(20.0, WINDOW_HEIGHT - 100, text); + + render_text(WINDOW_WIDTH - 500, WINDOW_HEIGHT - 130, "Press 'a' or 's' to select an algorithm"); + render_text(WINDOW_WIDTH - 500, WINDOW_HEIGHT - 100, "Press 'enter' to run the algorithm"); glutSwapBuffers(); glFlush(); @@ -82,9 +127,19 @@ void keyboard(unsigned char key, int x, int y) { - // 13 is the ASCII value of ENTER key + // S + if (key == 115) { + algo_selector(1); + } + + // A + if (key == 97) { + algo_selector(-1); + } + + // Enter if (key == 13) { - test_counter++; + bubble_sort(); } } @@ -98,7 +153,7 @@ int i = 0; while (i < n_rectangles) { rectangles[i].width = RECT_WIDTH; - rectangles[i].height = random_int(100, WINDOW_HEIGHT - 100); + rectangles[i].height = random_int(100, WINDOW_HEIGHT - 200); rectangles[i].x = x_pos; x_pos += RECT_WIDTH + SPACE;