#include <Adafruit_GFX.h>
#include <Adafruit_GC9A01A.h>
#include <SPI.h>
#include "ris_1.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;
const float Z = 300.0; //от 100.0 до 1000.0 регулировка качества отрисовки пикселей с пропусками и без них
const struct {
  const unsigned char *bitmap;
}
uzor_[] = {ris_1, ris_2, ris_3, ris_4, ris_5, ris_6, ris_7}; // картинки


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

}

void loop() {
  //
  byte ris = random(0, 7);
  float f = (random(0, 33) / 32.0) * (2 * PI - PI / 6.0);
  int dr = random(0, 120);
  draw_RisSektor(f, dr, uzor_[ris].bitmap );
  delay(500);
  /*
    for (byte ris = 0; ris < 2 ; ris++) {
    for (float f = 0.0; f < 2 * PI - PI / 6.0 ; f += PI / 16) {
      for (int dr = 0; dr < 120; dr += 10) {
        draw_RisSektor(f, dr, uzor_[ris].bitmap );
        delay(500);
      }
    }
    }
  */
}
//////////////////////////////////////
//функция вывода 12 отсимметриченных секторов узора по базовому сектору картинки
void draw_RisSektor(float S, int dR, const uint8_t *bitmap) {
  for (float f1 = 0.0; f1 <= PI / 6.0; f1 += PI / Z) {
    for (int r1 = 0; r1 <= 120 ; r1 += 1) {
      int dX; int dY;
      if ( cos(f1 + S) >= 0) {
        dX = -dR;
      } else {
        dX = dR;
      }
      if ( sin(f1 + S) >= 0) {
        dY = -dR;
      } else {
        dY = dR;
      }

      int x = CENTER_X + cos(f1 + S) * r1 + dX ;//координаты данных цвета пикселя в массиве
      int y = CENTER_Y + sin(f1 + S) * r1 + dY ;

      for (float i = 0.01; i <= 2 * PI; i += PI / 3.0) {
        int x1 = CENTER_X + cos(f1 + i) * r1;// координаты точки в базовом секторе
        int y1 = CENTER_Y + sin(f1 + i) * r1;
        tft.drawPixel(x1, y1, 256 * bitmap[2 * x + 1 + y * 2 * 240] + bitmap[2 * x + y * 2 * 240]);
        int x2 = CENTER_X + cos(2 * PI - f1 + i) * r1;//координаты точки в базовом отзеркаленном секторе
        int y2 = CENTER_Y + sin(2 * PI - f1 + i) * r1;
        tft.drawPixel(x2, y2, 256 * bitmap[2 * x + 1 + y * 2 * 240] + bitmap[2 * x + y * 2 * 240]);

      }
    }
  }
}
//////////////////////////////////////


