Advertisement
ForrestFox

Droplets

Mar 10th, 2021
228
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.87 KB | None | 0 0
  1. #include <qblib.c>
  2.  
  3. #define PALETTENUM 5
  4.  
  5. #define WIDTH  640
  6. #define HEIGHT 360
  7.  
  8. // Исходная палитра
  9. static const unsigned char pal[PALETTENUM][4] =
  10. {
  11.     {1,     0,   0,  32},
  12.     {64,    0,   0,  64},
  13.     {128,   0,   0, 128},
  14.     {192,   0, 192, 192},
  15.     {255, 255, 255, 255},
  16. };
  17.  
  18. float t;
  19. float Fp[ WIDTH ][ HEIGHT ]; // Новое поле
  20. float Fn[ WIDTH ][ HEIGHT ]; // Предыдущее поле
  21.  
  22. void init() {
  23.  
  24.     srand(3);
  25.     for (int i = 0; i < HEIGHT; i++)
  26.     for (int j = 0; j < WIDTH; j++)
  27.         Fp[j][i] = 0;
  28.  
  29.     generate_palette(PALETTENUM, pal);
  30.     load_running_string("ticker.txt");
  31. }
  32.  
  33. float xy(int x, int y) {
  34.  
  35.     if (x < 0) x = -x;
  36.     if (x >= WIDTH) x = 2*WIDTH - x - 1;
  37.     if (y < 0) y = -y;
  38.     if (y >= HEIGHT) y = 2*HEIGHT - y - 1;
  39.     return Fn[x][y];
  40. }
  41.  
  42. // Генератор волн
  43. void waves() {
  44.  
  45.     int i, j;
  46.  
  47.     // Генераторы
  48.     if (mouse.st & LF_CLICK) Fn[mouse.x][mouse.y] = (rand()%256) - 16;
  49.  
  50.     // Спираль
  51.     int x = WIDTH/2  + 120.0*sin(t)*cos(t);
  52.     int y = HEIGHT/2 + 120.0*cos(t);
  53.  
  54.     Fn[x][y] = 16 + (rand()%8) * sin(0.5*t);
  55.  
  56.     // Случайные капли
  57.     for (j = 0; j < 4; j++) Fn[ rand() % WIDTH ][ rand() % HEIGHT ] = (rand() % 32);
  58.  
  59.     float omega = 0.99; // Релаксация, выше 1.0f не делать
  60.     float laplas;
  61.  
  62.     /* Основная функция */
  63.     for (i = 0; i < HEIGHT; i++) {
  64.         for (j = 0; j < WIDTH; j++) {
  65.  
  66.             // Расчет лапласиана
  67.             laplas  = xy(j-1, i+0);
  68.             laplas += xy(j+1, i+0);
  69.             laplas += xy(j+0, i-1);
  70.             laplas += xy(j+0, i+1);
  71.  
  72.             // Дополнительная точность
  73.             laplas += xy(j-1, i-1);
  74.             laplas += xy(j+1, i+1);
  75.             laplas += xy(j-1, i+1);
  76.             laplas += xy(j+1, i-1);
  77.             laplas = (laplas / 8.0f);
  78.  
  79.             // Итоговое значение
  80.             Fp[j][i] = laplas + omega*(Fn[j][i] - Fp[j][i]);
  81.  
  82.             // Релаксация, чтобы волны успокаивались
  83.             Fp[j][i] *= 0.999f;
  84.         }
  85.     }
  86.  
  87.     // Обмен "полей"
  88.     for (i = 0; i < HEIGHT; i++)
  89.     for (j = 0; j < WIDTH; j++) {
  90.         float sw = Fp[j][i];
  91.         Fp[j][i] = Fn[j][i];
  92.         Fn[j][i] = sw;
  93.     }
  94.  
  95.     t = t + 0.02;
  96. }
  97.  
  98. // Перерисовать
  99. void redraw() {
  100.  
  101.     for (int y = 0; y < HEIGHT; y++) {
  102.         for (int x = 0; x < WIDTH; x++) {
  103.  
  104.             int a = 128 + 12*(Fn[x][y]);
  105.             a = a < 1 ? 1 : (a > 255 ? 255 : a);
  106.             pset(x, y, a);
  107.         }
  108.     }
  109. }
  110.  
  111. int main(int argc, char* argv[]) {
  112.  
  113.     screen(15);
  114.     init();
  115.  
  116.     while (sdlevent(EVT_REDRAW)) {
  117.  
  118.         waves();
  119.         redraw();
  120.  
  121.         record(argc, argv, 3600);
  122.     }
  123.  
  124.     return 0;
  125. }
  126.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement