Mercurial > public > algo-animator
annotate src/utils.c @ 31:61104b22a25d
I think it is working now...
author | Dennis C. M. <dennis@denniscm.com> |
---|---|
date | Thu, 29 Jun 2023 18:05:22 +0100 |
parents | f945bcc3571f |
children |
rev | line source |
---|---|
29
dae463bbf5ca
implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff
changeset
|
1 #include "utils.h" |
dae463bbf5ca
implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff
changeset
|
2 |
dae463bbf5ca
implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff
changeset
|
3 |
dae463bbf5ca
implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff
changeset
|
4 void create_array(struct Element *arr, int arr_size, int window_height, int vpadding) { |
dae463bbf5ca
implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff
changeset
|
5 float rect_increase = (window_height - vpadding * 2) / (float)(arr_size - 1); |
dae463bbf5ca
implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff
changeset
|
6 for (int i = 1; i <= arr_size; i++) { |
dae463bbf5ca
implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff
changeset
|
7 arr[i - 1].value = i * rect_increase; |
dae463bbf5ca
implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff
changeset
|
8 arr[i - 1].current = false; |
dae463bbf5ca
implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff
changeset
|
9 } |
dae463bbf5ca
implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff
changeset
|
10 } |
dae463bbf5ca
implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff
changeset
|
11 |
dae463bbf5ca
implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff
changeset
|
12 |
dae463bbf5ca
implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff
changeset
|
13 void swap_elements(int x, int y, struct Element *arr) { |
dae463bbf5ca
implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff
changeset
|
14 struct Element temp = arr[x]; |
dae463bbf5ca
implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff
changeset
|
15 arr[x] = arr[y]; |
dae463bbf5ca
implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff
changeset
|
16 arr[y] = temp; |
dae463bbf5ca
implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff
changeset
|
17 } |
dae463bbf5ca
implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff
changeset
|
18 |
dae463bbf5ca
implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff
changeset
|
19 |
dae463bbf5ca
implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff
changeset
|
20 void randomize_array(struct Element *arr, int arr_size) { |
dae463bbf5ca
implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff
changeset
|
21 srand(time(NULL)); |
dae463bbf5ca
implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff
changeset
|
22 |
dae463bbf5ca
implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff
changeset
|
23 // Fisher-Yates shuffle |
dae463bbf5ca
implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff
changeset
|
24 for (int i = arr_size - 1; i > 0; i--) { |
dae463bbf5ca
implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff
changeset
|
25 int j = rand() % (i + 1); |
dae463bbf5ca
implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff
changeset
|
26 |
dae463bbf5ca
implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff
changeset
|
27 // Swap |
dae463bbf5ca
implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff
changeset
|
28 swap_elements(i, j, arr); |
dae463bbf5ca
implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff
changeset
|
29 } |
dae463bbf5ca
implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff
changeset
|
30 } |
dae463bbf5ca
implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff
changeset
|
31 |
dae463bbf5ca
implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff
changeset
|
32 |
30 | 33 void algorithm_selector(struct Algo *algos, int size, int direction, int *selected_algo) { |
34 int selection = *selected_algo + direction; | |
35 | |
36 if (selection >= 0 && selection <= size - 1) { | |
37 *selected_algo = selection; | |
29
dae463bbf5ca
implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff
changeset
|
38 } |
dae463bbf5ca
implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff
changeset
|
39 } |
dae463bbf5ca
implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff
changeset
|
40 |
dae463bbf5ca
implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff
changeset
|
41 |
31
61104b22a25d
I think it is working now...
Dennis C. M. <dennis@denniscm.com>
parents:
30
diff
changeset
|
42 void change_delay(struct AlgoArgs *algo_args, int change) { |
30 | 43 int new_delay = algo_args->delay + change; |
29
dae463bbf5ca
implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff
changeset
|
44 |
30 | 45 if (new_delay) { |
46 algo_args->delay = new_delay; | |
29
dae463bbf5ca
implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff
changeset
|
47 } |
dae463bbf5ca
implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff
changeset
|
48 } |
dae463bbf5ca
implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff
changeset
|
49 |
dae463bbf5ca
implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff
changeset
|
50 |
30 | 51 void control_flow(useconds_t delay, bool sequentially, bool *pause) { |
52 if (sequentially) { | |
53 *pause = true; | |
54 } | |
55 | |
29
dae463bbf5ca
implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff
changeset
|
56 while (*pause) { |
dae463bbf5ca
implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff
changeset
|
57 // Wait to resume |
dae463bbf5ca
implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff
changeset
|
58 } |
30 | 59 |
60 usleep(delay); | |
29
dae463bbf5ca
implementing multi-thread and refactoring
Dennis C. M. <dennis@denniscm.com>
parents:
diff
changeset
|
61 } |
30 | 62 |
63 | |
64 void reset_state(struct AlgoArgs *algo_args, struct ThreadState *thread_state) { | |
65 if (thread_state->running) { | |
66 pthread_cancel(thread_state->thread); | |
67 } | |
68 | |
69 randomize_array(algo_args->arr, algo_args->arr_size); | |
70 | |
71 algo_args->comparisons = 0; | |
72 algo_args->pause = false; | |
73 algo_args->sequentially = false; | |
74 | |
75 for (int i = 0; i < algo_args->arr_size - 1; i++) { | |
76 algo_args->arr[i].current = false; | |
77 } | |
78 } | |
79 | |
80 | |
81 void run(struct AlgoArgs *algo_args, struct Algo *algos, int selected_algo, | |
82 struct ThreadState *thread_state) { | |
83 | |
84 if (algo_args->pause) { | |
85 algo_args->pause = false; | |
86 } else { | |
87 thread_state->running = true; | |
88 pthread_create(&(thread_state->thread), NULL, algos[selected_algo].function, | |
89 (void *)algo_args); | |
90 } | |
91 } | |
92 |