Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2004
    Messaggi
    51

    Rotazione di un'immagine ed assi cartesiani

    Salve,
    devo far ruotare di 90° un'immagine, un bottone rettangolare di 100x40 pixel. In condizioni normali mi viene disegnato con il suo angolo in alto a sinistra all'origine del sistema di coordinate fig.1. Dopo la rotazione di 90° visto che ha ruotare è tutto il sistema di assi intorno all'origine, ritrovo il mio bottone in verticale ma fuori campo fig.2. per farlo rientrare esegue una traslazione di 40 pixel fig. 3.

    codice:
    public void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d =(Graphics2D)g;               
            g2d.translate(40,0);
            g2d.rotate(Math.toRadians(90));           
            icon.paintIcon(this, g2d, 0, 0);
    }

    A questo punto sembra che il problema sia risolto ma purtroppo oltre a ruotare l'immagine rimane ruotato tutto il sistema cartesiano. Dovendo eseguire ulteriori spostamenti dell'immagine diventa un rompicapo con tutte le coordinate invertite.
    Vi chiedo c'è modo di ruotare un'immagine ma poi, lasciandola ruotata, rimettere le coordinate nella loro posizione iniziale?
    Grazie
    Immagini allegate Immagini allegate

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da cersil Visualizza il messaggio
    Vi chiedo c'è modo di ruotare un'immagine ma poi, lasciandola ruotata, rimettere le coordinate nella loro posizione iniziale?
    Prima salvi la matrice di trasformazione:

    AffineTransform oldTransform = g2d.getTransform();

    poi quando serve la rimetti:

    g2d.setTransform(oldTransform);
    Ultima modifica di andbin; 04-03-2018 a 11:54
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Aggiungo solo due cose (non posso più modificare il post precedente).
    1) Se nel paintComponent applichi delle modifiche alla matrice di trasformazione, è bene che entro la fine del paintComponent rimetti a posto la matrice come era all'inizio. E questo vale specialmente se quel componente in cui disegni ha un Border visibile e/o se ci sono dei componenti contenuti. Questo perché in Swing il disegno è fattorizzato in tre fasi distinte in questo ordine: prima paintComponent, poi paintBorder, poi paintChildren. Tutte queste fasi vengono invocate con lo stesso oggetto Graphics. Quindi se cambi la matrice e poi non la ripristini, rischi di "ravanare" il disegno nelle due fasi successive.

    2) Il paintComponent meglio se lo tieni protected.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2004
    Messaggi
    51
    Salve,
    Non mi risolve il problema. Dopo averla ruotata di 90° questa immagine devo poterla spostare modificando le sue coordinate ma mantenendola ruotata. Per fare questo ho scritto un metodo setPaintPos()
    codice:
        public void setPaintPos(int ptx,int pty){
           icoPx=ptx;
           icoPy=pty; 
           repaint();
        }
    Questo è il codice modificato:


    codice:
     public void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d =(Graphics2D)g;
            AffineTransform oldTransform = g2d.getTransform();
                    g2d.translate(icoH,0);
                    g2d.rotate(Math.toRadians(90));
                    icon.paintIcon(this, g2d, icoPx, icoPy);
            }
            g2d.setTransform(oldTransform);       
        }


    Cosi facendo mi salva la matrice, mi ruota l'immagine, me la disegna (a 90°) poi ripristina la matrice.
    Per poterla spostare di 100 pixel a destra e 100 pixel in basso devo farlo con il sistema di assi rovescoiato ossia per abbassarlo di 100 devo dare x=100 e per spostarlo a destra di 100 devo dare y=-100. Perchè il metodo chiama il repaint per ridisegnare l'immagine nella nuova posizione e quindi ripete gli stessi passi: salva la matrice, ruota di 90° ridisegna con le nuove cordinate ma nel sistema rovescio, poi ripristina. In poche parole così non riesco a spostarla usando il sistema al dritto.
    Ho provato anche cosi:
    codice:
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d =(Graphics2D)g;
            AffineTransform oldTransform = g2d.getTransform();        
            g2d.translate(icoH,0);
            g2d.rotate(Math.toRadians(90));
              
            g2d.setTransform(oldTransform);
    
                
            icon.paintIcon(this, g2d, icoPx, icoPy);
        }
    Ora le coordinate per spostarla sono quelle con gli assi al dritto, ma l'immagina non è più a 90°.
    Quindi a cosa mi serve salvare e ripristinare la matrice?
    Non si più congelare l'immagine a 90° ed usare le coordinate normali!? Non credo. Dovrò ragionare con coordinate rovesce. Aimé.
    Ciao

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 © 2025 vBulletin Solutions, Inc. All rights reserved.