87 lines
2.2 KiB
C
87 lines
2.2 KiB
C
/* main.c
|
|
* Created: 2023-08-25
|
|
* Author: Aryadev Chavali
|
|
* Description: Entry point of program
|
|
*/
|
|
#include <malloc.h>
|
|
#include <stdio.h>
|
|
|
|
#include <raylib.h>
|
|
#include <raymath.h>
|
|
|
|
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;
|
|
}
|