# QuadArray color setzen



## Arnold (29. Aug 2007)

Hallo,

ich möchte einige QuadArrays in Java3D zeichnen und diese farblich ausfüllen. 

Abschnitt, in dem die Farbe gesetzt werden soll:


```
...
Color3f red = new Color3f(1.0f, 0.0f, 0.0f);

		n=0;
		int quads = (nx-1)*(ny-1);
		QuadArray qa = new QuadArray(quads * 4, QuadArray.COORDINATES);
		for (int i=0; i<quads; i++) {
			int cornerIdx = i + (i/(nx-1));
			qa.setCoordinate(n++, points[cornerIdx]);
			qa.setColor(n++, red);
			qa.setCoordinate(n++, points[cornerIdx+1]);
			qa.setCoordinate(n++, points[cornerIdx+nx+1]);
			qa.setCoordinate(n++, points[cornerIdx+nx]);
		}
		
		Shape3D shp = new Shape3D(qa);
		shp.setAppearance(appear);
		group.addChild(shp);
...
```

In den "points" sind die Point3d gespeichert. So wie es zurzeit ist, bekomme ich beim Ausführen die Fehlermeldung:

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: GeometryArray: has no colors


Wie muss ich die Farbe nun korrekt anlegen? Kann ich eigentlich für jeden Vertex eine Farbe vorgeben, sodass zwischen den Vertex dann ein Farbverlauf entsteht, oder muss ich dem QuadArray einen festen Farbwert geben?


Gruß Arnold


----------



## Arnold (29. Aug 2007)

... hat sich schon erledigt.

-> kann geschlossen werden!


----------



## merlin2 (29. Aug 2007)

Verrätst du uns die Lösung?


----------



## Arnold (29. Aug 2007)

oh ja, tschuldigung. Dachte das war eher eine "blöde" Frage (kenne mich leider noch nicht so sehr mit Java3D aus).

Also: einfach eine Zeile wie folgt ändern:


```
QuadArray qa = new QuadArray(quads * 4, QuadArray.COORDINATES | QuadArray.COLOR_3);
```

Das wars dann auch schon. Dann noch die Farbe für jeden einzelnen Punkt setzen, und es gibt, bei unterschiedlichen Farben, automatisch einen Farbverlauf.

Sieht bei mir dann wie folgt aus:


```
n=0;
		int quads = (nx-1)*(ny-1);
		QuadArray qa = new QuadArray(quads * 4, QuadArray.COORDINATES | QuadArray.COLOR_3);
		for (int i=0; i<quads; i++) {
			int cornerIdx = i + (i/(nx-1));
			
			double color1 = points[cornerIdx].z/distance;
			qa.setCoordinate(n++, points[cornerIdx]);
			qa.setColor(n-1, new Color3f((float)color1, (float)color1, 1.0f));
			
			double color2 = points[cornerIdx+1].z/distance;
			qa.setCoordinate(n++, points[cornerIdx+1]);
			qa.setColor(n-1, new Color3f((float)color2, (float)color2, 1.0f));
			
			double color3 = points[cornerIdx+nx+1].z/distance;
			qa.setCoordinate(n++, points[cornerIdx+nx+1]);
			qa.setColor(n-1, new Color3f((float)color3, (float)color3, 1.0f));
			
			double color4 = points[cornerIdx+nx].z/distance;
			qa.setCoordinate(n++, points[cornerIdx+nx]);
			qa.setColor(n-1, new Color3f((float)color4, (float)color4, 1.0f));
		}
		
		Shape3D shp = new Shape3D(qa);
		shp.setAppearance(appear);
		group.addChild(shp);
```


----------



## Arnold (29. Aug 2007)

Eine Frage hab ich allerdings noch: durch "PolygonAttributes.POLYGON_FILL" oder "PolygonAttributes.POLYGON_LINE" kann ich ja entweder Linien oder das gesamte Polygon farbig zeichnen.

Geht denn auch beides? Bisher hab ich quasi zwei QuadArrays übereinander gelegt, eines mit Füllung, eines mit Linien, aber da werden die Linien etwas seltsam gestrichelt dargestellt...


----------



## merlin2 (29. Aug 2007)

Ich glaube nicht - teste mal POLYGON_FILL&&POLYGON_LINE. 
Ich verstehe den Sinn aber ehrlich gesagt nicht.


----------



## Arnold (29. Aug 2007)

Nein, das geht leider nicht. Es kann nur ein Argument übergeben werden.

Sinn des ganzen: dargestellt wird ein digitales Geländemodell (die Oberfläche wird mit einer BSpline-Fläche approximiert), da ist es ganz nett, zusätzlich zur (farblichen) Höheninformation die Gitterweite darzustellen.


----------



## merlin2 (29. Aug 2007)

Vielleicht mit einer Textur?


----------



## Arnold (29. Aug 2007)

Mit Texturen kenn ich mich leider gar nicht aus.
Aber heißt das nicht einfach nur, dass ich dem QuadArray, also dem Polygon, anstatt des Farbverlaufes eine andere Oberfläche gebe? Dann müsste ich ja zig verschiedene anlegen, da eigentlich kein Farbverlauf im QuadArray dem anderen gleicht. Oder sehe ich das falsch?

Kann ich denn die Linienstärke des Polygons verändern?


----------



## merlin2 (29. Aug 2007)

Die Linienstärke kannst du nicht verändern, aber evtl. ein zweites Polygon anlegen, das zwar POLYGON_FILL verwendet, aber explizit ein dickeres Raster hat.


----------



## Arnold (29. Aug 2007)

Du meinst, für jeden "Strich" ein Polygon anlegen, das quasi einen dicken Strich darstellt?

Hmm... ich glauch, das wär mir dann doch zu aufwändig. Sollte als "Gimmick" gedacht sein, ist also nicht so schlimm, wenn es nicht ganz klappt. Geht eher um den theoretischen Hintergund, als die perfekte Darstellung. Und die Linien werden ja dargestellt, nur eben etwas dünn und gestrichelt.

Falls ich doch noch etwas Zeit habe (ist alles für eine Hausarbeit), dann probier ich noch ein wenig rum. Kenne mich doch ... sage natürlich Bescheid, falls ich ne andere Lösung finde.

Trotzdem schon mal vielen Dank fürs Grübeln!


----------

