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

проверил мельком))) я честно предупредил

пусть достают и подключают большие дисплеи! у них же нет такой сильной лени как у меня…

тоже да можно из лупы… сильно наверное расплывчатое изображение будет… возможно зрение сажать будет, но не соберешь не узнаешь, надо проверять)))

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

если проектор делать, наверное нужны прозрачные oled дисплеи, что бы за ними лампочку разместить… без нее наверное плохо видно будет… хотя можно попытаться и обычный дисплей подсветить…

Этот вариант нет конечно.

А вот с добавкой линзы собирающей можно попробовать. Но китайцы наверное ещё не додумались делать дисплеи tft с внешней просветкой :slight_smile:
…проще скетч-мандалу в процессинге продублировать и гонять на мониторе ПК.

Матрицу для проекторов не осилите?

Как ардуиновский модуль? :slight_smile:

Вдохновляйтесь.

Не знаю, как то криво на компьютере получается, тёмные цвета, грубый узор, МК получается мощнее чем ПК :slight_smile:
Вроде всё учёл при адаптации, но фигня в сравнении с дисплеем.

//скетч для генерации узоров
 int l=500;int h=500;//размеры окна
 // Константы координат смещения центра
 int CENTER_X = 250;
 int CENTER_Y = 250;

float Z = 1000.0; //от 100.0 до 1000.0 регулировка качества отрисовки пикселей с пропусками и без них

int NUM_POINTS = 150; // Количество точек для диаграммы Вороного
byte [] R =new byte [NUM_POINTS];//цвет компонент точек-сайтов
byte [] G =new byte [NUM_POINTS];
byte [] B =new byte [NUM_POINTS];
float [] xy =new float [2*NUM_POINTS];//координаты точек-сайтов

long Y=0;//

void setup() {
  size(500, 500,P3D);
  background(255);
 frameRate(5);//число кадров в секунду 
 
}
void draw() {
 //  
  if(keyPressed&&key == ' '){ // клавиша пробел
   save("kadr_0.png"); // фото сделать в файл с названием
  fill(255);
  rect(0, 0, 500, 500);// стереть узор
  }
//  
  if (millis() - Y > 90000L) {//новый цикл роста узоров по условие каждые 90 секунд 
   fill(255);
   rect(0, 0, 500, 500);// стереть узор
    Y=millis();
  }   
// 
draw_RisSektor();
//  
 
}
/////////////////////////////////////
//функция вычисления метрики (как вариант расстояния между двумя точками)
float dist (float x1, float y1, float x2, float y2, byte m) {
  if(m==1){}
  return (abs(x1 - x2) + abs(y2 - y1)); //Манхэттенская метрика
}
//////////////////////////////////////
// функция генерации точек (сайтов)для локусов диаграммы Вороного
void ran_Sait(byte variant) {
  for (int i = 0; i < NUM_POINTS; i++) {
    if (variant == 1 || variant == 3) {
     xy[i] = random(CENTER_X, CENTER_X + 250 );
     xy[i+1]= random(CENTER_Y, CENTER_Y + 125);
    }
    if (variant == 2 || variant == 3) {
     R[i] = (byte)(random(0,256));
     G[i] = (byte)(random(0,256));
     B[i] = (byte)(random(0,256));
    }
  }
}
//////////////////////////////////////
//функция вывода 12 отсимметриченных секторов узора по базовому сектору картинки
void draw_RisSektor() {
  for (float f1 = 0.0; f1 <= PI / 6.0; f1 += PI / Z) {
    for (int r1 = 0; r1 <= 250 ; r1 += 1) {
      float x = CENTER_X + cos(f1) * r1;
      float y = CENTER_Y + sin(f1) * r1;
      int closestPoint = 0;
      float minDist = dist(x, y, xy[0],xy[1]  );

      for (int i = 2; i < 2*NUM_POINTS; i=i+2) {
        float d = dist(x, y, xy[i], xy[i+1]  );
        if (d < minDist) {
          minDist = d;
          closestPoint = i;
        }
      }

      for (float i = 0.01; i <= 2 * PI; i += PI / 3.0) {
       // if (minDist > 25) {//условие роста степени заполнения элементов узора
            stroke(R[closestPoint],G[closestPoint],B[closestPoint]);
          float x1 = CENTER_X + cos(f1 + i) * r1;
          float y1 = CENTER_Y + sin(f1 + i) * r1;
          point(x1, y1);
          
          float x2 = CENTER_X + cos(2 * PI - f1 + i) * r1;
          float y2 = CENTER_Y + sin(2 * PI - f1 + i) * r1;
          point(x2, y2);
       // }
      }
    }
  }
  ran_Sait((byte)3);
}
//////////////////////////////////////

не хватает рандома ?))) или большой дисплей показывает все неточности ?)))

