summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAryadev Chavali <aryadev@aryadevchavali.com>2023-08-25 18:42:49 +0100
committerAryadev Chavali <aryadev@aryadevchavali.com>2023-08-25 18:42:49 +0100
commite6fc32ef086028b787d97797b464e172dfded76f (patch)
treea8c8593d88fb3060ac70bebcea81da703e602cf6
parent0d25b2b78e213df5beabf429b3ab4081b0ad0751 (diff)
downloadabelian-sandpile-e6fc32ef086028b787d97797b464e172dfded76f.tar.gz
abelian-sandpile-e6fc32ef086028b787d97797b464e172dfded76f.tar.bz2
abelian-sandpile-e6fc32ef086028b787d97797b464e172dfded76f.zip
(main)+state data structure and iteration logic
Per iteration, increment the centre of the grid, and perform any collapsing necessary (if >= 4 then sand pile "collapses" onto its cardinal directions).
-rw-r--r--main.c51
1 files changed, 48 insertions, 3 deletions
diff --git a/main.c b/main.c
index f1ec861..1c57ee8 100644
--- a/main.c
+++ b/main.c
@@ -3,22 +3,67 @@
* Author: Aryadev Chavali
* Description: Entry point of program
*/
+#include <malloc.h>
#include <stdio.h>
#include <raylib.h>
-#define WIDTH 512
-#define HEIGHT 512
+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)
{
- InitWindow(WIDTH, HEIGHT, "Abelian sand pile");
+ state_t state = {NULL, 256, 512, 0};
+ state.data = calloc(state.dwidth * state.dwidth, sizeof(*state.data));
+ state.multiplier = state.window_len / state.dwidth;
+
+ InitWindow(state.window_len, state.window_len, "Abelian sand pile");
SetTargetFPS(60);
while (!WindowShouldClose())
{
+ step(&state);
BeginDrawing();
ClearBackground(BLACK);
DrawText("Hello, world!", 100, 100, 25, RAYWHITE);
+
+ for (size_t i = 0; i < state.dwidth; ++i)
+ for (size_t j = 0; j < state.dwidth; ++j)
+ {
+ DrawRectangle(i * state.multiplier, j * state.multiplier,
+ state.multiplier, state.multiplier, BLACK);
+ }
EndDrawing();
}
CloseWindow();