////////////////////////////////////////////////////////////////////////////////////////////////// int xD, yD, mD = 11, vFnow = 0, vCnow = 0; // глобальные переменные и их начальные значения float vDef = 1.5, vMin = 1, vMax = 8, vDelta = vMax - vMin, vP = vMax - 2; float[][] value; // двухмерный массив, но пока скорее заявка на него... color vC1 = color(0, 50, 170), vC2 = color(15, 155, 255), vC3 = color(255, 255, 255); // цвета ////////////////////////////////////////////////////////////////////////////////////////////////// void setup() // функция начальных установок { size(536, 400); // размер окна и частота рисования - draw() в нем xD = width / 8; yD = height / 8; // размерность в наших псевдо-пикселях frameRate(20); smooth(); noStroke(); // частота рисования, сглаженное, без абриса value = new float[yD][xD]; // создаем двух-мерный массив конкретного размера for (int y = 0; y < yD; y++) // заполняем значениями по умолчанию for (int x = 0; x < xD; x++) value[y][x] = vDef; }; ////////////////////////////////////////////////////////////////////////////////////////////////// float hermit (float t) // функция Эрмита y = 3*x*x - 2*x*x*x; { float t2 = t * t; return 3 * t2 - 2 * t2 * t; }; ////////////////////////////////////////////////////////////////////////////////////////////////// void mouseMoved() // функция [события] движения мыши { float r; int xx = (mouseX - 4) / 8, yy = (mouseY - 4) / 8, x1 = max(xx - mD, 0), y1 = max(yy - mD, 0), x2 = min(xx + mD, xD - 1), y2 = min(yy + mD, yD - 1); for (int y = y1; y <= y2; y++) for (int x = x1; x <= x2; x++) { r = dist(xx, yy, x, y); if (r < mD) value[y][x] = constrain(value[y][x] + hermit ((float)(mD - r) / mD), vMin, vMax); }; }; ////////////////////////////////////////////////////////////////////////////////////////////////// void keyPressed() // функция [события нажатия] клавиатуры { if (keyCode == ENTER) vCnow = (vCnow + 1) % 3; if (keyCode == UP) vFnow = 0; if (keyCode == DOWN) vFnow = 1; switch (vCnow) { case 0: vC1 = color(0, 50, 170); vC2 = color(15, 155, 255); vC3 = color(255, 255, 255); break; case 1: vC1 = color(105, 0, 0); vC2 = color(255, 150, 0); vC3 = color(255, 255, 255); break; case 2: vC1 = color(40, 65, 0); vC2 = color(165, 215, 0); vC3 = color(255, 255, 255); break; }; }; ////////////////////////////////////////////////////////////////////////////////////////////////// void filterUp() // фильт смещения: вверх { for (int y = 0; y < yD - 1; y++) // перемещаем все элементы на один вверх for (int x = 0; x < xD; x++) value[y][x] = value[y + 1][x] + random(-0.15, 0.15); }; ////////////////////////////////////////////////////////////////////////////////////////////////// void filterDown() // фильт смещения: вниз { for (int y = yD - 1; y > 1; y--) // перемещаем все элементы на один вниз for (int x = 0; x < xD; x++) value[y][x] = value[y - 1][x] + random(-0.15, 0.15); }; ////////////////////////////////////////////////////////////////////////////////////////////////// void vFilter() // общая функция фильтра[ов] { switch (vFnow) { case 0: filterUp(); break; case 1: filterDown(); break; }; }; ////////////////////////////////////////////////////////////////////////////////////////////////// void vDraw() // отрисовка { float r; background(0, 0, 0); for (int y = 0; y < yD; y++) for (int x = 0; x < xD; x++) { r = value[y][x] = constrain (value[y][x] * 0.97 - 0.001, vMin, vMax); // уменьшая значение fill (lerpColor(vC1, vC2, (r - vMin) / vDelta)); // выбираем цвет в зависимости от... ellipse (0.5 + 4 + x * 8, 0.5 + 4 + y * 8, r, r); // рисуем: значение выступает как радиус if (r > vP) { fill (vC3); ellipse (0.5 + 4 + x * 8, 0.5 + 4 + y * 8, r - 5, r - 5);// украшаем }; }; }; ////////////////////////////////////////////////////////////////////////////////////////////////// void draw() // функция рисования { vDraw(); // рисуем vFilter(); // фильтруем };