· ··--──══[ COOLer issue #1 ]══─---·· ·
ЭФФЕКТ: FLOWERS by GELTORN/STORM




                -=========ЭФФЕКТ: FLOWERS=========-


Еще один эффектик в копилку начинающего демокодера...

  В общем,  палитру  выставляйте как хотите, главное, чтобы переходы
между цветами были плавными.

  Для хранения изображения "цветка", заведем массив flower, размером
640x400. Нарисуем в нем наш "цветок". Формулу для рисования "цветка"
можно найти в любом нормальном учебнике по "вышке". Для всех тех кто
уже  успел  забыть  этот кошмар или у кого он еще не начался, так уж
быть, вот процедура инициализации массива:

...
 for(long y=-200;y<200;y++)
   for(long x=-320;x<320;x++)
     flower[(x+320)+(y+200)*640]=0.75*cos(16*atan2(y,x))*256/TWO_PI+
                                   1.5*sin(8*atan2(y,x))*256/TWO_PI+
                                   sqrt(x*x+y*y);
...

  Меняя  коэффициенты  в  формуле  можно  получить довольно забавные
версии  этого  эффекта.  В  результате  мы  получим в массиве flower
красивый   такой  цветок  или  не  совсем  красивый  или  совсем  не
красивый... ;-)

  Теперь  определимся  сколько  нам потребуется "цветков" на экране,
мне  хватило  трех,  при  большем  количестве  "цветков"  на  экране
довольно  трудно становиться понять, что твориться на экране. Правда
если  хочешь  словить глюков - поставь цветков так 5 - 7 и смотри на
экран  минут  5..10, глюков  может  и  не словишь,  но глаза заболят
обязательно.

  Но  перед  тем, как мы начнем наслаждаться резью в глазах надо еще
сделать кое-что.

  Возьмем  какую-нибудь  точку  в массиве flower, причем не любую, а
такую,  чтобы  X  координата  лежала  в  промежутке от 0 до 320, а Y
координата  в промежутке от 0 до 200. Начиная с этой точки скопируем
кусок массива, размером 320x200, на экран. Получим изображение куска
"цветка".  Если  теперь  сдвигать  начальную  точку,  в каждом новом
кадре,  на  новое  место,  то  получим  изображение  перемещающегося
цветка.

  Теперь допустим, что начальных точек две, и на экран копируется не
один  кусок  "цветка", а два. Причем накладывается они друг на друга
обычным  сложением  цветов.  В  результате получим требуемый эффект.
Вот. Реализуется это примерно так:

...
    x=160+120*sin(time*0.5+1.0);
    y=100+90*cos(time*1.5+2.0);
    offset1=x+(y<<7)+(y<<9);
    x=160+120*sin(time*1.0+1.5);
    y=100+90*cos(time*2.0+0.5);
    offset2=x+(y<<7)+(y<<9);
    for(y=0;y<200;y++)
      for(x=0;x<320;x++)
      {
        screen[x+(y<<6)+(y<<8)]=flowers[x+(y<<7)+(y<<9)+offset1]+
                                flowers[x+(y<<7)+(y<<9)+offset2];
      }
...

Добавить еще "цветков" думаю вам не составит труда. Bye...

                                                  ---(Geltorn/Storm)


