organism #3
@ -33,7 +33,7 @@
|
|||||||
|
|
||||||
MatrixPanel_I2S_DMA *matrix = nullptr;
|
MatrixPanel_I2S_DMA *matrix = nullptr;
|
||||||
|
|
||||||
#define NUM_AGENTS 64
|
#define NUM_AGENTS 128
|
||||||
#define AGENT_MOVE_DISTANCE 1
|
#define AGENT_MOVE_DISTANCE 1
|
||||||
#define AGENT_DROP_AMOUNT 1
|
#define AGENT_DROP_AMOUNT 1
|
||||||
#define AGENT_ANGLE 0.175
|
#define AGENT_ANGLE 0.175
|
||||||
@ -44,18 +44,18 @@ typedef struct {
|
|||||||
float heading;
|
float heading;
|
||||||
} SlimeAgent;
|
} SlimeAgent;
|
||||||
|
|
||||||
uint8_t attractant[PANEL_WIDTH][PANEL_HEIGHT] = {};
|
float attractant[PANEL_WIDTH][PANEL_HEIGHT] = {};
|
||||||
int iterations = 0;
|
int iterations = 0;
|
||||||
SlimeAgent agents[NUM_AGENTS];
|
SlimeAgent agents[NUM_AGENTS];
|
||||||
|
|
||||||
void init_attractant() {
|
void init_attractant() {
|
||||||
memset(attractant, (uint8_t) 0, sizeof attractant);
|
memset(attractant, 0.0, sizeof attractant);
|
||||||
// draw a circle out of attractant
|
// draw a circle out of attractant
|
||||||
//for (int p = 0; p < 64; p++) {
|
//for (int p = 0; p < 64; p++) {
|
||||||
// float angle = ((PI * 2) / 64) * p;
|
// float angle = ((PI * 2) / 64) * p;
|
||||||
// int x = 31 + round(10 * sin(angle));
|
// int x = 31 + round(10 * sin(angle));
|
||||||
// int y = 15 + round(10 * cos(angle));
|
// int y = 15 + round(10 * cos(angle));
|
||||||
// attractant[x][y] = 15;
|
// attractant[x][y] = 15.0;
|
||||||
//}
|
//}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -66,8 +66,10 @@ void init_agents() {
|
|||||||
//agents[a].y_position = 15 + round(10*cos(angle));
|
//agents[a].y_position = 15 + round(10*cos(angle));
|
||||||
// agents[a].heading = ((PI * 2) / NUM_AGENTS) * );
|
// agents[a].heading = ((PI * 2) / NUM_AGENTS) * );
|
||||||
|
|
||||||
agents[a].x_position = random(12, 52);
|
//agents[a].x_position = random(12, 52);
|
||||||
agents[a].y_position = random(12, 20);
|
//agents[a].y_position = random(12, 20);
|
||||||
|
agents[a].x_position = random(0, 64);
|
||||||
|
agents[a].y_position = random(0, 32);
|
||||||
agents[a].heading = (random(0, 100) / 100.0) * (PI*2);
|
agents[a].heading = (random(0, 100) / 100.0) * (PI*2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -76,6 +78,9 @@ void init_agents() {
|
|||||||
|
|
||||||
void setup(){
|
void setup(){
|
||||||
Serial.begin(BAUD_RATE);
|
Serial.begin(BAUD_RATE);
|
||||||
|
//while (!Serial) {
|
||||||
|
// ; // wait for serial port to connect. Needed for native USB
|
||||||
|
//}
|
||||||
pinMode(ONBOARD_LED, OUTPUT);
|
pinMode(ONBOARD_LED, OUTPUT);
|
||||||
|
|
||||||
// redefine pins if required
|
// redefine pins if required
|
||||||
@ -118,11 +123,11 @@ void draw_bg() {
|
|||||||
void draw_attractant() {
|
void draw_attractant() {
|
||||||
for(int x = 0; x<PANEL_WIDTH; x++) {
|
for(int x = 0; x<PANEL_WIDTH; x++) {
|
||||||
for(int y = 0; y<PANEL_HEIGHT; y++){
|
for(int y = 0; y<PANEL_HEIGHT; y++){
|
||||||
if (attractant[x][y] > 0) {
|
if (attractant[x][y] > 20.0) {
|
||||||
matrix->drawPixel(x, y, matrix->color565(
|
matrix->drawPixel(x, y, matrix->color565(
|
||||||
int((255.0 / 255.0) * attractant[x][y]),
|
int((255.0 / 255.0) * round(attractant[x][y])),
|
||||||
int((80.0 / 255.0) * attractant[x][y]),
|
int((80.0 / 255.0) * round(attractant[x][y])),
|
||||||
int((83.0 / 255.0) * attractant[x][y])
|
int((83.0 / 255.0) * round(attractant[x][y]))
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -145,7 +150,7 @@ void setupGaussianKernel(float* kernel, int width, float sigma) {
|
|||||||
|
|
||||||
#define GAUSS_WIDTH 5
|
#define GAUSS_WIDTH 5
|
||||||
#define GAUSS_SIGMA 1.0
|
#define GAUSS_SIGMA 1.0
|
||||||
#define DECAY_FACTOR 0.9
|
#define DECAY_FACTOR 0.95
|
||||||
void gaussian_blur() {
|
void gaussian_blur() {
|
||||||
float kernel[GAUSS_WIDTH];
|
float kernel[GAUSS_WIDTH];
|
||||||
uint8_t first_pass[PANEL_WIDTH][PANEL_HEIGHT];
|
uint8_t first_pass[PANEL_WIDTH][PANEL_HEIGHT];
|
||||||
@ -184,20 +189,22 @@ void gaussian_blur() {
|
|||||||
additions++;
|
additions++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
attractant[x][y] = (int) round((sum/GAUSS_WIDTH) * DECAY_FACTOR);
|
attractant[x][y] = (sum/GAUSS_WIDTH) * DECAY_FACTOR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#define BLUR_KERNEL_SIZE 3
|
#define BLUR_KERNEL_SIZE 3
|
||||||
|
float first_pass[PANEL_WIDTH][PANEL_HEIGHT];
|
||||||
void box_blur() {
|
void box_blur() {
|
||||||
uint8_t first_pass[PANEL_WIDTH][PANEL_HEIGHT];
|
//Serial.println("memset: starting");
|
||||||
memset(first_pass, (uint8_t) 0, sizeof first_pass);
|
memset(first_pass, 0.0, sizeof first_pass);
|
||||||
|
//Serial.println("memset: passed");
|
||||||
// horizontal pass
|
// horizontal pass
|
||||||
for (int x = 0; x < PANEL_WIDTH; x++) {
|
for (int x = 0; x < PANEL_WIDTH; x++) {
|
||||||
for(int y = 0; y < PANEL_HEIGHT; y++) {
|
for(int y = 0; y < PANEL_HEIGHT; y++) {
|
||||||
int sum = attractant[x][y]; //0.0;
|
float sum;
|
||||||
|
sum = attractant[x][y]; //0.0;
|
||||||
int additions = 1;
|
int additions = 1;
|
||||||
for (int x_offset = 1; x_offset < BLUR_KERNEL_SIZE; x_offset++) {
|
for (int x_offset = 1; x_offset < BLUR_KERNEL_SIZE; x_offset++) {
|
||||||
if (is_in_bounds(x+x_offset, y)) {
|
if (is_in_bounds(x+x_offset, y)) {
|
||||||
@ -209,7 +216,7 @@ void box_blur() {
|
|||||||
additions++;
|
additions++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
first_pass[x][y] = (int) round((sum/additions) * DECAY_FACTOR);
|
first_pass[x][y] = (sum/additions);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// vertical pass
|
// vertical pass
|
||||||
@ -227,7 +234,11 @@ void box_blur() {
|
|||||||
additions++;
|
additions++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
attractant[x][y] = (int) round((sum/additions) * DECAY_FACTOR);
|
|
||||||
|
float result = (sum/additions); // * DECAY_FACTOR;
|
||||||
|
//Serial.printf("result: %f", result); //additions: %d\n", sum, additions);
|
||||||
|
attractant[x][y] = (((8.0*attractant[x][y]) + result) / 9.0);
|
||||||
|
attractant[x][y] = attractant[x][y] * DECAY_FACTOR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -252,7 +263,7 @@ void loop() {
|
|||||||
if (is_in_bounds(move_x, move_y)) {
|
if (is_in_bounds(move_x, move_y)) {
|
||||||
agents[a].x_position = move_x;
|
agents[a].x_position = move_x;
|
||||||
agents[a].y_position = move_y;
|
agents[a].y_position = move_y;
|
||||||
if (attractant[move_x][move_y] != 255) {
|
if (attractant[move_x][move_y] < 254.0) {
|
||||||
attractant[move_x][move_y] += AGENT_DROP_AMOUNT;
|
attractant[move_x][move_y] += AGENT_DROP_AMOUNT;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -265,9 +276,9 @@ void loop() {
|
|||||||
int left_y = round(agents[a].y_position + sin(agents[a].heading - (AGENT_ANGLE * (PI * 2))));
|
int left_y = round(agents[a].y_position + sin(agents[a].heading - (AGENT_ANGLE * (PI * 2))));
|
||||||
int right_x = round(agents[a].x_position + cos(agents[a].heading + (AGENT_ANGLE * (PI * 2))));
|
int right_x = round(agents[a].x_position + cos(agents[a].heading + (AGENT_ANGLE * (PI * 2))));
|
||||||
int right_y = round(agents[a].y_position + sin(agents[a].heading + (AGENT_ANGLE * (PI * 2))));
|
int right_y = round(agents[a].y_position + sin(agents[a].heading + (AGENT_ANGLE * (PI * 2))));
|
||||||
int front_value = attractant[front_x][front_y];
|
float front_value = attractant[front_x][front_y];
|
||||||
int left_value = attractant[left_x][left_y];
|
float left_value = attractant[left_x][left_y];
|
||||||
int right_value = attractant[right_x][right_y];
|
float right_value = attractant[right_x][right_y];
|
||||||
if (front_value > right_value and front_value > left_value) {
|
if (front_value > right_value and front_value > left_value) {
|
||||||
;
|
;
|
||||||
} else if (front_value < right_value and front_value < left_value) {
|
} else if (front_value < right_value and front_value < left_value) {
|
||||||
@ -280,9 +291,10 @@ void loop() {
|
|||||||
}
|
}
|
||||||
delay(10);
|
delay(10);
|
||||||
iterations++;
|
iterations++;
|
||||||
if (iterations % 64 == 0) {
|
if (iterations > 64 && iterations % 64 == 0) { // (( == 0) {
|
||||||
//gaussian_blur();
|
//gaussian_blur();
|
||||||
box_blur();
|
//box_blur();
|
||||||
|
;
|
||||||
}
|
}
|
||||||
if (iterations >= NUM_ITERATIONS) {
|
if (iterations >= NUM_ITERATIONS) {
|
||||||
init_attractant();
|
init_attractant();
|
||||||
|
Loading…
Reference in New Issue
Block a user