/*
Binary tree op 480x320 display - simuleert natuurlijk groei
Theta=30 graden; r=0.7 - beide met random verstoringen per tak
Volgorde waarin de twee afgesplitste takken worden getekend is ook random per splitsing
*/
#include <SPI.h>
#include <SD.h>
#include "Adafruit_GFX.h"
#include "Adafruit_HX8357.h"
#define TFT_CS 10
#define TFT_DC 9
// #define TFT_RST 8
#define TFT_RST -1 // dan hoef je RST niet te verbinden
uint16_t kleur;
int leaf = 8; // grenswaarde taklengte bij bepaling kleur
float d2r = 3.14159265/180.0; // factor om graden naar radialen om te rekenen
// schermconstanten:
const int pHor = 480;
const int pVer = 320;
// boomconstanten:
const int startL = 100; // lengte lijn generatie 0
const int H = 30; // standaard hoek tussen parent en child
const int dH = 6; // range random afwijkingshoek: [-15,15]
float r = 0.7; // verkleiningsfactor
float dr = 0.03; // random factorafwijking: -0.03, 0 of +0.03
// recursiediepte:
#define max_gen 12
int X[max_gen+1]; // X[i] is x-coordinaat eindpunt van generatie i (in huidige tak)
int Y[max_gen+1]; // Y[i] is y-coordinaat eindpunt van generatie i (in huidige tak)
int A[max_gen+1]; // A[i] is de hoek tussen de lijn van generatie i en de positive x-as (in huidige tak)
int L[max_gen+1]; // L[i] bevat de lengte van parent lijn (generatie i)
int gen_status[max_gen+1]; // houdt bij hoeveel level i+1 lijnen er op 'level i parent' zijn getekend
int cur_gen;
Adafruit_HX8357 tft = Adafruit_HX8357(TFT_CS, TFT_DC, TFT_RST);
void setup() {
// initialisaties invariables:
L[0] = startL;
X[0] = 240;
Y[0] = 250;
A[0] = 90;
tft.begin(HX8357D);
tft.setRotation(3); // landscape
tft.fillScreen(HX8357_BLACK);
// teken lijn generatie 0
tft.drawLine(X[0],Y[0],X[0],Y[0]+60,HX8357_GREEN);
randomSeed(analogRead(0));
}
void loop() {
// verse start
cur_gen = 0;
gen_status[0] = 0;
//tft.fillScreen(HX8357_BLACK);
while (gen_status[0]!=3 || cur_gen>0) {
draw(cur_gen);
}
// we zijn klaar;
while(1) delay(1000);
}
boolean draw(int gen) {
// tekent (indien mogelijk) een van de afsplitsingen van generatie gen+1 op basis van positie en status van tak gen
int dice = random(2);
if (gen_status[gen] == 3 || gen > max_gen-1) {
cur_gen--;
}
else if (gen_status[gen] == 2 || (gen_status[gen] == 0 && dice == 0)) {
// teken rechter tak van generatie gen+1
// pas X[gen+1], Y[gen+1] en A[gen+1] aan
A[gen+1] = A[gen]-H+random(-dH,dH+1);
L[gen+1] = L[gen]*(r+random(-1,2)*dr);
X[gen+1]=X[gen]+L[gen+1]*cos(d2r*A[gen+1]);
Y[gen+1]=Y[gen]-L[gen+1]*sin(d2r*A[gen+1]);
if (L[gen+1]<leaf) {
kleur = HX8357_RED;
} else {
kleur = HX8357_GREEN;
}
tft.drawLine(X[gen],Y[gen],X[gen+1],Y[gen+1],kleur);
gen_status[gen]+=1; // nu R tak van generatie gen+1 getekend vanuit parent gen
cur_gen++;
gen_status[cur_gen] = 0;
}
else if (gen_status[gen] == 1 || (gen_status[gen] == 0 && dice == 1)) {
// teken linker lijn van generatie gen+1
// pas X[gen+1], Y[gen+1] en A[gen+1] aan
A[gen+1] = A[gen]+H+random(-dH,dH+1);
L[gen+1] = L[gen]*(r+random(-1,2)*dr);
X[gen+1]=X[gen]+L[gen+1]*cos(d2r*A[gen+1]);
Y[gen+1]=Y[gen]-L[gen+1]*sin(d2r*A[gen+1]);
if (L[gen+1]<leaf) {
kleur = HX8357_RED;
} else {
kleur = HX8357_GREEN;
}
tft.drawLine(X[gen],Y[gen],X[gen+1],Y[gen+1],kleur);
gen_status[gen]+=2; // nu L tak van generatie gen+1 getekend vanuit parent gen
cur_gen++;
gen_status[cur_gen] = 0;
}
}