#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 delta_r = 15;//интервалы расброса координат окрестных точек
int delta_F = 70;//

int F1 = 0; //

int N = 8; //число базовых точек
int n = 10; //число окрестных точек

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

void loop() {
  //
  N = random(5, 12);//псевдослучайный выбор основных параметров снежинки-узора на 1 узор
  n = random(5, 25);
  delta_r = random(5, 20);
  delta_F = random(40, 100);

  //
  for (int j = 0; j < N; j++) {// цикл отстройки базовых точек
    // int r1 = random(0, 110);
    int r1;
    if (j < N / 3) {//условия псевдороста узора от центра
      r1 = random(0, 35);
    }
    if (j >= N / 3 && j < 2 * N / 3) {
      r1 = random(35, 70);
    }
    if (j >= 2 * N / 3 && j < N) {
      r1 = random(70, 110);
    }
    float f1 = (random(0, 101) / 100.0) * (PI / 6.0);
    drawPixelSnowflake(r1, f1);
    //
    for (int i = 0; i < n; i++) { //цикл отстройки окрестных точек
      //
      int r2 = random(r1 - delta_r, r1 + delta_r );
      if (r2 < 0) {
        r2 = 0;
      }
      if (r2 > 100) {
        r2 = 100;
      }
      //
      int F2 = random(F1 - delta_F, F1 + delta_F);
      if (F2 < 0) {
        F2 = 0;
      }
      if (F2 > 100) {
        F2 = 100;
      }

      float f2 = (F2 / 100.0) * (PI / 6.0);
      drawPixelSnowflake(r2, f2);

      delay(20);
    }
  }
  delay(1000);
  tft.fillScreen(GC9A01A_BLACK);
  delay(300);
}
////////////////////////////////////
//функция построения точки в полярных координатах с центром в центре экрана
void drawPixelPol(int r1, float f1) {
  tft.drawPixel(
    CENTER_X + cos(f1) * r1,
    CENTER_Y + sin(f1) * r1,
    GC9A01A_WHITE
  );
}
//////////////////////////////////
//функция построения 12 отсимметриченных точек снежинки по базовой точке
void drawPixelSnowflake (int r1, float f1) {
  if (r1 > 120  || r1 < 0 || f1 < 0.0 || f1 > PI / 6.0 ) {
    return; //условие рисования базового отрезка в допустимых значениях аргументов (0-120 пикселей радиус, 0-PI/6 угол(сектор))
  }
  for (float i = 0.01; i < 2 * PI; i += PI / 3.0) {
    drawPixelPol(r1, f1 + i);
    drawPixelPol(r1, 2 * PI - f1 + i);
  }
}
//////////////////////////////////
