Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2011
    Messaggi
    106

    Rotazione [c++]

    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..
    codice:
    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

  2. #2
    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:

    codice:
    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:
    codice:
    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!

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2011
    Messaggi
    106
    Grazie per la risposta..
    Adesso funziona,con codice ricorretto..
    codice:
    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
    codice:
    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??.

  4. #4
    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.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2011
    Messaggi
    106
    Ma certo...
    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..

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.