tylerdurden Ну если хорошенько подумать, то разница все же есть Классический матричный фильтр содержит константы, а билинейная фильтрация это матричный фильтр, весами которого являются MOD-ы координат
_DEN_ Полностью с тобой согласен. Только ВЫ не ответили на мой вопрос, правильно или нет работает мой алгоритм!? Если да, то какого %?№ при фильтрации получаются баги...
NaZGuL Ну нету у меня сейчас времени проверять. Давай скрины на разных стадиях, чтобы показать как от нормального ты приходишь к мусору.
Давайте снова вернемся к нашим баранам!(устроился на новую работу, по этому времяни на кодинг почти небыло) Разобрался я с этим %%%м ТВИРЛОМ. Оказалось, что артефакты возникают при фильтрации! Иногда всплывают такие нелепые число аж жуть! Дело кончилось тем, что я основательно пересел на VC (там такого нет, хотя код тотже). Нашел недавно статейку в которой ТВИРЛ деается по табличке! Строится массив [-r..r,-r..r] и заполняется смещениями, а затем использую эту табличку пробегаем по всей текстурке и получем нужный результат. Может кто объяснит чем этот метод лучше и какие есть подводные камни? tylerdurden, ты заикался про матричный фильтр. Может покажешь на пальцах как енту штуку навоять! _DEN_, помнится ты обещал инфу нарыть про саунд в демках!? Очень надо! Процесс стоит ... Сейчас меня очень интересуют семпловые генераторы, ну а остальное по мере возможностей... Буду очень рад узреть выши ответы.
Забыл про код! Вот он: Код (Text): void Twirl(int *_data,float amount) { BYTE tmp[256][256][4]; memcpy(tmp,_data,256*256*4); int offset=0; for(int j=0;j<256;j++) for(int i=0;i<256;i++) { float x = (float)(i - 127.0); float y = (float)(j - 127.0); float rad = (float)(1.0 - 0.007874*sqrt(x*x + y*y)); float offx,offy; offy = (float)(127 + x*cos(MPI*rad*amount) - y*sin(MPI*rad*amount)); offx = (float)(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; int rgba=0; col = int(c1*c2*tmp[dx ][dy ][3]+ c1*c4*tmp[dx ][dy1][3]+ c3*c2*tmp[dx1][dy ][3]+ c3*c4*tmp[dx1][dy1][3]); if (col>255) col=255; if (col<0) col=0; rgba += (BYTE)col << 24; col = int(c1*c2*tmp[dx ][dy ][2]+ c1*c4*tmp[dx ][dy1][2]+ c3*c2*tmp[dx1][dy ][2]+ c3*c4*tmp[dx1][dy1][2]); if (col>255) col=255; if (col<0) col=0; rgba += ((BYTE)col) << 16; col = int(c1*c2*tmp[dx ][dy ][1]+ c1*c4*tmp[dx ][dy1][1]+ c3*c2*tmp[dx1][dy ][1]+ c3*c4*tmp[dx1][dy1][1]); if (col>255) col=255; if (col<0) col=0; rgba += ((BYTE)col) << 8; col = int(c1*c2*tmp[dx ][dy ][0]+ c1*c4*tmp[dx ][dy1][0]+ c3*c2*tmp[dx1][dy ][0]+ c3*c4*tmp[dx1][dy1][0]); if (col>255) col=255; if (col<0) col=0; rgba += ((BYTE)col) ; _data[offset++] = rgba; } } Исходное изображение http://www.nazgulus.pochta.ru/image/img1.bmp Твирл, на угол 0.05 http://www.nazgulus.pochta.ru/image/img.bmp
Хмммм... Опять тишина. Заново переписал функцию. Результат уже лучше, но все равно баги (почему-то красный цвет вместе с синим быстро пропадают, а зеленый остается). Код (Text): BYTE Interpolate(BYTE p0,BYTE p1,BYTE p2,BYTE p3, float x,float y) { float g0 = x - (int)x; float g1 = y - (int)y; float g2 = 1 - g0; float g3 = 1 - g1; int col = (int)(g2*g3*p0+ g2*g1*p1+ g0*g3*p2+ g0*g1*p3); return col; } void Twirl(int *_data,float amount) { BYTE tmp[256][256][4]; memcpy(tmp,_data,256*256*4); int offset=0; for(int i=0;i<256;i++) for(int j=0;j<256;j++) { int x = (i - 128); int y = (j - 128); float offx,offy; float rad = (float)(128.0 - sqrtf((float)x*x +(float)y*y)); BYTE dx,dy; if (rad<=0.0) { offx = (float)i; offy = (float)j; dx = i; dy = j; } else { float angle = rad*rad*amount*0.000002; float mcos = (float)cos(angle); float msin = (float)sin(angle); offx = (float)(128 + x*mcos - y*msin); offy = (float)(128 + x*msin + y*mcos); dx = (int)(offx) & 255; dy = (int)(offy) & 255; } BYTE dx1 = (dx + 1) & 255; BYTE dy1 = (dy + 1) & 255; int rgba=0; for (int cc=3;cc>=0;cc--) { rgba = rgba << 8; rgba += Interpolate(tmp[dx ][dy ][cc], tmp[dx ][dy1][cc], tmp[dx1][dy ][cc], tmp[dx1][dy1][cc],offx,offy); } _data[offset++] = rgba; } } Вот исходник