Генератор роста снежинок (ГРСН)

я бы сказал настоящая магия, потому что лично я не могу осмыслить ваш код)))

Я его тоже через месяц не пойму :slight_smile:


В массиве картинки выделяется псевдослучайно сектор в 30 градусов и каждая точка его строится 12 раз (аналог: свеча меж двумя зеркалами в угол 30 градусов - даёт 11 изображений и 12 сама свеча).

ну в целом вроде понятно, еще ии может объяснить, но при этом не могу понять код)))

а может деньги рисовать ? или все таки то что их принесет!))) но для этого наверное не на этом дисплее надо делать)))

что то меня только к ним тянет))) как магнитом!
но однозначно круто, почти не тратится память… и тем более не используется sd карта…

Какая строка?

lilik в целом код понятен, но осознать его не могу))) что бы переделывать его, и делать что угодно, с этими сложениями и умножением я через время уже не понимаю что мы берем, и что делаем)))

мне все этот стол не дает покоя)))) https://aliexpress.ru/item/1005010712565432.html допустим он стоит 15к в китае, я просто ссылку сразу не смогу найти… купить его и сделать свое приложение с готовыми рисунками, или с загрузкой любых рисунков в формате текстового документа с координатами, если использовать программу гавера, поменять электронику если надо, и первые модели корпуса делать жидкой химией, хоть и дорого…

и если продавать такие столы за 20к так как функционал больше будет в нем, это зайдет у нас ?)))
или не будут покупать ? продавать через какой то озон например….
никак не могу решиться, опасаюсь потрачу время и деньги, а выхлопа не будет)))

но если вы богатый, то просто снежинки рисовать тоже можно!))))

Вот там точно надо будет от декартовых координат к полярным и обратно :slight_smile:

Проще имеющим на руках такие столы предложить более продвинутое ПО… по символической цене.
…легенда такая: купил стол, набор картинок и возможностей - фигня, сделал круче, могу продать по дешёвке приложение.

Вряд ли он даст интегрировать программу в приложение. А без этого нужно будет пользователю картинку в массив координат векторов переводить гайверовским конвертером.

опасно наверное задавать тут такие вопросы, а то и какахами закидать могут… ладно я рискну…
мне пришла идея попытаться использовать ваш код для решения задачи о 8 ферзях…
кто что думает ?)))

А как же песочный стол? Вот для начала можно попробовать гайверовский конвертер картинок “выводить на экран”.


А то как узнать какую картинку рисовать?

Кстати для сравнения слева отрисовка картинки способом-конвертером плоттера, справа гайверовским конвертером.

стол это стол, я многоядерный, еще и бабочку летающую хочу сделать)))
но пока что думаю над алгоритмом размещения ферзей

а ссылка есть на готовый инструмент ?)))
что бы потом скармливать координаты esp, а она их рисовала

вы видели там он ее обновил еще, это вы недавно там конвертировали или уже давно ?
хотел найти фото что бы самому попытаться повторить и посмотреть что будет, но оригинальное фото в сети вашего кота не нашел

Вот космонавт


В качестве алгоритма реализации, одного из многих, выбран следующий: файл исходного изображения конвертируем в файл с расширением .plt, полученный файл открываем с помощью приложения notepad++ и немного редактируем текст, вставляем текст в скетч, загружаем в плату и производим рисование картинки. Такой подход оставляет макет автономным устройством, не требующим подключения к ПК или наличия карты хранения файла.

1 лайк

у меня вот что выходит, но главное рисунок одной линией!))) без поднятия шарика- пера

вы точно новые фото только что сделанные скидываете ?))) там конструктор этот претерпел изменения, и куча настроек есть еще
https://alexgyver.github.io/MagicGyver/ но главное это получение координат, для движения по ним

Нет, это старые и не конвертер Гайвера, а другой способ получения - плоттерный.
Вот кот и трансформация по Гайверу с отрисовкой


А вот метод плоттера

Ясный пень :)…главное это научиться сначала на дисплей выводить, потом на рисовалку, потом на песок.
… и всё на основе одного файла векторов.

вы если захотите вернуться к этому проекту, учтите гайвер поправил проект

естественно это хуже, но есть координаты и можно выводить!)))

#include <TFT_eSPI.h>
#include <SPI.h>

TFT_eSPI tft = TFT_eSPI();

// ==== РАЗМЕРЫ ====
#define BOARD_SIZE 8
#define CELL_SIZE 15
#define QUEEN_SIZE 6
#define NUM_SOLUTIONS 12

// Координаты доски на экране
#define BOARD_X 4
#define BOARD_Y 4

// Известные решения задачи 8 ферзей
const int solutions[NUM_SOLUTIONS][BOARD_SIZE] = {
  {0, 4, 7, 5, 2, 6, 1, 3},  // Решение 1
  {0, 5, 7, 2, 6, 3, 1, 4},  // Решение 2
  {0, 6, 3, 5, 7, 1, 4, 2},  // Решение 3
  {0, 6, 4, 7, 1, 3, 5, 2},  // Решение 4
  {1, 3, 5, 7, 2, 0, 6, 4},  // Решение 5
  {1, 4, 6, 0, 2, 7, 5, 3},  // Решение 6
  {1, 4, 6, 3, 0, 7, 5, 2},  // Решение 7
  {1, 5, 0, 6, 3, 7, 2, 4},  // Решение 8
  {1, 5, 7, 2, 0, 3, 6, 4},  // Решение 9
  {1, 6, 2, 5, 7, 4, 0, 3},  // Решение 10
  {1, 6, 4, 7, 0, 3, 5, 2},  // Решение 11
  {1, 7, 5, 0, 2, 4, 6, 3}   // Решение 12
};

