andriano как то они не подходят, или я просто не знаю как сделать, отслеживать каждый пиксель через озу и заменять это слишком не выгодно, потом уже нечего не добавить в код, а если дисплей большой то вовсе не хватит памяти
если сделать функцию пакмана, которая будет проявляться на время и оставлять след за шариком, свою полосу(так как обновления дисплея там вовсе нет, и просто выводим только новые кадры) при этом сохраняя и по бокам полосы от шарика, то не могу ее скрыть, что бы на экране был виден шарик только(или по крайней мере большую часть времени)
временный буфер из нескольких пикселей который будет прокладывать(закрашивать) полосу за шариком, но не закрашивать полностью а оставлять синие края тоже не выходит…
выходит что я просто не знаю как)))
сейчас видео нейросетью делаю, что бы фото выводить которое будет оставлять след, без обновления дисплея
Отслеживать нужно не пиксели, а отрезки некоторой (вероятнее всего выбранной случайно из некоторого диапазона) длины. А, скорее, даже не сами отрезки, а узлы, из которых эти отрезки могут выходить. Т.е. точки с вещественными координатами.
Не хватит памяти - это слишком сильное утверждение. Например, на компьютере, с которого я сейчас пишу это сообщение, 32 Гбайта памяти. Мне кажется, этого должно хватить на достаточно большое количество пикселей.
Выходит.
А нужно понять две вещи:
Работать нужно не с пикселями, а с объектами, имеющими вещественные координаты.
Даже если вдруг предполагается, что ГРСН должен работать на Ардуине (что, кстати, никак не требуется по тому, как сформулирована тема), сначала нужно отладить макет на чем-то с одной стороны помощнее, а с другой - что позволяет быстрее провести цикл отладки. И только потом пытаться как-то соптимизировать, чтобы впихнуть в более скромную архитектуру.
и Еще пару соображений по задаче:
хорошо бы начать с физики реального процесса: от каких параметров зависит рост кристалла по тому или иному направлению.
вероятно, к существенным параметрам относятся температура (которая, кстати, меняется в процессе фазового перехода), влажность (которая тоже меняется), а также их градиенты.
ну а потом попытаться либо на равномерной сеточке (кстати, аналоге матрицы пикселей), либо на сетке, заданной узлами, попытаться смоделировать физический процесс кристаллизации, учитывая температуру, влажность, их изменения за счет фазовых переходов, теплопроводности и диффузии.
Вот что меня всегда удивляло в данном сообществе (не только по этому форуму, а вообще) относительно новичков и подрастающих - так это упорная борьба с глюками и разработкой именно алгоритмической части сразу в железе.
Вместо того, чтобы писать алгоритмы и большую часть кода в комфортной среде на большом компьютере с возможностью быстрой пошаговой отладки. Разделив проблемы алгоритмов и взаимодействия с аппаратурой.
Вот что меня удивляло относительно опытных и зрелых это крепкая алгоритмика, которая так и не станет правильным скетчем генерации снежинки.
…что с меня взять, я воздух по гороскопу, сегодня так, завтра иначе.
что то мне подсказывает что вы не поняли мой последний код)))
#include <TFT_eSPI.h>
#include <SPI.h>
TFT_eSPI tft = TFT_eSPI();
// Начальные координаты круга
int x = TFT_WIDTH / 2;
int y = TFT_HEIGHT / 2;
// Скорость движения
int speedX = 2;
int speedY = 1;
// Цвета
#define LIGHT_YELLOW TFT_YELLOW // Светло-желтый (для фона и внутренности круга)
#define DARK_YELLOW 0x8400 // Темно-желтый (OLIVE) для контура
#define CIRCLE_COLOR LIGHT_YELLOW // Светло-желтый круг (был TFT_RED)
// Радиус круга
#define CIRCLE_RADIUS 8
void setup() {
Serial.begin(115200);
// Инициализация дисплея
tft.init();
tft.setRotation(0); // Ориентация 0 градусов
// Включение подсветки
pinMode(TFT_BL, OUTPUT);
digitalWrite(TFT_BL, HIGH);
delay(100); // Задержка для стабилизации
// Заливаем фон светло-желтым
tft.fillScreen(LIGHT_YELLOW);
// Рисуем первый круг
drawCircleWithOutline(x, y);
}
void drawCircleWithOutline(int x, int y) {
// Рисуем контур круга (темно-желтый)
tft.drawCircle(x, y, CIRCLE_RADIUS + 1, DARK_YELLOW);
tft.drawCircle(x, y, CIRCLE_RADIUS, DARK_YELLOW);
// Рисуем круг (светло-желтый вместо красного)
tft.fillCircle(x, y, CIRCLE_RADIUS - 1, CIRCLE_COLOR);
}
void loop() {
// Обновляем координаты
x += speedX; y += speedY;
// Проверка границ
if (x <= CIRCLE_RADIUS || x >= TFT_WIDTH - CIRCLE_RADIUS) {
speedX = -speedX;
x = constrain(x, CIRCLE_RADIUS, TFT_WIDTH - CIRCLE_RADIUS); }
if (y <= CIRCLE_RADIUS || y >= TFT_HEIGHT - CIRCLE_RADIUS) {
speedY = -speedY;
y = constrain(y, CIRCLE_RADIUS, TFT_HEIGHT - CIRCLE_RADIUS); }
// Просто рисуем новый круг (старый не стирается)
tft.drawCircle(x, y, CIRCLE_RADIUS, DARK_YELLOW);
tft.fillCircle(x, y, CIRCLE_RADIUS - 1, CIRCLE_COLOR);
delay(50);
}
не фига не получилось, но если не задавать цвет шарику другой, вроде на песок похоже)))
от ии устал, я не могу ему объяснить что мне нужен шар с видом с верху и что бы на фото не было ни одной тени…
полосу ровную по размеру шара тоже не может сделать, вот что получилось более менее
теперь буду снова думать как фото превратить в G код а то математикой рисовать не выходит)))
lilik я бы в коде указал для начала привязку кода к мак адресу что бы прошивку не стырили))) а то фиг его знает пофиксили или нет кражу прошивки при подачи малого питания…
будет! а может стырим идею ?
будем выводить фото от нейросети ? каждый раз новое, и без сохранения)))
но я только предложил, сомневаюсь что я парсинг картинки осилю с сайта))) мне бы преобразование фото в G код выполнить мощностями телефона, через веб сервер esp32))
На Ютубе давным-давно смотрел фильм, там чувак делал научную работу по снежинкам.
Вопрос все тот-же: как они так растут симметрично.
Он нашел ответ. Там помоему то-ли три то-ли четыре параметра: влажность, температура, еще что-то. Он собрал девайс для выращивания снежинок заданной формы. Можно это попытаться смоделировать.
Но там будет матан. Потому, что дифуры будут. Нутром чую, но доказать не могу.
На самом деле.. на самом деле ты можешь генерировать половину луча снежинки (луч как бы разрен вдоль, по длинной оси). Она всегда будет асимметричной. Затем зеркалишь ее и получаешь один луч. Отражаешь лучи - получаешь снежинку.
Вырастить половинку луча очень просто - он растет веточкой строго вверх, иногда выдавая веточки вправо, с углом наклона к вертикальной линии от 45 до 90 градусов.
Все веточки могут быть разной толщины (и вертикальные и боковые) . Например, толщина может быть равна длине (квадратик вырастили).
Ромбики так не вырастить, да и бог с ними.
Если толщину веточки задавать, как линейную функцию, а не как рандомную константу, то можно будет выращивать ромбики, треугольники и пр.
Можно так же попробовать склеивать разные снежинки (наложить одну поверху другой)
Есть нюанс. Первая же ветка от основного луча тоже в идеале симметричная. Т.е. к ней нужно рекурсивно применять те же правила зеркального отражения. Одновременно распространять эти действия по всей снежинке может быть тяжело. Поэтому может быть применить “запись истории“ параметров генерации основного шаблона, а затем уже эти параметры копировать по всему дереву применяя зеркалирование.