# Transformationen in Java2D



## Tolotos (21. Feb 2009)

Hallo,
kann man mit Java2D auch nur einzelene Objekte transformieren oder geht das nur mit dem
gesamten "device"?


```
public void paint (Graphics g)
	{
		Graphics2D g2 = (Graphics2D) g;
		
                g.setColor (Color.yellow);
		CubicCurve2D.Double c = new CubicCurve2D.Double();
		Ellipse2D.Double e = new Ellipse2D.Double();
		c.setCurve(100.0, 100.0, 150.0, 50.0, 200.0, 75.0, 300.0, 100.0);
		e.setFrame(50.0,50.0,30.0,20.0);
		g2.fill(e);
		g2.fill(c);
	        g2.rotate(0.4,10,200);
		g2.translate(185.0, 185.0);
        }
```

Wenn ich z.b. nur den Spline rotieren lassen will, wie mache ich das?

Gruß Tolotos


----------



## Developer_X (21. Feb 2009)

mach einfach mehrere Graphics g2d


----------



## Spacerat (21. Feb 2009)

Also in OpenGL macht man das mit "pushMatrix()", "loadMatrix()" und "popMatrix()". Das bedeutet: alte Transformation speichern (stapeln), Objekt-Transformation laden, Objekt transformieren und alte Transformation laden. Für Graphics2D wäre das Komplement dazu AffineTransform bzw. die Methoden "getTransform()" "und setTransform()" würd' ich sagen. Hab' damit aber noch nicht damit gearbeitet. Versuch:
	
	
	
	





```
public void paint (Graphics g)
{
  Graphics2D g2 = (Graphics2D) g;

  g.setColor (Color.yellow);
  CubicCurve2D.Double c = new CubicCurve2D.Double();
  Ellipse2D.Double e = new Ellipse2D.Double();
  c.setCurve(100.0, 100.0, 150.0, 50.0, 200.0, 75.0, 300.0, 100.0);
  AffineTransform save = g2.getTransform();
  g2.rotate(0.4,10,200);
  g2.setTransform(save);
  e.setFrame(50.0,50.0,30.0,20.0);
  g2.fill(e);
  g2.fill(c);
  g2.translate(185.0, 185.0);
}
```

@Edit: Und Neee... mach nicht mehrere Graphics2D!!!
@Edit2: Ok... Hab's mal getestet. So einfach isses dann wohl doch nicht. Für Graphics2D gibt es aber auch wunderbare Beispiele im JDK im Verzeichnis Demos.


----------



## dvid85 (21. Feb 2009)

was für ojekte willst du denn transformieren?
z.b. mit Images geht das ganz leicht.
weiß jetzt grad nicht wie man ne betimmte transf. direkt construiert, aber so gehts:

[HIGHLIGHT="Java"]
AffineTransform trafo = g2.getTransform();
AffineTransform rotation = g2.getTransform();
rotation.setToRotation(...);
trafo.setToTranslation(...);
trafo.concatenate(rotation);  // verknuepfen, hintereinaander schalten
g2.drawImage(img, trafo, null);
[/HIGHLIGHT]

vielleicht geht das auch mit anderen objekten, ansonsten kann man glaub ich Images erstellen.
hoffe das hilft dir irgendwie


----------



## Marco13 (21. Feb 2009)

Spacerat hat gesagt.:


> Also in OpenGL macht man das mit "pushMatrix()", "loadMatrix()" und "popMatrix()". Das bedeutet: alte Transformation speichern (stapeln), Objekt-Transformation laden, Objekt transformieren und alte Transformation laden. Für Graphics2D wäre das Komplement dazu AffineTransform bzw. die Methoden "getTransform()" "und setTransform()" würd' ich sagen. ...



Die Analogie war eigentlich ganz passend, und die Vorgehensweise in der Textuellen Beschreibung auch richtig... aber .. im Code waren dann die Zeilen
g2.rotate(0.4,10,200);
g2.setTransform(save);
direkt Hintereinander, was natürlich nichts bringt...

Richtig wäre sowas wie 

```
AffineTransform save = g2.getTransform();
g2.rotate(0.4,10,200);
g2.fillRect(someRectangleThatWillBeDrawnRotated);
g2.setTransform(save);
g2.translate(185.0, 185.0);
g2.fillRect(someRectangleThatWillBeDrawnTranslated);
g2.setTransform(save);
```

Ist auch genau so hier beschrieben: http://java.sun.com/j2se/1.5.0/docs...ml#setTransform(java.awt.geom.AffineTransform)


----------



## Wildcard (22. Feb 2009)

Würde mir überlegen (sofern deine eigenen Objekte alle ein Graphics Objekt gefüttert bekommen) ein eigenes Wrapper Graphics2D zu bauen das du über das 'echte' stülpst. Dein eigenes Objekt verfügt über einen Zustandsstack auf dem du zunächst push aufrufst um den aktuellen Zustand auf den Stack zu legen, dann übergibst du das Objekt dem Kind das gezeichnet werden soll und wenn es fertig ist rufst du pop auf um alle Veränderungen des Kindes wieder rückgängig zu machen.


----------



## Marco13 (22. Feb 2009)

Hm - wozu braucht man da ein eigenes Graphics?

AffineTransform save = g2.getTransform();
child.doWhaterverYouWantWith(g2);
g2.setTransform(save);


----------