int currentSolution = 0;
int currentQueen = 0; // Текущий ферзь для отображения (0-7)
unsigned long lastTime = 0;
const int animationDelay = 300; // Задержка между ферзями
unsigned long solutionShowTime = 0;
const int solutionShowDuration = 3000; // Показывать решение 3 секунды

void setup() {
  Serial.begin(115200);

  tft.init();
  tft.setRotation(3);
  tft.fillScreen(TFT_BLACK);

  #ifdef TFT_BL
  pinMode(TFT_BL, OUTPUT);
  digitalWrite(TFT_BL, HIGH);
  #endif
}

// Нарисовать шахматную доску
void drawChessBoard() {
  // Очищаем область доски
  tft.fillRect(BOARD_X, BOARD_Y, 
               CELL_SIZE * BOARD_SIZE, 
               CELL_SIZE * BOARD_SIZE, 
               TFT_BLACK);
  
  // Рисуем клетки доски
  for (int row = 0; row < BOARD_SIZE; row++) {
    for (int col = 0; col < BOARD_SIZE; col++) {
      int x = BOARD_X + col * CELL_SIZE;
      int y = BOARD_Y + row * CELL_SIZE;
      
      // Чередование цветов клеток
      if ((row + col) % 2 == 0) {
        tft.fillRect(x, y, CELL_SIZE, CELL_SIZE, TFT_WHITE);
      } else {
        tft.fillRect(x, y, CELL_SIZE, CELL_SIZE, tft.color565(0, 100, 0));
      }
      
      // Рамка клетки
      tft.drawRect(x, y, CELL_SIZE, CELL_SIZE, TFT_BLACK);
    }
  }
}

// Нарисовать ферзя на указанной позиции
void drawQueen(int row, int col) {
  int centerX = BOARD_X + col * CELL_SIZE + CELL_SIZE / 2;
  int centerY = BOARD_Y + row * CELL_SIZE + CELL_SIZE / 2;
  
  // Рисуем красный круг
  tft.fillCircle(centerX, centerY, QUEEN_SIZE, TFT_RED);
  
  // Черная обводка
  tft.drawCircle(centerX, centerY, QUEEN_SIZE, TFT_BLACK);
  
  // Белая буква Q
  tft.setTextColor(TFT_WHITE);
  tft.setTextSize(1);
  tft.setCursor(centerX - 3, centerY - 4);
  tft.print("Q");
}

// Отобразить текущее решение
void drawCurrentSolution() {
  drawChessBoard();
  
  // Рисуем всех ферзей текущего решения
  for (int i = 0; i <= currentQueen; i++) {
    int row = i; // Каждый ферзь в своей строке
    int col = solutions[currentSolution][row];
    drawQueen(row, col);
  }
  
  // Отображаем информацию
  tft.fillRect(0, BOARD_Y + CELL_SIZE * BOARD_SIZE + 5, 128, 30, TFT_BLACK);
  
  tft.setTextColor(TFT_WHITE);
  tft.setTextSize(1);
  tft.setCursor(5, BOARD_Y + CELL_SIZE * BOARD_SIZE + 5);
  tft.print("Solution ");
  tft.print(currentSolution + 1);
  tft.print("/");
  tft.print(NUM_SOLUTIONS);
  
  tft.setCursor(5, BOARD_Y + CELL_SIZE * BOARD_SIZE + 15);
  tft.print("Queens: ");
  tft.print(currentQueen + 1);
  tft.print("/8");
}

// Начать новое решение
void startNewSolution() {
  currentQueen = 0;
  drawCurrentSolution();
  solutionShowTime = 0; // Сбрасываем таймер показа
}

void loop() {
  unsigned long currentTime = millis();
  
  if (solutionShowTime == 0) {
    // Фаза появления ферзей
    if (currentTime - lastTime > animationDelay) {
      lastTime = currentTime;
      
      if (currentQueen < 7) {
        currentQueen++;
        drawCurrentSolution();
      } else {
        // Все ферзи размещены, начинаем отсчет времени показа
        solutionShowTime = currentTime;
      }
    }
  } else {
    // Фаза показа готового решения
    if (currentTime - solutionShowTime > solutionShowDuration) {
      // Переходим к следующему решению
      currentSolution = (currentSolution + 1) % NUM_SOLUTIONS;
      startNewSolution();
    }
  }
}

а для ферзей вашу математическую магию снежинок не применить ?)))
что бы и доску увеличивать и быстро искать решения но не перебором!

там все го то циферки надо как то передвигать…)))

Вы смотрели сколько у вашего котика с таким качеством отрезков в построении?

Ну с экрана 160х128 и надо начинать.
Вот кстати мысль - вместо бумаги и фломастера планшет за 500р. и стилус

это еще надо все собирать, еще и механику искать, я лучше бы тогда на дисплее большом сделал бы, и на меге а на на есп32 код который выше скидывал

дофига, но тут главная фишка что вся механика скрыта, и ты наблюдаешь как шарик работает, а на это вроде можно смотреть вечно!)))
и в конечном итоге вроде получается не плохой рисунок…

вот

но снежинка не вмещается))) слишком малое разрешение


Около 10000 точек по две координаты, по 2 байта каждая.

Эти картинки влезут.

да, но !))) у нас есть sd карта, и мы с нее берем координаты, там целых 4гб памяти! а потом пусть потомки голову ломают как улучшать этот проект, и найти еще место))) а пока что просто надо добавлять sd карту в проекты

А Вы себе представляете, сколько времени Ардуина эти 4 ГБ будет вычитывать?