Народ помогите разобраться с реализацией графических фильтров(twirl,mapdist,etc ...) В Hugi все что было прочитал, но ничего не понял. SineDist удалось сделать, а вот уже дальше мозгов не хватает. Может кто хоть алгоритмом поделитсь?! PS: И вообще кроме статей из Hugi кто нибудь что видел путное?
_DEN_ А причем здесь школьная математика?! Насколько я помню в школе фильтр Twirl не проходят не по одному предмету...
NaZGuL Да при том. При том что надо свою фантазию хоть немного применять. Что такое twirl? Это закрутка. На какой угол? На угол, зависящий от радиуса. Первое приближение: new_x = x * cos(a * r) + y * sin(a * r) new_y = y * cos(a * r) - x * sin(a * r) Пишешь, смотришь что получилось. Начинаешь дальше выдумывать. Как сгладить, какую фильтрацию применить, как там еще какие эффекты наложить. Надо же уметь применить то, чему в школе научился.
_DEN_ Огромное тебе спасибо, за толчок под зад в нужном направлении... Реализовал Twirl, дальше думаю RotoZOOM сделать, хотя чего там делать почти все есть Насчет сглаживания, в хуге хорошо написано (как брать точку с дробным смещением). Осталось привести все более - менее в божеский вид и можно ... Так что прощаюсь, но не надолго.
_DEN_ .... Такая проблема, фильтрация которая была расмотрена в Hugi, почемуй-то не работает. Может чем поможешь!? Вот исходняк .... Код (Text): void Twirl(byte *tex,int amount) { byte *tmp = new byte[256*256*4]; int offset=0; for(int i=0;i<256;i++) for(int j=0;j<256;j++) { int x = i - 127; int y = j - 127; float rad = 1 - sqrt(x*x + y*y)/127; float offx,offy; offx = 127 + x*cos(MPI*rad*amount) - y*sin(MPI*rad*amount); offy = 127 + x*sin(MPI*rad*amount) + y*cos(MPI*rad*amount); byte dx = int (offx); byte dy = int (offy); byte dx1 = dx + 1; byte dy1 = dy + 1; float c1 = offx - int (offx); float c2 = offy - int (offy); float c3 = 1 - c1; float c4 = 1 - c2; int col; for (int cc=0;cc<4;cc++) { col = int (c1*c2*tex[(dx *256+dy )*4+cc]+ c1*c4*tex[(dx *256+dy1)*4+cc]+ c3*c2*tex[(dx1*256+dy )*4+cc]+ c3*c4*tex[(dx1*256+dy1)*4+cc]); if (col>255) col=255; if (col<0) col=0; tmp[offset+cc] = byte (col); } offset+=4; } CopyMemory(tex,tmp,256*256*4); delete tmp; } Может я зря на Hugi гоню, может у меня руки кривые???
NaZGuL Ну с виду очень похоже на twirl с билинейной фильтрацией. Только как-то стремно выглядит последняя часть, for (int cc=0;cc<4;cc++) и далее. Покажи скрины, до фильтра и после.
/forum/img/attach.gif] [url=http://www.wasm.ru/forum/files/_1481431887__plasma.JPG]_1481431887__plasma.JPG[/url] <img src="http://wasm.ru/forum/files/1218254125__plasma(twirl).JPG 1218254125__plasma(twirl).JPG
_DEN_А как тебе билинейная фильтрация? При большом количестве повторений получается такая каша ... ,а в нормальных прогах почему-то получается серый цвет!?
NaZGuL Не могу сказать - сейчас нет времени проверять... Сейчас ваще на wasm времени нет - сздади неожинанно подкралась сессия ((
tylerdurden А ты проверял!? У меня цвет "0", ну никак не получется! Сам алгоритм хоть правельный? А то я уже сомневаться стал.
так иначе и не может быть. матрица весовых коэффициентов такая: 010 111 010 для билинейной фильтрайии...