# TriangleArray



## ameisengehirn (21. Aug 2011)

Hallo,

ich habe ein Problem: ich lese ein TriangleArray aus:


```
int triangleArrayLength = triangleArray.getValidVertexCount(); // sagt 12 im SysOut
		    double[] coordinatesArray = new double[triangleArrayLength];

		    for (int i = 0; i < triangleArrayLength; i++) {
		    	System.out.println(i); // HIER BRICHT ER MIT 0 AB
		    	triangleArray.getCoordinate(i, coordinatesArray);
		    	log.info("COORDINATE " + i + " IS: " + coordinatesArray[i]);
		    }
```

Hat jemand eine Lösung parat?

Danke und Grüße


----------



## Landei (21. Aug 2011)

Eine Variable ändert nicht einfach ihren Wert von Geisterhand. Ich vermute, dass in Zeile 6 eine Exception fliegt, die du aber irgendwie ignorierst (kannst du ja einfach testen, in dem du zwischen Zeile 7 und 8 irgendwas ausgibst.


----------



## Marco13 (21. Aug 2011)

```
int triangleArrayLength = 12;
            for (int i = 0; i < triangleArrayLength; i++) {
                System.out.println(i); // HIER BRICHT ER MIT 0 AB
            }
```
Wenn er dort immernoch abbricht, ist dein Computer kaputt. Wenn nicht, hast du nicht genug Code gepostet.


----------



## ameisengehirn (21. Aug 2011)

Ohne


```
triangleArray.getCoordinate(i, coordinatesArray);
```

läuft es durch. Die Synthax stimmt allerdings und es fliegt keine Exception. Bin ratlos

hier nochmal etwas mehr Code:


```
Shape3D shape = shapeList.get(0); //einfach zum Test erstes Listenelement

		Geometry geometry = (Geometry) shape.getAllGeometries().nextElement();

		if (geometry instanceof TriangleArray) {
		
			TriangleArray triangleArray = (TriangleArray) geometry;
			int triangleArrayLength = triangleArray.getValidVertexCount();
		    double[] coordinatesArray = new double[triangleArrayLength];
		    
		    for (int i = 0; i < triangleArrayLength; i++) {
		    	System.out.println(i);
		    	triangleArray.getCoordinate(i, coordinatesArray);
		    	log.info("COORDINATE " + i + " IS: " + coordinatesArray[i]);
		    }
```

Um genau zu sein:


```
for (int i = 0; i < triangleArrayLength; i++) {
		    	System.out.println(i); // Hier der letzte SysOut i = 0; danach passiert nichts mehr
		    	triangleArray.getCoordinate(i, coordinatesArray);
		    	log.info("COORDINATE " + i + " IS: " + coordinatesArray[i]);
		    }
```


----------



## Landei (22. Aug 2011)

Es muss irgend eine Exception fliegen. Kann es sein, dass [c]coordinatesArray[/c] zu kurz ist? Ist nicht eventuell die doppelte oder dreifache Länge von [c]triangleArray[/c] notwendig?


----------



## ameisengehirn (22. Aug 2011)

Die Länge des Arrays passt, mit vertexcount kann man ja die benötigte Größe berechnen. Angenommen es gibt eine Exception, warum wird diese weder in Eclipse noch in der Shell (bei Ausführen der Jar) angezeigt?

Edit: liegt wohl am Swingworker, werde dem auf den Grund gehen und Bericht erstatten


----------



## Marco13 (22. Aug 2011)

Ja, der SwingWorker verschluckt leicht mal Exceptions, wenn man nicht aufpasst. Im Web gibt's einige Infos, wie man das vermeiden kann.


----------



## ameisengehirn (22. Aug 2011)

hier haben wir den Übeltäter:


```
java.lang.IllegalStateException: GeometryArray: cannot directly access data in BY_REFERENCE
```

lag tatsächlich am SwingWorker. Kennt jemand die Exception?


----------



## Landei (22. Aug 2011)

Nö, die ist frameworkspezifisch (*), da müsstest du mal im entsprechenden Forum oder so nachfragen. Ist das ganze Open Source, kannst du natürlich auch selber suchen.

(*) Also nicht IllegalStateException als solche, aber der Messagetext deutet darauf hin, dass sie nicht einfach so geflogen ist, sondern dass sie jemand bewußt ausgelöst hat.


----------



## ameisengehirn (22. Aug 2011)

ok, man kann die geometry nicht by-REFERENCE auslesen sondern muss sie in eine GeometryInfo konvertieren. Das funktioniert soweit einwandfrei. Das lustige ist aber, dass jetzt die Coordinates beim Auslesen nicht mehr mit den Coordinates im Array übereinstimmen:


```
for (int i = 0; i < triangleArrayLength; i++) {
				triangleArray.getCoordinate(i, coordinatesArray);
                                System.out.println("COORDINATE " + i + " IS: " + coordinatesArray[i]);
			}
```

Ausgabe:


```
COORDINATE 0 IS: 59.16001510620117
COORDINATE 1 IS: 71.57959747314453
COORDINATE 2 IS: 487.2047119140625 (**)
COORDINATE 3 IS: 0.0
COORDINATE 4 IS: 0.0
COORDINATE 5 IS: 0.0
COORDINATE 6 IS: 0.0
COORDINATE 7 IS: 0.0
COORDINATE 8 IS: 0.0
COORDINATE 9 IS: 0.0
COORDINATE 10 IS: 0.0
COORDINATE 11 IS: 0.0
```

und 


```
for(int j = 0; j < coordinatesArray.length; j++){
				double coordinateDouble = coordinatesArray[j];		
				String coordinateString = Double.toString(coordinateDouble);
				System.out.println("string " + coordinateString);
			}
```

Ausgabe:


```
64.96063232421875 
64.96063232421875 
487.2047119140625 (**)
0.0 
0.0 
0.0 
0.0 
0.0 
0.0 
0.0 
0.0 
0.0
```

Noch verwunderlicher ist allerdings dass die Coordinate (**) passt :bahnhof:

Edit: ich werde es direkt in der 1. for-Schleife zum String appenden. Aber komisch ist das schon...


----------

