After thinking about it, I decided that it would be interesting to see how Arduboy processes fractals. Of all the fractals, I liked the classic fractal “Bernsley Fern” and decided to make a small demo…
p.s. UP/DOWN - change iterations; LEFT/RIGHT - changeScale; A/B - flipScreen
//FractalBernsly
//created @dima-78
//20230914
#include <Arduboy2.h>
Arduboy2 arduboy;
bool rotateScreen = false;
int iterations = 1;
float x, y;
int iterationCount = 1;
int scaleFactorCount = 1;
int scaleFactor = 32;
void setup() {
arduboy.begin();
arduboy.clear();
arduboy.setFrameRate(60);
arduboy.initRandomSeed();
x = arduboy.width() ;
y = arduboy.height() ;
arduboy.flipHorizontal(true);
//arduboy.flipVertical(true);
//Serial.begin(115200);
}
void loop() {
if (!arduboy.nextFrame()) {
return;
}
arduboy.pollButtons();
uint8_t iterationsChange = 2;
int minScaleFactor = 2;
int maxScaleFactor = 32;
if (arduboy.pressed(UP_BUTTON)) {
iterations += iterationsChange;
arduboy.clear();
}
if (arduboy.pressed(DOWN_BUTTON)) {
if (iterations > 1) {
iterations -= iterationsChange;
}
arduboy.clear();
}
if (arduboy.pressed(LEFT_BUTTON)) {
if (scaleFactor > minScaleFactor) {
scaleFactor--;
arduboy.clear();
}
}
if (arduboy.pressed(RIGHT_BUTTON)) {
if (scaleFactor < maxScaleFactor) {
scaleFactor++;
arduboy.clear();
}
}
if (arduboy.justPressed(A_BUTTON)) {
rotateScreen = !rotateScreen;
arduboy.flipVertical(rotateScreen);
}
if (arduboy.justPressed(B_BUTTON)) {
rotateScreen = !rotateScreen;
arduboy.flipHorizontal(rotateScreen);
//arduboy.begin();
//arduboy.clear();
}
//float x = 0;
//float y = 0;
for (int i = 0; i < iterations; i++) {
arduboy.drawPixel(y * scaleFactor, x * scaleFactor, WHITE);
int r = random(100);
if (r < 1) {
float x1 = 0;
float y1 = 0.16 * y;
x = x1;
y = y1;
}
else if (r < 86) {
float x1 = (0.85 * x) + (0.04 * y);
float y1 = (-0.04 * x) + (0.85 * y) + 1.6;
x = x1;
y = y1;
}
else if (r < 93) {
float x1 = (0.2 * x) - (0.26 * y);
float y1 = (0.23 * x) + (0.22 * y) + 1.6;
x = x1;
y = y1;
}
else {
float x1 = (-0.15 * x) + (0.28 * y);
float y1 = (0.26 * x) + (0.24 * y) + 0.44;
x = x1;
y = y1;
}
iterationCount++;
scaleFactorCount++;
if (iterations == 1) {
break; //
}
}
//debug();
arduboy.display();
}
void debug() {
Serial.print(millis()); Serial.print("\t");
Serial.print("iterationCount: "); Serial.print(iterationCount); Serial.print("\t");
Serial.print("iterations: "); Serial.print(iterations); Serial.print("\t");
Serial.print("scaleFactorCount: "); Serial.print(scaleFactor); Serial.print("\t");
Serial.print("scaleFactor: "); Serial.print(scaleFactorCount); Serial.print("\t");
Serial.print("\r\n");
}
FractalBernslyBoy.ino.hex (23.9 KB)