Binary Hell's main site

 Главная страница 
 Новости 
 Статьи 
 Продукты 
 Документация 
 Наши проекты 
 О группе 
 
 Пишите нам 
 Опыт ФИДО конференций 
 Доки по ASM-у 
 Учебники 
 Форматы файлов 
 

- DEMO.DESIGN (2:5030/1334.67) ---------------------------------- DEMO.DESIGN -
 Msg  : 1 из 251
 From : Vitaly Mayatskih                    2:5002/27.65    Суб 18 Hоя 00 00:35
 To   : All                                                 Вск 19 Hоя 00 01:06
 Subj : Radial Blur
-------------------------------------------------------------------------------
Здоровенное тебе приветище, All!

    Hу надо, так надо ;) В ююках содержится пример сабжа, скомпиленный в
Borland C 5.01 и Watcom C 10 (это чтобы разницу в скорости почувствовать ;).

    Попсрла теория. Что такое блюр, думаю, объяснять не надо. В ортогональной
декартовой системе блюр реализуется очень просто. В радиальной системе блюр
реализуется тоже очень просто ;) Для этого нам надо высчитать координаты точки,
с которой будем блюрить текущую. Дабы не производить тормозные вычисления над
каждой точкой, сгенерим для этого дела таблички. Искать координаты точки будем
при помощи вектора с фиксированной длиной, например 8, как в примере.
Предположим, что "центр" блюра находится в точке (0,0). Теперь пробежимся по
всем точкам на экране и высчитаем вектор по известной формуле:

 for(x=0;x<320;x++)
  for(y=0;y<200;y++){
   n=sqrt(x*x+y*y)/8+1;

    Единицу добавляем, чтобы не получить нулевой вектор. Теперь, имея вектор к
данной точке, ещс упростим последующие вычисления и разложим вектор на x- и y-
составляющие:

   *(nx+y*320+x)=(char)(x/n);
   *(ny+y*320+x)=(char)(y/n);
  }

    Где nx и ny - это массивы по 320*200 элементов типа char. Таблицы
сгенерированы, теперь сам сабж. Двигаем центр блюра по какой-нибудь замудрсной
траэктории по экрану и передасм в процедуру координаты центра (bx,by). Центр
делит экран на 4 части, блюр всех четвертей идейно одинаков, только направления
счста разные ;) Блюрим от центра, пробегаясь в цикле по столбцам и строкам.

//vptr - указатель на буфер с картинкой.
 vptr1=(((by-1)<<6)+((by-1)<<8)+bx-1)+vptr;  //vptr1=320*(by-1)+(bx-1)+vptr
 t=0;
 for(y=by-1;y>=0;y--){
  for(x=bx-1;x>=0;x--){
   vx=*(nx+t);
   vy=*(ny+t); //нашли x и y точки, с которой будем блюрить
   p1=*(vptr1);//p1 - текущая точка
   p2=*(vptr1+vx+(vy<<8)+(vy<<6));//p2 - точка, к которой взяли вектор
   *vptr1=(p1+p2)>>1; //блюрим ;)
   vptr1--;
   t++;
  }
  vptr1=vptr1-320+bx; //следующая строка
  t=t+320-bx;
 }

    После радиального блюра полезно сделать ещс и обычный, после чего бросаем
буфер на экран, в буфер кидаем несблюренную картинку, меняем координаты центра
и
loop. Всс, спасибо за внимание. Hа авторство эффекта не претендую ;)

Пока!
--- GoldED+/386 1.1.4.7
 * Origin: Where dark and light don't differ (2:5002/27.65)

  

Rambler's Top100 Rambler's Top100 NET's Top100