#include <Adafruit_GFX.h>
#include <Adafruit_GC9A01A.h>
#include <SPI.h>

#define TFT_DC 17
#define TFT_CS 16
/*
  SCL   --> 18 (SCK)
  SDA   --> 23 (MOSI)
  RST   --> EN
*/

Adafruit_GC9A01A tft(TFT_CS, TFT_DC);

// Константы координат смещения центра
const int CENTER_X = 120;
const int CENTER_Y = 120;
int r1 = 0;
float f1 = 0;

void setup() {
  // Инициализация генератора случайных чисел
  randomSeed(analogRead(32));
  tft.begin();
  tft.fillScreen(GC9A01A_BLUE);
  // tft.cp437(true);
  tft.setRotation(1);
}

void loop() {
  for (int i = 0; i < 15; i++) {
    int r2 = random(0, 110); float f2 = (random(0, 101) / 100.0) * (PI / 6.0);
    drawLineSnowflake(r1, f1, r2 , f2);
    r1 = r2; f1 = f2;
    delay(300);
  }
  delay(2000);
  tft.fillScreen(GC9A01A_BLUE);
  delay(300);
}
////////////////////////////////////
//функция построения отрезка в полярных координатах с центром в центре экрана
void drawLinePol(int r1, float f1, int r2, float f2) {
  tft.drawLine(
    CENTER_X + cos(f1) * r1,
    CENTER_Y + sin(f1) * r1,
    CENTER_X + cos(f2) * r2,
    CENTER_Y + sin(f2) * r2,
    GC9A01A_WHITE
  );
}
//////////////////////////////////
//функция построения 12 отсимметриченных отрезков снежинки по базовому отрезку
void drawLineSnowflake (int r1, float f1, int r2, float f2) {
  if (r1 > 120 || r2 > 120 || r1 < 0 || r2 < 0 || f1 < 0.0 || f2 < 0.0 || f1 > PI / 6.0 || f2 > PI / 6) {
    return; //условие рисования базового отрезка в допустимых значениях аргументов (0-120 пикселей радиус, 0-PI/6 угол(сектор))
  }
  for (float i = 0.01; i < 2 * PI; i += PI / 3.0) {
    drawLinePol(r1, f1 + i, r2, f2 + i);
    drawLinePol(r1, 2 * PI - f1 + i, r2, 2 * PI - f2 + i);
  }
}
//////////////////////////////////
