#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;
bool cvet;//

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

void loop() {
  for (int i = 0; i < random(10, 25); i++) {
    int r1 = random(0, 110); float f1 = (random(0, 101) / 100.0) * (PI / 6.0);
    int r2 = random(0, 110); float f2 = (random(0, 101) / 100.0) * (PI / 6.0);
    int r3 = random(0, 110); float f3 = (random(0, 101) / 100.0) * (PI / 6.0);
    fillTriangleSnowflake(r1, f1, r2 , f2, r3, f3);
    delay(500);
  }
  // delay(3000);
  tft.fillScreen(GC9A01A_BLUE);
  delay(300);
}
////////////////////////////////////
//функция построения закрашенного треугольника в полярных координатах с центром в центре экрана
void fillTrianglePol(int r1, float f1, int r2, float f2, int r3, float f3) {

  if (cvet) {
    tft.fillTriangle(
      CENTER_X + cos(f1) * r1,
      CENTER_Y + sin(f1) * r1,
      CENTER_X + cos(f2) * r2,
      CENTER_Y + sin(f2) * r2,
      CENTER_X + cos(f3) * r3,
      CENTER_Y + sin(f3) * r3,
      GC9A01A_WHITE
    );
  }
  else {
    tft.fillTriangle(
      CENTER_X + cos(f1) * r1,
      CENTER_Y + sin(f1) * r1,
      CENTER_X + cos(f2) * r2,
      CENTER_Y + sin(f2) * r2,
      CENTER_X + cos(f3) * r3,
      CENTER_Y + sin(f3) * r3,
      GC9A01A_RED
    );
  }

}
//////////////////////////////////
//функция построения 12 отсимметриченных треугольников снежинки по базовому отрезку
void fillTriangleSnowflake (int r1, float f1, int r2, float f2, int r3, float f3) {
  if (r1 > 120 || r2 > 120 || r3 > 120 || r1 < 0 || r2 < 0 || r3 < 0 || f1 < 0.0 || f2 < 0.0 || f3 < 0.0 || f1 > PI / 6.0 || f2 > PI / 6 || f3 > PI / 6) {
    return; //условие рисования базового треугольника в допустимых значениях аргументов (0-120 пикселей радиус, 0-PI/6 угол(сектор))
  }
  cvet = random(0, 2);
  for (float i = 0.01; i < 2 * PI; i += PI / 3.0) {
    fillTrianglePol(r1, f1 + i, r2, f2 + i, r3, f3 + i);
    fillTrianglePol(r1, 2 * PI - f1 + i, r2, 2 * PI - f2 + i, r3, 2 * PI - f3 + i);
  }
}
//////////////////////////////////
