/* main.c * Created: 2023-08-25 * Author: Aryadev Chavali * Description: Entry point of program */ #include #include #include #include struct State { // Sandpiles unsigned char *data; size_t dwidth; size_t window_len; int multiplier; }; typedef struct State state_t; void step(state_t *state) { state->data[((state->dwidth / 2) * state->dwidth) + (state->dwidth / 2)]++; for (size_t i = 0; i < state->dwidth; ++i) for (size_t j = 0; j < state->dwidth; ++j) if (state->data[(i * state->dwidth) + j] >= 4) { unsigned char *references[] = { (j == 0) ? NULL : &state->data[((i)*state->dwidth) + j - 1], (i == state->dwidth - 1) ? NULL : &state->data[((i + 1) * state->dwidth) + j], (j == state->dwidth - 1) ? NULL : &state->data[(i * state->dwidth) + j + 1], (i == 0) ? NULL : &state->data[((i - 1) * state->dwidth) + j]}; for (size_t k = 0; k < 4; ++k) if (references[k]) *references[k] += 1; state->data[(i * state->dwidth) + j] = 0; } } int main(void) { state_t state = {NULL, 256, 512, 0}; state.data = calloc(state.dwidth * state.dwidth, sizeof(*state.data)); state.multiplier = state.window_len / state.dwidth; Camera2D camera = {0}; camera.zoom = 1.0f; InitWindow(state.window_len, state.window_len, "Abelian sand pile"); SetTargetFPS(60); while (!WindowShouldClose()) { step(&state); BeginDrawing(); ClearBackground(BLACK); BeginMode2D(camera); for (size_t i = 0; i < state.dwidth; ++i) for (size_t j = 0; j < state.dwidth; ++j) { Color c = {0}; unsigned char sandpile = state.data[(i * state.dwidth) + j]; if (sandpile == 0) c = BLACK; else if (sandpile == 1) c = GREEN; else if (sandpile == 2) c = PURPLE; else if (sandpile == 3) c = YELLOW; DrawRectangle(i * state.multiplier, j * state.multiplier, state.multiplier, state.multiplier, c); } EndMode2D(); EndDrawing(); } CloseWindow(); return 0; }