Mercurial > public > algo-animator
comparison main.c @ 20:fc44102980fb
change rectangle color to white when algorithm is selecting it
author | Dennis C. M. <dennis@denniscm.com> |
---|---|
date | Mon, 26 Jun 2023 18:12:03 +0100 |
parents | a027304ec75d |
children | 8a5a7aee69ce |
comparison
equal
deleted
inserted
replaced
19:a027304ec75d | 20:fc44102980fb |
---|---|
31 int speed = 1; | 31 int speed = 1; |
32 int refresh_counter = 0; | 32 int refresh_counter = 0; |
33 int iter_counter = 0; | 33 int iter_counter = 0; |
34 int arr_size; | 34 int arr_size; |
35 | 35 |
36 float *arr; | 36 |
37 struct Element { | |
38 float value; | |
39 bool current; | |
40 }; | |
41 | |
42 struct Element *arr; | |
37 | 43 |
38 bool run; | 44 bool run; |
39 | 45 |
40 | 46 |
41 /* Algorithms */ | 47 /* Algorithms */ |
49 | 55 |
50 struct AlgoState as = {0, 0, 0}; | 56 struct AlgoState as = {0, 0, 0}; |
51 | 57 |
52 | 58 |
53 void swap_elements(int x, int y) { | 59 void swap_elements(int x, int y) { |
54 float temp = arr[x]; | 60 struct Element temp = arr[x]; |
55 arr[x] = arr[y]; | 61 arr[x] = arr[y]; |
56 arr[y] = temp; | 62 arr[y] = temp; |
57 } | 63 } |
58 | 64 |
59 | 65 |
63 * a: Index of the current selection | 69 * a: Index of the current selection |
64 * b: Index boundary of the sorted array | 70 * b: Index boundary of the sorted array |
65 */ | 71 */ |
66 | 72 |
67 if (as.a < arr_size - 1 - as.b) { | 73 if (as.a < arr_size - 1 - as.b) { |
68 if (arr[as.a] > arr[as.a + 1]) { | 74 arr[as.a].current = true; |
75 | |
76 if (arr[as.a].value > arr[as.a + 1].value) { | |
69 swap_elements(as.a + 1, as.a); | 77 swap_elements(as.a + 1, as.a); |
70 } | 78 } |
71 | 79 |
72 as.a++; | 80 as.a++; |
73 } else { | 81 } else { |
85 * c: Index of the minimum element | 93 * c: Index of the minimum element |
86 */ | 94 */ |
87 | 95 |
88 | 96 |
89 if (as.a < arr_size) { | 97 if (as.a < arr_size) { |
90 if (arr[as.a] < arr[as.c]) { | 98 arr[as.a].current = true; |
99 | |
100 if (arr[as.a].value < arr[as.c].value) { | |
91 | 101 |
92 // Save new minimum | 102 // Save new minimum |
93 as.c = as.a; | 103 as.c = as.a; |
94 } | 104 } |
95 | 105 |
106 | 116 |
107 /* Helper functions */ | 117 /* Helper functions */ |
108 | 118 |
109 void create_array() { | 119 void create_array() { |
110 arr_size = WINDOW_WIDTH / (RECT_WIDTH + SPACE); | 120 arr_size = WINDOW_WIDTH / (RECT_WIDTH + SPACE); |
111 arr = (float*)malloc(arr_size * sizeof(float)); | 121 arr = malloc(arr_size * sizeof(struct Element)); |
112 | 122 |
113 float rect_increase = (WINDOW_HEIGHT - VPADDING * 2) / (float)(arr_size - 1); | 123 float rect_increase = (WINDOW_HEIGHT - VPADDING * 2) / (float)(arr_size - 1); |
114 | 124 |
115 for (int i = 1; i <= arr_size; i++) { | 125 for (int i = 1; i <= arr_size; i++) { |
116 arr[i - 1] = i * rect_increase; | 126 arr[i - 1].value = i * rect_increase; |
127 arr[i - 1].current = false; | |
117 } | 128 } |
118 } | 129 } |
119 | 130 |
120 | 131 |
121 void randomize_array() { | 132 void randomize_array() { |
124 // Fisher-Yates shuffle | 135 // Fisher-Yates shuffle |
125 for (int i = arr_size - 1; i > 0; i--) { | 136 for (int i = arr_size - 1; i > 0; i--) { |
126 int j = rand() % (i + 1); | 137 int j = rand() % (i + 1); |
127 | 138 |
128 // Swap | 139 // Swap |
129 float temp = arr[i]; | 140 swap_elements(i, j); |
130 arr[i] = arr[j]; | |
131 arr[j] = temp; | |
132 } | 141 } |
133 } | 142 } |
134 | 143 |
135 | 144 |
136 bool array_sorted() { | 145 bool array_sorted() { |
137 for (int i = 0; i < arr_size - 1; i++) { | 146 for (int i = 0; i < arr_size - 1; i++) { |
138 if (arr[i] > arr[i + 1]) { | 147 if (arr[i].value > arr[i + 1].value) { |
139 return false; | 148 return false; |
140 } | 149 } |
141 } | 150 } |
142 | 151 |
143 return true; | 152 return true; |
212 | 221 |
213 glBegin(GL_QUADS); | 222 glBegin(GL_QUADS); |
214 | 223 |
215 int x = 0; | 224 int x = 0; |
216 for (int i = 0; i < arr_size; i++) { | 225 for (int i = 0; i < arr_size; i++) { |
226 | |
227 if (arr[i].current) { | |
228 glColor3f(1.0, 1.0, 1.0); | |
229 } else { | |
230 glColor3f(1.0, 0.7569, 0.0); | |
231 } | |
217 | 232 |
218 // Bottom left | 233 // Bottom left |
219 glVertex2f(x, VPADDING); | 234 glVertex2f(x, VPADDING); |
220 | 235 |
221 // Top left | 236 // Top left |
222 glVertex2f(x, VPADDING + arr[i]); | 237 glVertex2f(x, VPADDING + arr[i].value); |
223 | 238 |
224 // Top right | 239 // Top right |
225 glVertex2f(x + RECT_WIDTH, VPADDING + arr[i]); | 240 glVertex2f(x + RECT_WIDTH, VPADDING + arr[i].value); |
226 | 241 |
227 // Bottom right | 242 // Bottom right |
228 glVertex2f(x + RECT_WIDTH, VPADDING); | 243 glVertex2f(x + RECT_WIDTH, VPADDING); |
229 | 244 |
230 x += RECT_WIDTH + SPACE; | 245 x += RECT_WIDTH + SPACE; |
246 | |
247 arr[i].current = false; | |
231 } | 248 } |
232 | 249 |
233 glEnd(); | 250 glEnd(); |
234 | 251 |
235 // Render text | 252 // Render text |