Metodo add di arrayList non funziona correttamente

di il
8 risposte

Metodo add di arrayList non funziona correttamente

Ciao a tutti! mi sono appena iscritta perché ho bisogno di aiuto e non riesco a trovare da nessuna parte la risposta che mi serve..
Sto scrivendo un codice relativo alla grafica 3D, in particolare sto trattando le cosiddette "mesh", cioè dei poligoni, ciascuno dei quali ha i suoi vertici con le sue coordinate.
Il codice consiste nel prendere da un file le coordinate x, y, z, u, v e costruire i vertici con cui, a sua volta, costruire le mesh.
Però, c'è un problema: il metodo add di arrayList non funziona correttamente. In pratica, con un ciclo for aggiungo le mesh in un arrayList e, alla fine eseguo una stampa per fare accertamenti sul contenuto.
Se provo a stampare ALL'INTERNO del ciclo for mi trovo tutti gli elementi se, invece, provo a stampare al di fuori del ciclo, mi compare solo l'ultimo elemento e, per di più, 2 volte :/
Da quando programmo non mi è mai successa una cosa simile, qualcuno sa a cosa è dovuto tutto ciò?

Vi lascio il codice, se può esservi utile (scusatemi se è lunghissimo )
public static void importer(String filename)throws IOException{
			ArrayList<Float> x = new ArrayList<Float>();
			ArrayList<Float> y = new ArrayList<Float>();
			ArrayList<Float> z = new ArrayList<Float>();
			ArrayList<Float> u = new ArrayList<Float>();
			ArrayList<Float> v = new ArrayList<Float>();
			ArrayList<Mesh> mesh = new ArrayList<Mesh>();
			int countLine = 0; //mi serve per memorizzare a partire dalla linea corretta
			String estensione = filename.substring(filename.length() -3);
			if(new File(filename).exists() && estensione.equals("off")){
				FileReader fr = new FileReader(filename);
				BufferedReader bf = new BufferedReader(fr);
				String elementiTesto = bf.readLine();	//leggo linea per linea 
				countLine++; //ho letto la riga 1
				while(elementiTesto != null){
					String[] elem = elementiTesto.split(" ");	
					if(elem[0].length() != 1 && countLine >= 3){ //comincio il procedimento dalla riga 2
						
						x.add(Float.parseFloat(elem[0])); //è un numero negativo
						y.add(Float.parseFloat(elem[1]));
						z.add(Float.parseFloat(elem[2]));
						u.add(Float.parseFloat(elem[3]));
						v.add(Float.parseFloat(elem[4])); 
											
					}else if(elem[0].length() == 1){
						String[] others = elementiTesto.split(" ");
						
						Float cx1 = x.get(Integer.parseInt(others[1])); //prendo la coordinata x dal vettore con indice specificato
						Float cy1 = y.get(Integer.parseInt(others[1]));
						Float cz1 = z.get(Integer.parseInt(others[1]));
												
						Float cx2 = x.get(Integer.parseInt(others[2]));
						Float cy2 = y.get(Integer.parseInt(others[2]));
						Float cz2 = z.get(Integer.parseInt(others[2]));
						
						Float cx3 = x.get(Integer.parseInt(others[3]));
						Float cy3 = y.get(Integer.parseInt(others[3]));
						Float cz3 = z.get(Integer.parseInt(others[3]));
						
						Float cx4 = x.get(Integer.parseInt(others[4]));
						Float cy4 = y.get(Integer.parseInt(others[4]));
						Float cz4 = z.get(Integer.parseInt(others[4]));
						
						//creo vertici
						Vertex v1 = new Vertex(cx1, cy1, cz1);
						Vertex v2 = new Vertex(cx2, cy2, cz2);
						Vertex v3 = new Vertex(cx3, cy3, cz3);
						Vertex v4 = new Vertex(cx4, cy4, cz4);
						
						//creo faccia e mesh
						Face faccia  = new Face(v1, v2, v3, v4);
						Mesh m = new Mesh(faccia);
						
						//aggiungo la mesh nel suo arraylist 
						mesh.add(m); 
					} 
					elementiTesto = bf.readLine();
					countLine++;
				} //end while
				
				//controllo se il metodo funziona
				for(Mesh m : mesh){
					System.out.println(m);
				}
				
			}else
				throw new FileNotFoundException("File non trovato o inesistente");	
		} 

