Witam, chce dobrze zrozumiec obracanie,
mam obsluge suwaka:
void MyWindow::on_rotacja_sliderMoved(int position)
{
obrot = M_PI * (position)/180.0;
wywolywanie();
}
Obliczona ze wzoru macierz obrotu:
void MyWindow::Obrot(){
MacierzObrot[0][0] = cos(obrot);
MacierzObrot[0][1] = -sin(obrot);
MacierzObrot[0][2] = (szer/2.0)*(1-cos(obrot))+(wys/2.0)*(sin(obrot));
MacierzObrot[1][0] = sin(obrot);
MacierzObrot[1][1] = cos(obrot);
MacierzObrot[1][2] = (wys/2.0)*(1-cos(obrot))-(szer/2.0)*(sin(obrot));
MacierzObrot[2][2] = 1;
}
Gdy przesuwam suwakiem obrazek się obraca czyli wywołuje się funkcja wywolywanie()
void MyWindow::wywolywanie(){
int i,j;
double a,b;
int x,y,xn,yn;
unsigned char *ptr,*org;
czysc();
ptr = img->bits();
org = oryginal->bits();
// czyscimy wartosci wszystkich macierzy
reset();
// liczymy macierz obrotu
Obrot();
wynik[0][0] = 1;
wynik[1][1] = 1;
wynik[2][2] = 1;
Mnozenie(MacierzObrot);
for(i=0; i<wys; i++)
{
for(j=0; j<szer; j++)
{
// obliczamy wartosci ktore bedziemy wyswietlac
x = a = wynik[0][0] * i + wynik[0][1] * j + wynik[0][2];
y = b = wynik[1][0] * i + wynik[1][1] * j + wynik[1][2];
xn = x + 1;
yn = y + 1;
if(xn == wys)
xn--;
if(yn == szer)
yn--;
if(x >= 0 && y >= 0 && x < wys && y < szer){
a = a - x;
b = b - y;
// interpolacja dla poziomu z dwoch pionow
ptr[szer*4*i + 4*j] = round(Interpolacja(Interpolacja(org[szer*4*x + 4*y],org[szer*4*xn + 4*y],a),Interpolacja(org[szer*4*x + 4*yn],org[szer*4*xn + 4*yn],a),b));
ptr[szer*4*i + 4*j + 1] = round(Interpolacja(Interpolacja(org[szer*4*x + 4*y + 1],org[szer*4*xn + 4*y + 1],a),Interpolacja(org[szer*4*x + 4*yn + 1],org[szer*4*xn + 4*yn + 1],a),b));
ptr[szer*4*i + 4*j + 2] = round(Interpolacja(Interpolacja(org[szer*4*x + 4*y + 2],org[szer*4*xn + 4*y + 2],a),Interpolacja(org[szer*4*x + 4*yn + 2],org[szer*4*xn + 4*yn + 2],a),b));
}
}
}
update();
}
void MyWindow::Mnozenie(double dane[3][3]){
int i,j,k;
double s;
for(i = 0; i < 3; i++){
for(j = 0; j < 3; j++){
s = 0;
for(k = 0; k < 3; k++){
s += wynik[i][k] * dane[k][j];
}
pomoc[i][j] = s;
}
}
for(i = 0; i < 3; i++){
for(j = 0; j < 3; j++){
wynik[i][j] = pomoc[i][j];
}
}
}
I mam takie pytania jak:
Do czego jest potrzebna macierz
wynik[0][0] = 1;
wynik[1][1] = 1;
wynik[2][2] = 1;
jak działa mnożenie czy moglby mi ktos pokazac w jaki sposob jest to wymnazane? " Mnozenie(MacierzObrot);"
dodatkowo prosilbym o wytlumaczenie tego:
x = a = wynik[0][0] * i + wynik[0][1] * j + wynik[0][2];
y = b = wynik[1][0] * i + wynik[1][1] * j + wynik[1][2];
xn = x + 1;
yn = y + 1;