Cat hungry.png
Здравствуйте! Собираем деньги на перевод материалов по электронике(https://www.allaboutcircuits.com/education/). Реквизиты указаны здесь.

Processing:Примеры/Суммарная синусоида

Материал из Онлайн справочника
Перейти к: навигация, поиск


Перевод: Максим Кузьмин (Cubewriter)
Перевел 2686 статей для сайта.

Контакты:

Проверка/Оформление/Редактирование: Мякишев Е.А.


Ambox content.png Черновик


Описание[1]

Этот скетч создает более сложную синусоиду, суммируя несколько синусоид друг с другом.

Пример

  1. int xspacing = 8;   // как далеко должны находиться друг от друга
  2.                     // эллипсы (по горизонтальной оси)
  3. int w;              // ширина всей волны
  4. int maxwaves = 4;   // общее количество суммируемых синусоид
  5.  
  6. float theta = 0.0;
  7. float[] amplitude = new float[maxwaves];  // высота волны
  8. float[] dx = new float[maxwaves];         // значение для увеличения X
  9.                                           // (при помощи «period»
  10.                                           // и «xspacing»)
  11. float[] yvalues;   // массив для хранения данных о высоте волны
  12.                    // (не обязательно)
  13.  
  14. void setup() {
  15.   size(640, 360);
  16.   frameRate(30);
  17.   colorMode(RGB, 255, 255, 255, 100);
  18.   w = width + 16;
  19.  
  20.   for (int i = 0; i < maxwaves; i++) {
  21.     amplitude[i] = random(10,30);
  22.     float period = random(100,300); // количество пикселей
  23.                                     // между повторениями волны
  24.     dx[i] = (TWO_PI / period) * xspacing;
  25.   }
  26.  
  27.   yvalues = new float[w/xspacing];
  28. }
  29.  
  30. void draw() {
  31.   background(0);
  32.   calcWave();
  33.   renderWave();
  34. }
  35.  
  36. void calcWave() {
  37.   // увеличиваем значение «theta»
  38.   // (отвечает за скорость, с которой будет изгибаться волна):
  39.   theta += 0.02;
  40.  
  41.   // выставляем все значения высоты на «0»:
  42.   for (int i = 0; i < yvalues.length; i++) {
  43.     yvalues[i] = 0;
  44.   }
  45.  
  46.   // суммируем значения, отвечающие за высоту волн:
  47.   for (int j = 0; j < maxwaves; j++) {
  48.     float x = theta;
  49.     for (int i = 0; i < yvalues.length; i++) {
  50.       // у всех остальных волн используем косинус вместо синуса:
  51.       if (j % 2 == 0)  yvalues[i] += sin(x)*amplitude[j];
  52.       else yvalues[i] += cos(x)*amplitude[j];
  53.       x+=dx[j];
  54.     }
  55.   }
  56. }
  57.  
  58. void renderWave() {
  59.   // простой способ для отрисовки синусоиды при помощи эллипсов:
  60.   noStroke();
  61.   fill(255,50);
  62.   ellipseMode(CENTER);
  63.   for (int x = 0; x < yvalues.length; x++) {
  64.     ellipse(x*xspacing,height/2+yvalues[x],16,16);
  65.   }
  66. }

См.также

Внешние ссылки

  1. processing.org - Additive Wave by Daniel Shiffman