8 Risposte

  • Re: Metodo add di arrayList non funziona correttamente

    A prima vista non vedo errori davvero "grossolani". Ci sono diverse cose non buonissime ("da principianti") che si potrebbero migliorare ma non sono di certo quelle il problema principale.

    Dato che il funzionamento di tutto il ciclo è molto "pilotato" dai dati nel file, allora mostra anche un esempio di file (possibilmente breve purché valido per il funzionamento).
    Magari potrebbe anche essere utile vedere come sono Vertex/Face/Mesh anche se credo (spero...) non sia in questi il problema. Al 99% direi di no ma non si sa mai ..
  • Re: Metodo add di arrayList non funziona correttamente

    Pessimo approccio: invece di 5 arraylist, te ne bastano 2, uno contenente un Point3D e l'altro un Point2D:
    
    class Point2D { float x,y; }
    class Point3D extends Point2D { float z; }
    
    oppure
    
    class Point2D { float u,v; }
    class Point3D { float x,y,z; }
    
  • Re: Metodo add di arrayList non funziona correttamente

    migliorabile ha scritto:


    
    class Point2D { float x,y; }
    class Point3D extends Point2D { float z; }
    
    migliorabile, mi fai 'sti errori ..... un punto 3d non è un "caso particolare" di un punto 2d.
  • Re: Metodo add di arrayList non funziona correttamente

    andbin ha scritto:


    A prima vista non vedo errori davvero "grossolani". Ci sono diverse cose non buonissime ("da principianti") che si potrebbero migliorare ma non sono di certo quelle il problema principale.

    Dato che il funzionamento di tutto il ciclo è molto "pilotato" dai dati nel file, allora mostra anche un esempio di file (possibilmente breve purché valido per il funzionamento).
    Magari potrebbe anche essere utile vedere come sono Vertex/Face/Mesh anche se credo (spero...) non sia in questi il problema. Al 99% direi di no ma non si sa mai ..
    Allora, ti lascio un esempio di file da cui prendo i dati (all'inizio ci sono le coordinate x, y, z, u, v mentre, a seguire, trovi il numero di vertici di ogni poligono seguito dagli indici dell'arraylist in cui andare a prendere le coordinate)
    STOFF
    36989 36442 0
    -12.4582 182.837 5.4237 0.0117 0.4746 
    -12.2316 184.074 5.1951 0.0455 0.4794 
    -12.2902 184.059 4.8857 0.0449 0.4887 
    -12.5256 182.837 5.0546 0.0115 0.4861 
    59.0989 112.341 -10.939 1.7565 0.9345 
    58.1335 112.341 -8.7121 1.7578 0.9891 
    4 0 3 2 1
    4 1 2 4 5
    Per quanto riguarda le classi vertex, mesh e face, ti lascio i costruttori e i campi:
    //CAMPI
    	private static Vertex v1; 
    	private static Vertex v2; 
    	private static Vertex v3; 
    	private static Vertex v4;
    	private static Vertex v5;
    	private Edge l1, l2, l3, l4, l5;
    	
    	//COSTRUTTORI
    	public Face(Vertex v1, Vertex v2, Vertex v3, Vertex v4){	//quad
    		this.v1 = v1; 
    		this.v2 = v2; 
    		this.v3 = v3; 
    		this.v4 = v4; 
    		l1 = new Edge(v1,v2);
    		l2 = new Edge(v2,v3);
    		l3 = new Edge(v3,v4);
    		l4 = new Edge(v4, v1);		
    	}
    L'edge è lo spigolo (lato) del poligono che definisco a partire da 2 vertici.
    //CAMPI
    		private Face faccia;
    		
    		//COSTRUTTORI
    		public Mesh(Face f){
    			faccia = f;
    		}
    E infine
    //CAMPI
    	private float x,y,z,u,v;
    	private Vec3 coordinate;
    	private Vec2 cTexture;	
    		
    	//COSTRUTTORI
    	public Vertex(float x, float y, float z, float argU, float argV){
    		this.x = x; 
    		this.y = y; 
    		this.z = z; 
    		u = argU; 
    		v = argV;
    		coordinate = new Vec3(x, y, z);		//vettore delle coordinate x,y,z del vertice 
    		cTexture = new Vec2(u,v);		//vettore delle coordinate u,v del vertice nello spazio texture
    	}
  • Re: Metodo add di arrayList non funziona correttamente

    migliorabile ha scritto:


    Pessimo approccio: invece di 5 arraylist, te ne bastano 2, uno contenente un Point3D e l'altro un Point2D:
    
    class Point2D { float x,y; }
    class Point3D extends Point2D { float z; }
    
    oppure
    
    class Point2D { float u,v; }
    class Point3D { float x,y,z; }
    
    Per mantenere le coordinate x,y,z e u,v ho scritto delle classi (Vec3 e Vec2) che prendono le rispettive coordinate
  • Re: Metodo add di arrayList non funziona correttamente

    eda_mame ha scritto:


    STOFF
    36989 36442 0
    -12.4582 182.837 5.4237 0.0117 0.4746 
    -12.2316 184.074 5.1951 0.0455 0.4794 
    -12.2902 184.059 4.8857 0.0449 0.4887 
    -12.5256 182.837 5.0546 0.0115 0.4861 
    59.0989 112.341 -10.939 1.7565 0.9345 
    58.1335 112.341 -8.7121 1.7578 0.9891 
    4 0 3 2 1
    4 1 2 4 5
    Stando a questo esempio e in base al codice che hai postato all'inizio:

    1) le 6 righe

    -12.4582 182.837 5.4237 0.0117 0.4746
    -12.2316 184.074 5.1951 0.0455 0.4794
    -12.2902 184.059 4.8857 0.0449 0.4887
    -12.5256 182.837 5.0546 0.0115 0.4861
    59.0989 112.341 -10.939 1.7565 0.9345
    58.1335 112.341 -8.7121 1.7578 0.9891

    dovrebbero essere prese in considerazione dal primo if nel while, quindi in x/y/z/u/v hai 6 elementi in ciascuna lista.

    2) le 2 righe finali

    4 0 3 2 1
    4 1 2 4 5

    dovrebbero essere prese in considerazione dal secondo if nel while.
    Quindi alla fin fine (arrivati al for di stampa) nella lista "mesh" avresti esattamente 2 (DUE) oggetti Mesh.

    Ti "quadra"? E' quello che ti aspetteresti? O .. no?


    E riguardo alla classe Face:

    //CAMPI
    private static Vertex v1;
    private static Vertex v2;
    private static Vertex v3;
    private static Vertex v4;
    private static Vertex v5;
    private Edge l1, l2, l3, l4, l5;

    Lo static ti dico subito che NON ti serve sicuramente.
  • Re: Metodo add di arrayList non funziona correttamente

    andbin ha scritto:


    eda_mame ha scritto:


    STOFF
    36989 36442 0
    -12.4582 182.837 5.4237 0.0117 0.4746 
    -12.2316 184.074 5.1951 0.0455 0.4794 
    -12.2902 184.059 4.8857 0.0449 0.4887 
    -12.5256 182.837 5.0546 0.0115 0.4861 
    59.0989 112.341 -10.939 1.7565 0.9345 
    58.1335 112.341 -8.7121 1.7578 0.9891 
    4 0 3 2 1
    4 1 2 4 5
    Stando a questo esempio e in base al codice che hai postato all'inizio:

    1) le 6 righe

    -12.4582 182.837 5.4237 0.0117 0.4746
    -12.2316 184.074 5.1951 0.0455 0.4794
    -12.2902 184.059 4.8857 0.0449 0.4887
    -12.5256 182.837 5.0546 0.0115 0.4861
    59.0989 112.341 -10.939 1.7565 0.9345
    58.1335 112.341 -8.7121 1.7578 0.9891

    dovrebbero essere prese in considerazione dal primo if nel while, quindi in x/y/z/u/v hai 6 elementi in ciascuna lista.

    2) le 2 righe finali

    4 0 3 2 1
    4 1 2 4 5

    dovrebbero essere prese in considerazione dal secondo if nel while.
    Quindi alla fin fine (arrivati al for di stampa) nella lista "mesh" avresti esattamente 2 (DUE) oggetti Mesh.

    Ti "quadra"? E' quello che ti aspetteresti? O .. no?


    E riguardo alla classe Face:

    //CAMPI
    private static Vertex v1;
    private static Vertex v2;
    private static Vertex v3;
    private static Vertex v4;
    private static Vertex v5;
    private Edge l1, l2, l3, l4, l5;

    Lo static ti dico subito che NON ti serve sicuramente.
    Sisi mi dovrebbero risultare 2 elementi nell'arraylist Mesh. Il problema è che me ne risultano 2 ma uguali :/

    Lo static lo avevo inserito perché ci sono dei metodi statici e, di conseguenza, penso che anche le variabili in questione debbano essere statiche.
  • Re: Metodo add di arrayList non funziona correttamente

    eda_mame ha scritto:


    Lo static lo avevo inserito perché ci sono dei metodi statici e, di conseguenza, penso che anche le variabili in questione debbano essere statiche.
    No, al 99,99% è il tuo "design" della classe che è sbagliato ..
Devi accedere o registrarti per scrivere nel forum
8 risposte