| 
 | |||||||
| 
 | 
|  | 
|  | 
|  | Strumenti | 
|  25-07-2009, 17:03 | #1 | 
| Senior Member Iscritto dal: Jan 2006 Città: Perugia - San Benedetto del Tronto 
					Messaggi: 348
				 | 
				
				[Java] Problemi con il fillRect
			 
		Allora ragazzi, salve a tutti. Ho un problema da cui non riesco a venirne fuori (è più di un'ora che ci stò ragionando   ). Stò facendo un programma in Java che gestisce il database di una fittizia casa edistrice. Ho deciso di fare in modo che l'utente possa visualizzare l'istogramma delle vendite dei numeri di una collana. Così ho scritto un codice per disegnare questo istogramma: Codice: public void paintComponent(Graphics g) {
        super.paintComponent(g);
        int max = findMax(this.venduti);
     
        g.setColor(new java.awt.Color(160, 175, 219));
        for (int i = 0; i < dim; i++) {
            g.fillRect(30 + i * 50, 25, 30, Math.round((250 * (Integer) venduti[i][1]) / max));
}Il problema è che il fillRect mi considera il conteggio dei pixel a partire da in alto a sx anzichè dal basso a sx. Ecco quindi cosa ne viene fuori:  Ovvero l'istogramma esce fuori ribaltato. Considerate che il JPanel ha altezza 300 pixel. Ho deciso di usare sia un margine alto che un margine basso ciascuno di 25 pixel. Ecco perchè nella proporzione ho assegnato al libro di collana con maggior numero di vendite un rettangolo di altezza 250. Il metodo fillRect è il seguente: fillRect(int x, int y, int width, int height) Ovvero disegna un rettangolo il cui angolo in alto a sinistra è nelle coordinate x,y; il rettangolo è largo WIDTH ed è alto HEIGHT (quindi niente altezze negative). Potete darmi una mano? | 
|   |   | 
|  25-07-2009, 17:12 | #2 | 
| Senior Member Iscritto dal: Jan 2006 Città: Perugia - San Benedetto del Tronto 
					Messaggi: 348
				 | 
		come non detto, con carta e penna e disegnino ci sono arrivato ... era molto banale : Codice: g.fillRect(30 + i * 50, altezza - 25 - Math.round((250 * (Integer) venduti[i][1]) / max), 30, Math.round((250 * (Integer) venduti[i][1]) / max));   | 
|   |   | 
|  27-07-2009, 09:13 | #3 | 
| Senior Member Iscritto dal: Oct 2007 Città: Padova 
					Messaggi: 4131
				 | 
		Potevi anche risolvere così: 1) eseguo sul Graphics la traslazione dell'origine (che come avrai capito è mappata nel punto in alto a sinistra del componente su cui si disegna) nel punto in basso a sinistra (sfruttando la getHeight del componente); 2) eseguo sul Graphics una operazione di scala di valore 1 per le X e valore -1 per le Y A questo punto avresti ottenuto il rendering corretto anche specificando l'operazione di disegno fillRect con i valori postati nella tua prima versione. Se devi poi "resettare" lo stato del Graphics, basta salvarsi la sua AffineTransform prima di eseguire le operazioni ai punti 1) e 2); per poi ripristinarla tramite il metodo setTransform del Graphics. Se vuoi approfondire, questo potrebbe essere un buon punto di partenza. 
				__________________ As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) Ultima modifica di banryu79 : 27-07-2009 alle 12:14. Motivo: errore nel valore di scala indicato delle coordinate X | 
|   |   | 
|   | 
| Strumenti | |
| 
 | 
 | 
Tutti gli orari sono GMT +1. Ora sono le: 23:03.









 
		 
		 
		 
		







 
  
 



 
                        
                        










