Rotazione immagini con C
Ciao a tutti! Ho dei problemi a ruotare un0immagine in formato .jpg con linguaggio C. Ho capito che bisogna moltiplicare le componenti del pixel per la matrice
dove (x1,y1) e (x2,y2) sono i vertici opposti del rettangolo che devo ruotare, teta è l'angolo di rotazione, j_new e i_new due vettori che contengono le componenti pixel ruotate.
Avete qualche suggerimento?
- cos(teta) sin(teta)[/list:u:c1l8kngc]
- -sin(teta) cos(teta)[/list:u:c1l8kngc]
ma ovviamente non gira. Ecco il codice della funzione:
void ruota(SDL_Surface *screen,int x1,int y1,int x2,int y2,float teta,int *j_new,int *i_new,int dw) { int i,j; for(i=y1;i<=y2;i++) { for(j=x1;j<=x2;j++) { j_new[j]=(j-*cos(teta)-i*sin(teta)+dw); i_new[i]=(j*sin(teta)+i*cos(teta)); } } }
dove (x1,y1) e (x2,y2) sono i vertici opposti del rettangolo che devo ruotare, teta è l'angolo di rotazione, j_new e i_new due vettori che contengono le componenti pixel ruotate.
Avete qualche suggerimento?
Risposte
Nella funzione che hai mostrato, ti sei solo calcolato un sacco di valori, ma l'immagine non è stata modificata. La rotazione la vuoi fare in real-time? Se è questo lo scopo allora devi sapere che SDL non è abbastanza veloce da gestire tante immagini che ruotano essendo un'operazione molto costosa da fare sulla CPU (è praticamente gratuita invece sulla GPU). Per avere tante sprite che ruotano devi o generare le sprite ruotate e poi cambiare la sprite da visualizzare oppure fare uso di una libreria che faccia uso delle OpenGL o DirectX come backend.
Sì,la rotazione deve essere fatta subito; però non ho idea di cosa siano le sprite. Essendo un esercizio dato dal prof. non credo inoltre che sia previsto di usare altre librerie oltre alla SDL.
Come faccio a generare le sprite ruotate?
Come faccio a generare le sprite ruotate?
Ma che cosa ti ha chiesto esattamente il professore? Di visualizzare l'immagine ruotata? Di visualizzare un immagine che ruota ad una certa velocità? Altro?
Mi ha chiesto di visualizzare un'immagine in formato ppm, jpg o png, di selezionarne una sua parte rettangolare da mouse e di riprodurre questo rettangolo scalato e ruotato accanto all'immagine originale.
Quando opero solo la trasformazione di scalatura sul rettangolo va tutto bene.
Ma quando opero solo la rotazione (di un angolo teta a piacere) a fianco dell'immagine orgiginale o non mi compare nulla, oppure mi compare il rettangolo rimpicciolito sull'immagine originale.
Ho il sospetto che nella funzione che fa la rotazione, che è quella sopra, ci siano dei problemi di coordinate x e y; comunque di rotazione nemmeno l'ombra.
Quando opero solo la trasformazione di scalatura sul rettangolo va tutto bene.
Ma quando opero solo la rotazione (di un angolo teta a piacere) a fianco dell'immagine orgiginale o non mi compare nulla, oppure mi compare il rettangolo rimpicciolito sull'immagine originale.
Ho il sospetto che nella funzione che fa la rotazione, che è quella sopra, ci siano dei problemi di coordinate x e y; comunque di rotazione nemmeno l'ombra.
in questa riga
forse c'è un $-$ di troppo (o in posizione sbagliata) tra j e *cos(teta), ma non so se modificandolo ti risolve il problema
j_new[j]=(j-*cos(teta)-i*sin(teta)+dw);
forse c'è un $-$ di troppo (o in posizione sbagliata) tra j e *cos(teta), ma non so se modificandolo ti risolve il problema
Come ti ho già detto, il codice non sembra accedere ai pixel dell'immagine e non vedo quindi come dovrebbe funzionare. Ti consiglio di dare un occhiata a SDL_gfx e in particolare all'implementazione di rotozoom.
@itpareid: la formula non è per una rotazione intorno all'origine, ma nel centro dell'immagine (o almeno dovrebbe) per cui è normale che sia un po' diversa (anche perché gli assi di un immagine sono spesso diversi da quelli a cui si è solitamente abituati. Non ho però fatto i calcoli per vedere se la formula è corretta.
@itpareid: la formula non è per una rotazione intorno all'origine, ma nel centro dell'immagine (o almeno dovrebbe) per cui è normale che sia un po' diversa (anche perché gli assi di un immagine sono spesso diversi da quelli a cui si è solitamente abituati. Non ho però fatto i calcoli per vedere se la formula è corretta.