вот тут не понял))) что вы хотите получить ?
задача получать бесконечное количество новых рисунков ? (и если да не проблема что они не будут похожи на снежинки ?)
я загружал больше изображение, другое дело что его обрезать приходилось при выводе, и не видно рисунок полностью)))
мне легко переделывать ваш код на свою библиотеку кстате, у вас не возникает с этим сложностей ?
а то я могу сделать под вашу, но без проверки на самом дисплее не увижу если что не так…
тут чуть рандомнее
#include <TFT_eSPI.h>
#include <SPI.h>
TFT_eSPI tft = TFT_eSPI();
const int CENTER_X = 64;
const int CENTER_Y = 80;
const float Z = 200.0;
const int TFT_BL_PIN = 12;
float noiseScale = 0.05;
float animationTime = 0.0;
uint16_t palette[] = {
TFT_RED, TFT_GREEN, TFT_BLUE,
TFT_YELLOW, TFT_MAGENTA, TFT_CYAN,
TFT_WHITE, TFT_ORANGE, TFT_PURPLE,
TFT_PINK, TFT_LIGHTGREY, TFT_DARKGREY,
TFT_MAROON, TFT_NAVY, TFT_DARKGREEN,
0x7E3C, 0x0418, 0x87F0, 0x7FFF, 0xC618, 0x915C
};
const int PALETTE_SIZE = 21;
float randomOffsets[20];
float randomSpeeds[20];
float randomScales[20];
int lastPatternType = -1;
int patternCounter = 0;
void generateRandomParameters() {
for(int i = 0; i < 20; i++) {
randomOffsets[i] = random(0, 628) / 100.0;
randomSpeeds[i] = random(5, 30) / 100.0;
randomScales[i] = random(3, 15) / 10.0;
}
}
uint16_t generatePixelValue(float angle, float radius, float sector, int patternType) {
float nx = (cos(angle + sector) * radius / 80.0) * randomScales[0];
float ny = (sin(angle + sector) * radius / 80.0) * randomScales[1];
float t = animationTime * randomSpeeds[2];
float r = radius / 80.0;
int basePattern = patternType % 12;
float value = 0;
switch(basePattern) {
case 0:
value = sin(radius * randomScales[3] + sector * randomScales[4] + t + randomOffsets[0]);
break;
case 1:
value = sin(angle * (8 * randomScales[5]) + radius * randomScales[6] + t + randomOffsets[1]);
break;
case 2:
value = sin(nx * (8 * randomScales[7]) + t * randomSpeeds[3]) *
sin(ny * (8 * randomScales[8]) + t * randomSpeeds[4] * 0.7);
break;
case 3:
value = 0;
for(int i = 0; i < 3; i++) {
float freq = pow(randomScales[9 + i], i);
value += sin((nx * freq + t * randomSpeeds[5]) * 8 * randomScales[12]) *
sin((ny * freq + t * randomSpeeds[6]) * 8 * randomScales[13]) / freq;
}
break;
case 4:
value = sin(angle * (10 * randomScales[14])) * sin(radius * randomScales[15]) +
cos(angle * (6 * randomScales[16]) + t * randomSpeeds[7]);
break;
case 5:
value = fmod(angle * (4 * randomScales[17]) + radius * randomScales[18] + t * randomSpeeds[8], 2 * PI) / (2 * PI);
return palette[(int)(value * PALETTE_SIZE) % PALETTE_SIZE];
case 6:
value = sin(angle * (6 * randomScales[19])) * cos(radius * randomScales[0]) + sin(t * randomSpeeds[9]);
break;
case 7:
value = sin(radius * randomScales[1] - t * (2 * randomSpeeds[10])) * cos(angle * (4 * randomScales[2]) + t * randomSpeeds[11]);
break;
case 8:
value = sin(nx * 12 + randomOffsets[2]) * cos(ny * 12 + randomOffsets[3]) + sin(t * randomSpeeds[12]) * 0.5;
break;
case 9:
value = sin(radius * 0.1 + angle * 5 + t) * cos(radius * 0.05 - angle * 3) + sin(t * 0.2);
break;
case 10:
value = sin(nx * 15 + t) + sin(ny * 15 + t * 0.7) + sin((nx + ny) * 10 + t * 0.5);
value = value / 3.0;
break;
case 11:
float vortex = atan2(ny - 0.5, nx - 0.5) + radius * 0.2 + t;
value = sin(vortex * 3) * cos(radius * 0.3);
break;
}
int colorIndex = (int)((value * 0.5 + 0.5) * PALETTE_SIZE);
return palette[colorIndex % PALETTE_SIZE];
}
void setup() {
Serial.begin(115200);
pinMode(TFT_BL_PIN, OUTPUT);
analogWrite(TFT_BL_PIN, 255);
tft.init();
tft.setRotation(3);
tft.fillScreen(TFT_BLACK);
randomSeed(analogRead(0));
generateRandomParameters();
Serial.println("Дисплей инициализирован");
delay(1000);
}
void loop() {
static int patternType = 0;
static unsigned long lastTime = 0;
static unsigned long lastRandomChange = 0;
if (millis() - lastTime < 30) {
return;
}
lastTime = millis();
tft.fillScreen(TFT_BLACK);
tft.startWrite();
for (float sector = 0.0; sector < 2 * PI - PI / 6.0; sector += PI / 12) {
drawGeneratedSector(sector + randomOffsets[4] * 0.1, patternType);
}
tft.endWrite();
animationTime += 0.15;
static unsigned long patternChangeTime = 0;
if (millis() - patternChangeTime > 2000) {
patternChangeTime = millis();
patternType = random(0, 12);
patternCounter++;
if(patternCounter % 3 == 0) {
generateRandomParameters();
}
for (int i = 255; i >= 100; i -= 15) {
analogWrite(TFT_BL_PIN, i);
delay(5);
}
for (int i = 100; i <= 255; i += 15) {
analogWrite(TFT_BL_PIN, i);
delay(5);
}
}
if (millis() - lastRandomChange > 500) {
lastRandomChange = millis();
if(random(0, 100) < 30) {
randomOffsets[random(0, 5)] = random(0, 628) / 100.0;
}
}
}
void drawGeneratedSector(float S, int patternType) {
for (float f1 = 0.0; f1 <= PI / 6.0; f1 += PI / Z) {
for (int r1 = 0; r1 <= 80; r1 += 1) {
uint16_t pixelColor = generatePixelValue(f1, r1, S, patternType);
float symmetryOffset = (randomOffsets[5] * 0.1);
for (float i = symmetryOffset; i <= 2 * PI; i += PI / 6.0) {
int x1 = CENTER_X + cos(f1 + i) * r1;
int y1 = CENTER_Y + sin(f1 + i) * r1;
if (x1 >= 0 && x1 < 128 && y1 >= 0 && y1 < 160) {
tft.drawPixel(x1, y1, pixelColor);
}
int x2 = CENTER_X + cos(2 * PI - f1 + i) * r1;
int y2 = CENTER_Y + sin(2 * PI - f1 + i) * r1;
if (x2 >= 0 && x2 < 128 && y2 >= 0 && y2 < 160) {
tft.drawPixel(x2, y2, pixelColor);
}
}
}
}
}
void drawSimplePattern(int patternType) {
tft.startWrite();
for (int x = 0; x < 128; x++) {
for (int y = 0; y < 160; y++) {
float dx = x - CENTER_X;
float dy = y - CENTER_Y;
float radius = sqrt(dx*dx + dy*dy);
float angle = atan2(dy, dx);
if (radius <= 80) {
uint16_t color = generatePixelValue(angle, radius, randomOffsets[6], patternType);
tft.drawPixel(x, y, color);
}
}
}
tft.endWrite();
}
а тут куча хаоса, настолько что иногда хрень выходит + баги отлавливать еще надо
#include <TFT_eSPI.h>
#include <SPI.h>
TFT_eSPI tft = TFT_eSPI();
const int CENTER_X = 64;
const int CENTER_Y = 80;
const float Z = 200.0;
const int TFT_BL_PIN = 12;
float animationTime = 0.0;
// РАСШИРЕННАЯ ПАЛИТРА
uint16_t palette[] = {
0xF800, 0x07E0, 0x001F, 0xFFE0, 0xF81F, 0x07FF, 0xFD20, 0xB8E2,
0x7E3C, 0x0418, 0x87F0, 0x7FFF, 0xC618, 0x915C, 0xFBE0, 0x781F,
0xAFE5, 0x4A49, 0xFFF0, 0xF810, 0x07F0, 0x0010, 0xFC80, 0xFC08,
0xE71C, 0xA514, 0x8C71, 0x73AE, 0x5AEB, 0x4228, 0x2965, 0x10A2
};
const int PALETTE_SIZE = 32;
// МАССИВЫ ДЛЯ РАНДОМА
float randomOffsets[50];
float randomSpeeds[50];
float randomScales[50];
int randomBlendModes[50];
int randomSymmetry[50];
int patternHistory[20];
int patternCounter = 0;
void generateRandomParameters() {
for(int i = 0; i < 50; i++) {
randomOffsets[i] = random(0, 628) / 100.0;
randomSpeeds[i] = random(1, 50) / 100.0;
randomScales[i] = random(1, 30) / 10.0;
randomBlendModes[i] = random(0, 5);
randomSymmetry[i] = random(3, 24); // От 3 до 24 осей симметрии
}
}
// ОСНОВНАЯ ФУНКЦИЯ ГЕНЕРАЦИИ С МНОЖЕСТВОМ ВАРИАЦИЙ
uint16_t generatePixelValue(float angle, float radius, float sector, int patternType) {
float nx = cos(angle + sector) * radius / 80.0;
float ny = sin(angle + sector) * radius / 80.0;
float t = animationTime * randomSpeeds[0];
float r = radius / 80.0;
// ИСПОЛЬЗУЕМ КОМБИНАЦИЮ ИЗ 3Х РАЗНЫХ ПАТТЕРНОВ
int p1 = (patternType * 3) % 40;
int p2 = (patternType * 7) % 40;
int p3 = (patternType * 13) % 40;
float v1 = 0, v2 = 0, v3 = 0;
float blend1 = randomScales[10];
float blend2 = randomScales[11];
float blend3 = 1.0 - blend1 - blend2;
if(blend3 < 0) blend3 = 0.2;
// 40 РАЗНЫХ БАЗОВЫХ ПАТТЕРНОВ
switch(p1) {
// Оригинальные паттерны
case 0: v1 = sin(radius * 0.3 + sector + t); break;
case 1: v1 = sin(angle * 8 + radius * 0.15 + t); break;
case 2: v1 = sin(nx * 8 + t) * sin(ny * 8 + t * 0.7); break;
case 3: v1 = sin(nx * 12) * sin(ny * 12) + sin(t) * 0.3; break;
case 4: v1 = sin(angle * 10) * sin(radius * 0.4) + cos(angle * 6 + t); break;
case 5: v1 = fmod(angle * 4 + radius * 0.15 + t, 2 * PI) / (2 * PI); break;
case 6: v1 = sin(angle * 6) * cos(radius * 0.25) + sin(t * 0.5); break;
case 7: v1 = sin(radius * 0.2 - t * 2) * cos(angle * 4 + t); break;
// Новые волновые паттерны
case 8: v1 = sin(nx * 20 + t) + cos(ny * 20 + t * 0.3); break;
case 9: v1 = sin((nx + ny) * 15 + t) * cos((nx - ny) * 10); break;
case 10: v1 = sin(nx * nx * 8 + t) * cos(ny * ny * 8); break;
case 11: v1 = sin(nx * 30) * sin(ny * 30) * sin(t * 0.5); break;
// Фракталоподобные
case 12: v1 = sin(nx * 4) + sin(ny * 4) * 0.5 + sin((nx + ny) * 8) * 0.25; break;
case 13: v1 = sin(nx * 16) * cos(ny * 16) + sin((nx + ny) * 32) * 0.3; break;
case 14: v1 = fmod(nx * ny * 100 + t * 10, 1.0) * 2 - 1; break;
// Геометрические
case 15: v1 = (fmod(angle * 20, 1.0) > 0.5) ? 1.0 : -1.0; break;
case 16: v1 = (fmod(radius * 2, 1.0) > 0.5) ? 0.8 : -0.8; break;
case 17: v1 = sin(floor(nx * 10) + floor(ny * 10) + t); break;
// Звездные/взрывные
case 18: v1 = sin(radius * 10 - t * 3) / (radius * 2 + 0.1); break;
case 19: v1 = cos(angle * 12 + radius * 5) * exp(-radius * 0.5); break;
case 20: v1 = sin(radius * 15 - angle * 8 + t * 2); break;
// Спиральные
case 21: v1 = sin(angle * 5 + radius * 10 + t); break;
case 22: v1 = cos(angle * 8 - radius * 8 + t * 1.5); break;
case 23: v1 = sin(log(radius + 0.1) * 20 + angle * 10 + t); break;
// Кристаллоподобные
case 24: v1 = sin(nx * 24) * sin(ny * 24) + sin((nx + ny) * 12); break;
case 25: v1 = cos(nx * 24 + t) + sin(ny * 24 - t); break;
case 26: v1 = sin(nx * 36) * cos(ny * 36) * 0.5 + 0.5; break;
// Хаотичные
case 27: v1 = fmod(nx * ny * 50 + t * 5, 1.0); break;
case 28: v1 = sin(nx * 40 + t) * sin(ny * 40 + t * 0.7) * sin((nx + ny) * 20); break;
case 29: v1 = (sin(nx * 50) > 0) ? 0.7 : -0.7; break;
// Модулированные
case 30: v1 = sin(radius * 5 + t) * cos(angle * 15); break;
case 31: v1 = sin(angle * 20) * (1 - radius * 0.8); break;
case 32: v1 = sin(radius * 8 + angle * 8) * cos(t * 0.5); break;
// Пульсирующие
case 33: v1 = sin(radius * 4 - t * 2) * sin(angle * 8 + t); break;
case 34: v1 = cos(radius * 3 + t) * cos(angle * 6 - t * 0.5); break;
case 35: v1 = sin(radius * 6 + t * 3) * sin(angle * 12); break;
// Радиальные градиенты
case 36: v1 = 1.0 - radius / 80.0; break;
case 37: v1 = radius / 80.0; break;
case 38: v1 = (sin(radius * 0.5 + t) + 1) * 0.5; break;
case 39: v1 = fmod(angle * 8 + radius * 0.2 + t, 2 * PI) / (2 * PI); break;
}
switch(p2) {
case 0: v2 = cos(radius * 0.25 + sector * 0.5 - t); break;
case 1: v2 = sin(angle * 12 + radius * 0.2 + t * 0.8); break;
case 2: v2 = cos(nx * 12 - t) * cos(ny * 12 + t * 0.5); break;
case 3: v2 = sin(nx * 8) * cos(ny * 8) + cos(t); break;
case 4: v2 = sin(angle * 8 + radius * 0.6) * cos(angle * 4 - t); break;
case 5: v2 = fmod(angle * 6 - radius * 0.1 - t, 2 * PI) / (2 * PI); break;
case 6: v2 = cos(angle * 10) * sin(radius * 0.35) + cos(t * 0.7); break;
case 7: v2 = cos(radius * 0.3 + t * 1.5) * sin(angle * 6 - t); break;
case 8: v2 = sin((nx - ny) * 25 + t) * cos((nx + ny) * 15); break;
case 9: v2 = sin(ny * 30 - t) + cos(nx * 30 + t * 0.4); break;
case 10: v2 = sin(radius * 0.5) * cos(angle * 20) + sin(t); break;
case 11: v2 = fmod(radius * 0.3 * angle * 10 + t, 1.0); break;
case 12: v2 = sin(nx * 12) * sin(ny * 12) + sin((nx - ny) * 24); break;
case 13: v2 = sin(nx * 20 + t) * 0.7 + sin(ny * 20 - t) * 0.3; break;
case 14: v2 = sin(nx * ny * 40 + t * 2); break;
case 15: v2 = (fmod(angle * 30, 1.0) > 0.3) ? 0.9 : -0.9; break;
case 16: v2 = (fmod(radius * 5, 1.0) < 0.2) ? 1.0 : -0.5; break;
case 17: v2 = sin(floor(nx * 15) * floor(ny * 15) + t * 2); break;
case 18: v2 = cos(radius * 12 + t * 2) / (radius + 0.2); break;
case 19: v2 = sin(angle * 15 - radius * 8 + t * 1.5); break;
case 20: v2 = cos(radius * 20 - t * 3) * sin(angle * 10); break;
case 21: v2 = sin(angle * 7 + radius * 12 - t); break;
case 22: v2 = cos(angle * 9 - radius * 9 + t * 2); break;
case 23: v2 = sin(log(radius + 0.2) * 30 + angle * 15); break;
case 24: v2 = cos(nx * 30) * cos(ny * 30) + sin((nx - ny) * 20); break;
case 25: v2 = sin(nx * 32 - t * 1.5) * cos(ny * 32 + t); break;
case 26: v2 = sin(nx * 48) * sin(ny * 48) * 0.7; break;
case 27: v2 = fmod(nx * nx * 80 + ny * ny * 80 + t * 8, 1.0); break;
case 28: v2 = cos(nx * 60) * sin(ny * 60) * sin(t); break;
case 29: v2 = (cos(nx * 70) > 0.5) ? 0.8 : -0.8; break;
case 30: v2 = sin(radius * 7 - t * 1.5) * sin(angle * 20); break;
case 31: v2 = cos(angle * 25) * (0.7 - radius * 0.6); break;
case 32: v2 = sin(radius * 10 - angle * 12) * cos(t * 0.8); break;
case 33: v2 = sin(radius * 5 + t * 2.5) * cos(angle * 10 - t); break;
case 34: v2 = cos(radius * 4 - t * 1.8) * sin(angle * 8 + t * 0.7); break;
case 35: v2 = sin(radius * 8 - t * 4) * cos(angle * 16); break;
case 36: v2 = 0.8 - radius / 100.0; break;
case 37: v2 = radius / 60.0; break;
case 38: v2 = (cos(radius * 0.8 - t) + 1) * 0.5; break;
case 39: v2 = fmod(angle * 12 - radius * 0.3 + t * 2, 2 * PI) / (2 * PI); break;
}
switch(p3) {
case 0: v3 = tan(radius * 0.1 + t) * 0.1; break;
case 1: v3 = sin(angle * 20 + radius * 0.5) * 0.5; break;
case 2: v3 = cos((nx + ny) * 20 + t * 0.6); break;
case 3: v3 = sin(nx * 40) * 0.3 + cos(ny * 40) * 0.3; break;
case 4: v3 = sin(angle * 25) * cos(radius * 0.8) * 0.7; break;
case 5: v3 = fmod(angle * 10 + t * 3, 1.0); break;
case 6: v3 = sin(angle * 15) * sin(radius * 0.9) + cos(t); break;
case 7: v3 = sin(radius * 0.5 - t) * cos(angle * 12 + t * 0.5); break;
case 8: v3 = sin((nx * 2 + ny) * 40 + t) * 0.4; break;
case 9: v3 = sin(nx * 50 - t * 0.8) * sin(ny * 50 + t * 0.3); break;
case 10: v3 = sin(radius * 0.8) * cos(angle * 30) * 0.6; break;
case 11: v3 = fmod(radius * angle * 200 + t * 5, 1.0) * 2 - 1; break;
case 12: v3 = sin(nx * 25) * 0.5 + cos(ny * 25) * 0.5; break;
case 13: v3 = sin((nx + ny) * 35 + t) * 0.6; break;
case 14: v3 = sin(nx * ny * 60 + t * 3) * 0.4; break;
case 15: v3 = (fmod(angle * 40, 1.0) > 0.7) ? 0.7 : -0.4; break;
case 16: v3 = (fmod(radius * 8, 1.0) < 0.1) ? 0.9 : -0.3; break;
case 17: v3 = cos(floor(nx * 20) + floor(ny * 20) + t); break;
case 18: v3 = sin(radius * 18 - t * 4) * 0.5; break;
case 19: v3 = cos(angle * 20 - radius * 12) * 0.7; break;
case 20: v3 = sin(radius * 25 + t * 2) * cos(angle * 15); break;
case 21: v3 = sin(angle * 12 + radius * 18 - t * 1.5) * 0.6; break;
case 22: v3 = cos(angle * 14 - radius * 14 + t) * 0.7; break;
case 23: v3 = sin(log(radius + 0.3) * 40 + angle * 20) * 0.5; break;
case 24: v3 = sin(nx * 40) * sin(ny * 40) * 0.5; break;
case 25: v3 = cos(nx * 45 - t) * 0.6; break;
case 26: v3 = sin(nx * 60) * cos(ny * 60) * 0.5; break;
case 27: v3 = fmod(nx * ny * 100 + t * 10, 1.0); break;
case 28: v3 = sin(nx * 80) * 0.3 + cos(ny * 80) * 0.3; break;
case 29: v3 = (sin(nx * 90) > 0.7) ? 0.6 : -0.5; break;
case 30: v3 = sin(radius * 12 - t) * 0.5; break;
case 31: v3 = cos(angle * 35) * (0.5 - radius * 0.4); break;
case 32: v3 = sin(radius * 15 + angle * 18) * 0.5; break;
case 33: v3 = sin(radius * 7 + t * 3) * cos(angle * 14 - t * 0.8); break;
case 34: v3 = cos(radius * 6 - t * 2.2) * 0.7; break;
case 35: v3 = sin(radius * 12 - t * 5) * sin(angle * 24) * 0.6; break;
case 36: v3 = 0.5 - radius / 160.0; break;
case 37: v3 = radius / 100.0; break;
case 38: v3 = (sin(radius * 1.2 + t * 2) + 1) * 0.4; break;
case 39: v3 = fmod(angle * 16 + radius * 0.5 + t * 3, 2 * PI) / (2 * PI); break;
}
// РАЗНЫЕ СПОСОБЫ СМЕШИВАНИЯ
float result = 0;
int blendMode = randomBlendModes[patternType % 50];
switch(blendMode) {
case 0: result = v1 * blend1 + v2 * blend2 + v3 * blend3; break;
case 1: result = (v1 + v2 + v3) / 3.0; break;
case 2: result = max(v1, max(v2, v3)); break;
case 3: result = min(v1, min(v2, v3)); break;
case 4: result = v1 * v2 * v3; break;
case 5: result = sin(v1 * PI) * cos(v2 * PI) + v3 * 0.5; break;
case 6: result = (v1 > 0 ? v1 : v2) * 0.7 + v3 * 0.3; break;
case 7: result = fmod(v1 * 10 + v2 * 5 + v3 * 2, 1.0); break;
}
// ИНВЕРТИРУЕМ ИНОГДА
if(randomScales[12] > 1.5) result = -result;
int colorIndex = (int)((result * 0.5 + 0.5) * PALETTE_SIZE);
if(colorIndex < 0) colorIndex = 0;
if(colorIndex >= PALETTE_SIZE) colorIndex = PALETTE_SIZE - 1;
return palette[colorIndex];
}
void setup() {
Serial.begin(115200);
pinMode(TFT_BL_PIN, OUTPUT);
analogWrite(TFT_BL_PIN, 255);
tft.init();
tft.setRotation(3);
tft.fillScreen(TFT_BLACK);
randomSeed(analogRead(0));
generateRandomParameters();
Serial.println("Дисплей инициализирован");
delay(1000);
}
void loop() {
static int patternType = 0;
static unsigned long lastTime = 0;
static unsigned long lastRandomChange = 0;
if (millis() - lastTime < 25) {
return;
}
lastTime = millis();
tft.fillScreen(TFT_BLACK);
tft.startWrite();
// РАЗНОЕ КОЛИЧЕСТВО СЕКТОРОВ ДЛЯ РАЗНООБРАЗИЯ
int symmetry = randomSymmetry[patternType % 50];
float sectorStep = 2 * PI / symmetry;
for (float sector = 0.0; sector < 2 * PI; sector += sectorStep) {
drawGeneratedSector(sector + randomOffsets[4] * 0.2, patternType);
}
tft.endWrite();
animationTime += randomSpeeds[1]; // РАЗНАЯ СКОРОСТЬ АНИМАЦИИ
// МЕНЯЕМ ПАТТЕРН БЫСТРО И СЛУЧАЙНО
static unsigned long patternChangeTime = 0;
if (millis() - patternChangeTime > 1200) { // Каждые 1.2 секунды
patternChangeTime = millis();
patternType = random(0, 200); // ОГРОМНЫЙ ВЫБОР ПАТТЕРНОВ
patternCounter++;
// ПОЛНОСТЬЮ МЕНЯЕМ ПАРАМЕТРЫ КАЖДЫЙ РАЗ
if(patternCounter % 2 == 0) {
generateRandomParameters();
}
// БЫСТРОЕ МИГАНИЕ
for (int i = 255; i >= 80; i -= 25) {
analogWrite(TFT_BL_PIN, i);
delay(3);
}
for (int i = 80; i <= 255; i += 25) {
analogWrite(TFT_BL_PIN, i);
delay(3);
}
}
// ПОСТОЯННЫЕ СЛУЧАЙНЫЕ ИЗМЕНЕНИЯ
if (millis() - lastRandomChange > 300) {
lastRandomChange = millis();
if(random(0, 100) < 40) {
int idx = random(0, 20);
randomOffsets[idx] = random(0, 628) / 100.0;
randomSpeeds[idx] = random(1, 50) / 100.0;
randomScales[idx] = random(1, 30) / 10.0;
}
}
}
void drawGeneratedSector(float S, int patternType) {
int symmetry = randomSymmetry[patternType % 50];
float step = PI / Z;
for (float f1 = 0.0; f1 <= PI / 6.0; f1 += step) {
for (int r1 = 0; r1 <= 80; r1 += 1) {
uint16_t pixelColor = generatePixelValue(f1, r1, S, patternType);
float symmetryOffset = randomOffsets[5] * 0.2;
for (int i = 0; i < symmetry; i++) {
float angle = (2 * PI / symmetry) * i + symmetryOffset;
int x1 = CENTER_X + cos(f1 + angle) * r1;
int y1 = CENTER_Y + sin(f1 + angle) * r1;
if (x1 >= 0 && x1 < 128 && y1 >= 0 && y1 < 160) {
tft.drawPixel(x1, y1, pixelColor);
}
int x2 = CENTER_X + cos(2 * PI - f1 + angle) * r1;
int y2 = CENTER_Y + sin(2 * PI - f1 + angle) * r1;
if (x2 >= 0 && x2 < 128 && y2 >= 0 && y2 < 160) {
tft.drawPixel(x2, y2, pixelColor);
}
}
}
}
}
void drawSimplePattern(int patternType) {
tft.startWrite();
for (int x = 0; x < 128; x++) {
for (int y = 0; y < 160; y++) {
float dx = x - CENTER_X;
float dy = y - CENTER_Y;
float radius = sqrt(dx*dx + dy*dy);
float angle = atan2(dy, dx);
if (radius <= 80) {
uint16_t color = generatePixelValue(angle, radius, randomOffsets[6], patternType);
tft.drawPixel(x, y, color);
}
}
}
tft.endWrite();
}
но делать фото что бы показать я не осилю)))