PDA

Visualizza la versione completa : [C++] Rotazione di una figura di 180


Gianni91
04-01-2012, 13:02
Ciao a tutti ,nel mio esercizio viene richiesto,di creare una funzione che faccia ruorate la mia figura di r*180,con r dato dal main..
Nb:La figura non una vera e propria figura ,ma una matrice,dinamica di enumerati..
Ho provato a realizzarla,compila,ma a quanto pare non esegue nessuna modifica..


void ****::operator%(int r){
if((r>=0)&&(r%2!=0)){
int k=(righe-1);
int g;
for(int i=0;i<righe;i++){g=(colonne-1);
for(int j=0;j<colonne;j++){
stato h=matt[i][j];
matt[i][j]=matt[k][g];
matt[k][g]=h;
g--;
}
k--;

}
}
}

Qualcuno sa cosa sbaglio?? :)
Grazie

Beavey
04-01-2012, 14:29
EDIT:
Quindi se capisco bene, devi ruotare di 180 gradi e basta. Quindi invertire le coordinate x, tenendo le y uguali e poi invertire le colonne. Ad esempio, se la matrice ha 4 righe e 4 colonne, la coordinata matt[3][3] deve diventare matt[0][0] nella nuova matrice (dove x e y sono matt[y][x] nel tuo caso mi pare).

Una matrice di rotazione generica e' definita: http://it.wikipedia.org/wiki/Rotazione_(matematica)

Quello che farei io per iniziare e' invertire tutte le coordinate x, tenendo le righe (y) uguali:



void ****::operator%(int r){
//definire nuova matrice, matt_new[righe][colonne]
if((r>=0)&&(r%2!=0)){
for(int y=0;y<righe;y++){
c=(colonne-1);
for(int x=0;x<colonne;x++){
matt_new[y][x]=matt[y][c];
c--;
}
}
}
}

Quello che devi fare dopo e' invertire le righe della matrice nuova, sempre effettuando una copia temporanea della stessa., quindi dovresti fare un altro ciclo for, solo per le righe, ovvero non cambiando i dati delle colonne.

Non capisco perche' nella tua funzione fai:


stato h=matt[i][j];
matt[i][j]=matt[k][g];
matt[k][g]=h;

In questo modo effettui una rotazione di 360 gradi, perche quando superi la meta' della matrice (in termine di colonne), rimetti i numeri iniziali nelle posizioni iniziali, mi pare.

Prova a fare come ho scritto io, istanziando una nuova matrice, e immettendo i dati dal quella originale.

Se non sono stato chiaro fammelo sapere! Spero di essere stato d'aiuto!

Gianni91
04-01-2012, 15:23
Grazie per la risposta..
Adesso funziona,con codice ricorretto..


void Canvas::operator%(int r){
if((r>=0)&&(r%2!=0)){
int g;
stato** matt2=new stato*[righe];
for(int i=0;i<righe;i++)matt2[i]=new stato[colonne];

for(int i=0;i<righe;i++){
g=(colonne-1);
for(int j=0;j<colonne;j++){
matt2[i][j]=matt[i][g];
g--;
}}
for(int i=0;i<righe;i++)
delete[]matt[i];
delete matt;
matt=matt2;


}
}

Avevo pensato subito di creare una matrice di supporto,ma credevo di poter risolvere il problema facendone a meno..a quanto pare non si pu..

Originariamente inviato da Beavey


stato h=matt[i][j];
matt[i][j]=matt[k][g];
matt[k][g]=h;

In questo modo effettui una rotazione di 360 gradi, perche quando superi la meta' della matrice (in termine di colonne), rimetti i numeri iniziali nelle posizioni iniziali, mi pare.

Prova a fare come ho scritto io, istanziando una nuova matrice, e immettendo i dati dal quella originale.

Se non sono stato chiaro fammelo sapere! Spero di essere stato d'aiuto!
Con quella riga di codice,cercavo di spostare gli N tutti in alto a sinistra,xch credevo che in quel caso avrei avuto una rotazione di 180,la cosa che non capisco e che mi hai detto che quel codice lascia tutto com',che quello che fa davvero,ma non riesco a capire il motivo..
Io faccio partire da una parte i e j da 0 e dall'altra k e g dalla posizione finale,facendo poi uno scambia stile bubble sort,xch non si posizianano in alto a sinistra??. :confused:

Beavey
04-01-2012, 15:38
Quello che il tuo codice faceva era:
1. copiare il valore della matrice a i,j e salvarlo in h
2. copiare in i,j il valore di k,g
3. copiare h in k,g

Quindi all'inizio del ciclo, sulla prima riga, facevi la copia del primo elemento, poi rimpiazzavi il primo elemento con l'ultimo, e poi copiavi il valore del primo elemento e lo mettevi nell'ultimo. Quindi quando il tuo ciclo superava la meta' della riga, ripetevi il processo di prima ricreando la matrice originale: quando arrivavi all'ultimo elemento della riga, ad esempio, creavi la copia di questo in h, poi rimpiazzavi il valore dell'ultimo elemento con quello del primo (che era uguale al valore dell'ultimo elemento all'inizio del ciclo di questa riga), e poi rimpiazzavi il valore del primo elemento con quello dell'ultimo (che in questo caso era uguale al valore del primo elemento all'inizio del ciclo).

Ad es matrice di 1 riga, 3 colonne:
matt = [a,b,c]
al primo giro di ciclo la matrice (i, j = 0, k = 0, j = 2): [c,b,a]
al secondo giro di ciclo (tutti i,j,k,g = 1, ovvero puntano a b e 'scambiano' b ): [c,b,a]
ultimo giro di ciclo: [a,b,c]

La tua funzione non e' completa: ovvero, non hai definito dove sta l'origine delle assi attorno alle quali fai la rotazione.
Potresti provare ad implementare l'utilizzio di matrici di rotazione nella tua funzione per trovare il valore delle nuove coordinate. In questo modo potresti calcolare la rotazione per un qualsiasi r*angolo

In questo caso ti consiglio di lavorare individualmente per ogni coppia di x,y per trovare le nuove x',y': potresti creare una Classe Coordinata e la tua 'immagine' potrebbe essere un array di Coordinate. La tua funzione opererebbe su ogni set di coordinate separatamente, con un qualsiasi angolo e r.

Gianni91
04-01-2012, 15:53
Ma certo... :dh:
Al massimo avrei dovuto limitare il ciclo a met dell'array,xch altrimenti vado a rimodificare quello che avevo gia modificato,riportandolo allo stato originale..
Chiaramente questo non utile per l'esercizio della figura,ma quello stato risolto..
Grazie per le delucidazioni.. :ciauz:

Loading