/*

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;

}

}