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

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

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


Описание[1]

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

Пример

int xspacing = 8;   // как далеко должны находиться друг от друга 
                    // эллипсы (по горизонтальной оси)
int w;              // ширина всей волны
int maxwaves = 4;   // общее количество суммируемых синусоид

float theta = 0.0;
float[] amplitude = new float[maxwaves];  // высота волны
float[] dx = new float[maxwaves];         // значение для увеличения X
                                          // (при помощи «period»
                                          // и «xspacing»)
float[] yvalues;   // массив для хранения данных о высоте волны 
                   // (не обязательно)

void setup() {
  size(640, 360);
  frameRate(30);
  colorMode(RGB, 255, 255, 255, 100);
  w = width + 16;

  for (int i = 0; i < maxwaves; i++) {
    amplitude[i] = random(10,30);
    float period = random(100,300); // количество пикселей 
                                    // между повторениями волны
    dx[i] = (TWO_PI / period) * xspacing;
  }

  yvalues = new float[w/xspacing];
}

void draw() {
  background(0);
  calcWave();
  renderWave();
}

void calcWave() {
  // увеличиваем значение «theta»
  // (отвечает за скорость, с которой будет изгибаться волна):
  theta += 0.02;

  // выставляем все значения высоты на «0»:
  for (int i = 0; i < yvalues.length; i++) {
    yvalues[i] = 0;
  }
 
  // суммируем значения, отвечающие за высоту волн:
  for (int j = 0; j < maxwaves; j++) {
    float x = theta;
    for (int i = 0; i < yvalues.length; i++) {
      // у всех остальных волн используем косинус вместо синуса:
      if (j % 2 == 0)  yvalues[i] += sin(x)*amplitude[j];
      else yvalues[i] += cos(x)*amplitude[j];
      x+=dx[j];
    }
  }
}

void renderWave() {
  // простой способ для отрисовки синусоиды при помощи эллипсов:
  noStroke();
  fill(255,50);
  ellipseMode(CENTER);
  for (int x = 0; x < yvalues.length; x++) {
    ellipse(x*xspacing,height/2+yvalues[x],16,16);
  }
}

См.также

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