Spiegazione codice

di il
6 risposte

Spiegazione codice

Buonasera a tutti,sto leggendo un codice già svolto che riguarda la lettura di un file di input dove vengono date delle coordinate(che verranno lette dentro una classe denominata "Vertici" e saranno le coordinate x e y).. dopodichè vi è un'altra classe denominata "Poligono" con il seguente codice:

public class Poligono {

	ArrayList<Vertici> lati;

	public Poligono(ArrayList<Vertici> lati) {
		this.lati = lati;
	}
	
	public double getPerimetroR(){
		double perimetro = 0;
		for(int i=0;i<lati.size()-1;i++){ 
			double distanza = Math.sqrt(Math.pow(lati.get(i+1).y-lati.get(i).y, 2)+
					Math.pow(lati.get(i+1).x-lati.get(i).x, 2));
			perimetro += distanza;
		}
		double distanza = Math.sqrt(Math.pow(lati.get(0).y-lati.get(lati.size()-1).y, 2)+
				Math.pow(lati.get(0).x-lati.get(lati.size()-1).x, 2));
		perimetro += distanza;
		return perimetro;
	}
Quello che non capisco è cosa fa nella "realtà" nel metodo getPerimetro.. ovvero.. perchè nella distanza fa (lati.get(0).y-lati.get(lati.size()-1).y ???
Anche il for, perchè lo fa da 0 fino a size()-1 ? Perchè essendo che size parte da 1 e i parte da 0, mette -1 in modo da non "sforare"?

6 Risposte

  • Re: Spiegazione codice

    Perché il punto "successivo" all'ultimo elemento dell'array è l'elemento 0. È esattamente la stessa cosa che fa all'interno del for per tutti gli altri segmenti.

    Sì per la seconda domanda
  • Re: Spiegazione codice

    Capito, ma perchè fa :
    
    double distanza = Math.sqrt(Math.pow(lati.get(0).y-lati.get(lati.size()-1).y, 2)+
    				Math.pow(lati.get(0).x-lati.get(lati.size()-1).x, 2));
    		perimetro += distanza;
    		return perimetro;
    
    non sarebbe bastato il for precedente per trovare il perimetro? che senso ha ritrovarsi di nuovo il perimetro tramite questo metodo? non capisco il perchè ripeti tale operazione in un modo diverso tral'altro

    Il file di input è il seguente:

    (0,0),(0,1),(0,2)
    (10,10),(10,20),(20,20),(20,10)

    Sono delle coordinate di 2 distinte figure geometriche(non ci è dato sapere quali)
  • Re: Spiegazione codice

    Stai solo aggiungendo la lunghezza dell'ultimo segmento al perimetro. Se metti i<lati.size() poi (i+1) va in overflow. E poi che ne sa il compilatore Java che geometricamente il prossimo della lista è l'elemento zero...
  • Re: Spiegazione codice

    Ok capito, ti ringrazio!
  • Re: Spiegazione codice

    Anto11796 ha scritto:


    sto leggendo un codice già svolto che riguarda la lettura di un file di input dove vengono date delle coordinate(che verranno lette dentro una classe denominata "Vertici" e saranno le coordinate x e y).
    Giusto solo alcuni piccoli appunti, non a te specificatamente ma in generale. Chi ha scritto quel codice evidentemente non aveva/ha le idee molto chiare.

    Innanzitutto se una classe modella 1 vertice, si dovrebbe chiamare Vertice, non Vertici.
    E visto che Poligono ha una lista di vertici ... sono vertici, non "lati".

    Ma a parte questo, la cosa che mi piace di meno è tutto quel garbuglio di Math.pow e Math.sqrt. Il calcolo della distanza tra due vertici è una operazione "notevole", che meriterebbe di essere incapsulata più appropriatamente. Una possibilità è fare un metodo statico di "utilità" che riceve 2 oggetti Vertice e restituisce la distanza in double. Tecnicamente sarebbe corretto.

    Ma c'è una soluzione più object-oriented. Se la classe Vertice avesse avuto un metodo del tipo:

    public double distanzaDa(Vertice altroVertice)

    Si poteva determinare la distanza tra 2 oggetti Vertice facendo: vert1.distanzaDa(vert2) e quindi quel getPerimetroR() che hai postato poteva diventare:
        public double getPerimetroR() {
            double perimetro = 0;
            int ultimoInd = lati.size() - 1;
    
            for (int i = 0; i < ultimoInd; i++) {
                perimetro += lati.get(i).distanzaDa(lati.get(i+1));
            }
    
            perimetro += lati.get(ultimoInd).distanzaDa(lati.get(0));
            return perimetro;
        }
  • Re: Spiegazione codice

    Sì, sicuramente è poco "pulito" e questo non facilita la mia lettura in quanto "new entry" nel mondo java, ad ogni modo grazie dell'appunto andbin, ogni informazione o precisione non può far altro che accrescere la mia conoscenza!
Devi accedere o registrarti per scrivere nel forum
6 risposte