(только Манхэттенская)
float dist (float x1, float y1, float x2, float y2, byte m) {
  if(m==1){}  // Закомментировано!
  return (abs(x1 - x2) + abs(y2 - y1)); // Только Манхэттенская
}

(три варианта)
float dist(float x1, float y1, float x2, float y2, byte m) {
  if (m == 1) {
    return sqrt(pow(x1 - x2, 2) + pow(y1 - y2, 2)); // Евклидова
  }
  if (m == 2) {
    return (abs(x1 - x2) + abs(y2 - y1)); // Манхэттенская
  }
  if (m == 3) {
    return abs(abs(x1 - x2) - abs(y1 - y2)); // Авторская
  }
}

Такое извращенство из-за самого процессинга. Он просто не компилирует скетч, выдаёт ошибки по всякому поводу. Почему, лень разбираться. Без m будет ошибка :slight_smile:





Разобрался с цветом и детализацией. В общем везде ставим float, вместо int и byte :slight_smile:

На вырост, следующий шаг - генерация бабушкиного ковра.

lilik может сделаем аналог пульта hazard 7007 ?))) я уже и название придумал, killhaz
воспроизводить будем mp3 с sd карты с помощью модуля max, главные конкуренты у нас в рф, делают на ардуино нано))) и продают за 10к

кстате не попадалась отладочная плата, с встроенными модулями, дешевый, с модулем sd карты, и плеером, с Esp32 ? что бы все на одной плате было, и компактно

конвертировал wav в код, и загружал, но треки проседают сильно качеством… на пк они звучат лучше…

:slight_smile:
Разве можно сравнивать мандалу с бабушкиным ковром?


…добавить строгих линий к мандале, вот и ковёр

…ну или тарелка.
…нету генератора узора тарелок на примете?

Ты что?! А как же толкователь-пособие по мандале? К примеру, вот девочка стоит, раскинув руки, что это значит?


А забавно, берешь произвольный кусочек мандалы, кидаешь в поиск по изображения, ну хоть в тот же яндекс, и смотришь что там вылезает. Мне тут такое вылезло….

Так к генератору приделываешь веб-интерфейс и высасываешь трактование… Еще и с картинкой.

Где такую траву берёте ???

Не знаю, мне ничего кроме мандалы и пары лиц в стиле кубизма не вылезло :frowning:
…не видит ассоциаций птичих поисковик

может чуть позже ? учить что то новое надо ? или писать трактовку с 0 ?)))
а то вроде покупатели на пульты есть, но надо уточнить еще раз, и по 3 пульта в месяц могут вроде брать… (сказали вообще 5, но я делю обещанное на 2))) ) сделаем свой бренд, и качественно, и нам принесут наверное много денег))) ну это на тот случай если реально хотите встрять в непонятно во что, что бы попытаться продавать поделки на ардуино)))

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

а может это все таки икебана ?)))

Может :slight_smile:


Пятница. И вопрос такой же. Почему одни и те же математические выражения по разному реализуются в программах для ПК и МК?

/////////////////////////////////////
//функция вычисления метрики (как вариант расстояния между двумя точками)
float dist (float x1, float y1, float x2, float y2, byte m) {
  if(m==1){}
   return sqrt(pow(x1 - x2, 2) + pow(y1 - y2, 2)); //Евклидова метрика
 // return (abs(x1 - x2) + abs(y2 - y1)); //Манхэттенская метрика
 // return abs(abs(x1 - x2) - abs(y1 - y2)); // авторская метрика №1
 // return  max(abs(x1 - x2), abs(y1 - y2)); // авторская метрика №2
}
//////////////////////////////////////



Суть:

for (float i = 0.01; i <= 2 * PI; i += PI / 3.0) {
        if (minDist > 30) {//условие роста степени заполнения элементов узора
            stroke(R[closestPoint],G[closestPoint],B[closestPoint]);
          float x1 = CENTER_X + cos(f1 + i) * r1;
          float y1 = CENTER_Y + sin(f1 + i) * r1;
          point(x1, y1);
          
          float x2 = CENTER_X + cos(2 * PI - f1 + i) * r1;
          float y2 = CENTER_Y + sin(2 * PI - f1 + i) * r1;
          point(x2, y2);
        }
      }

Условие minDist > 30 даёт отрисовку точек за дистанцией в 30 пикселей, оставляя внутри дырку от бублика. Для евклидовой метрики это круг, для остальных квадрат. На фотках это хорошо видно по угловатости одних локусов и округлостям других. Но на ПК, в процессинге все варианты дыр круглые. С чем может быть связана такая вольность поведения формул в рамках до 30 пиксель по условию?

Я боюсь, Вы не совсем точно сформулировали, и под МК на самом деле подразумевается AVR.
Если это так, то на всем от 32 разрядов и выше double имеет 64 разряда, а в AVR - 32.
А по стандарту Си все промежуточные вычисления над числами с плавающей точкой выполняются в double.
Это самая первая причина различия. Вероятно, есть и другие.