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