Grafico elementi di un vettore

Si supponga dato un vettore di interi vett. Si vuole stampare la sua rappresentazione grafica con rettangoli. In altre parole, si vogliono tanti rettangoli l'uno accanto all'altro quanti sono gli elementi del vettore, e ogni rettangolo deve essere di altezza proporzionale al contenuto dell'elemento del vettore (si veda più sotto per degli esempi).

Dal momento che occorre un rettangolo per ogni elemento del vettore, è necessario un ciclo in cui una variabile i assume tutti i valori da 0 fino al numero di elementi del vettore meno 1. Ad ogni passo, è necessario disegnare un rettangolo. Occorre decidere come deve esseere fatto questo rettangolo. Sappiamo che la sua altezza deve essere proporzionale a vett[i]. Per quello che riguarda la specifica dell'altezza siamo quindi a posto. Per la larghezza, possiamo assumere che tutti i rettangoli siano larghi 10.

Ci mancano quindi solo la coordinate dell'angolo in alto a sinistra del rettangolo. Per quello che riguarda la coordinata y, è facile: da momento che tutti i rettangoli devono partire dallo stesso piano, possiamo mettere per esempio y=100 per tutti i rettangoli.

La coordinata x si determina sapendo che i rettangoli vanno messi l'uno dietro l'altro. Il rettangolo che corrisponde a vett[0], per esempio, può essere compreso fra le coordinate 0 e 10, mentre quello di vett[1] sta fra 10 e 20, ecc. Non è difficile capire che il rettangolo che corrisponde a vett[i] si trova tra le coordinate x di valore i*10 e (i+1)*10. La coordinata x dell'angolo in alto a sinistra è quindi data da i*10.

Il programma GraficoRect.java realizza il grafico usando esattamente questo tipo di coordinate.

/*
  Grafico dei valori di un vettore usando rettangoli.
*/

import java.awt.*;

public class GraficoRect extends java.applet.Applet {
  public void paint(Graphics g) {
    int vett[]={3, 4, -5, -6, 2, 4, 4, -2, 0, 2, -9, 2, 9, 4, 5};
    int i;

    for(i=0; i<=vett.length-1; i=i+1) {
      g.drawRect(10*i, 100, 10, vett[i]*10);
    }
  }
}

L'output prodotto dal programma è il seguente:

Naturalmente, non è esattamente quello che si voleva ottenere. Per prima cosa, i valori negativi non sono stati disegnati. Secondo, i valori positivi corrispondono a rettangoli che ``scendono'' anzichè salire. Il primo problema si risolve con una istruzione condizionale che controlla se il contenuto di un elemento del vettore è positivo oppure negativo. Per quello che riguard il secondo problema, occorre cambiare gli argomenti della istruzione di stampa del rettangolo. Non si entra qui nel dettaglio di come questa cosa vada fatta. Il programma completo è GraficoRectDue.java:

/*
  Grafico dei valori di un vettore usando rettangoli:
  versione corretta che ammette valori negativi.
*/

import java.awt.*;

public class GraficoRectDue extends java.applet.Applet {
  public void paint(Graphics g) {
    int vett[]={3, 4, -5, -6, 2, 4, 4, -2, 0, 2, -9, 2, 9, 4, 5};
    int i;

    for(i=0; i<=vett.length-1; i=i+1) {
      if( vett[i]<0 ) {
        g.drawRect(10*i, 100, 10, -vett[i]*10);
      }
      else {
        g.drawRect(10*i, 100-vett[i]*10, 10, vett[i]*10);
      }
    }
  }
}

Il grafico che viene prodotto è: