Transformationen in Java2D

Status
Nicht offen für weitere Antworten.

Tolotos

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

Code:
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
 
S

Spacerat

Gast
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:
Code:
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.
 
Zuletzt bearbeitet von einem Moderator:

dvid85

Aktives Mitglied
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

Top Contributor
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
Code:
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

Top Contributor
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

Top Contributor
Hm - wozu braucht man da ein eigenes Graphics?

AffineTransform save = g2.getTransform();
child.doWhaterverYouWantWith(g2);
g2.setTransform(save);
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
U Umgekehrte Reihenfolge der Transformationen bei GLES1 und GLES2 Spiele- und Multimedia-Programmierung 2
lumo Java2D oder doch OpenglES Spiele- und Multimedia-Programmierung 4
windl CoverFlow in Java2D erstellt Spiele- und Multimedia-Programmierung 24
Kr0e Java2D - Was ist die bewährte Rendermethode ? Spiele- und Multimedia-Programmierung 2
E Wie rendert Java2D/AWT BufferedImages Spiele- und Multimedia-Programmierung 9
M Realisierung einer Sichtweise in Java2D Spiele- und Multimedia-Programmierung 3
S Java2D: AffineTransformation - KOS Spiegeln Spiele- und Multimedia-Programmierung 5
B Texte in Java2d Spiele- und Multimedia-Programmierung 4
K Hardwarebeschleunigung für Java2D Spiele- und Multimedia-Programmierung 9
R Java2D-Komponenten Spiele- und Multimedia-Programmierung 6
A Java2D Spiel "JSlotter" Spiele- und Multimedia-Programmierung 3
B Java2D: Gradientpaint Spiele- und Multimedia-Programmierung 2
H mit Java2D Markierung über JTable zeichnen und diese bewegen Spiele- und Multimedia-Programmierung 2
M Java2D: GradientPaint mit mehreren Farben Spiele- und Multimedia-Programmierung 4
T Java2D Spiel, beim Hinzufügen eines Bildes ruckelt das ganze Spiele- und Multimedia-Programmierung 3
G SNES Mode7 mit Java2D? Spiele- und Multimedia-Programmierung 2
C Java2D Darstellungsfehler Spiele- und Multimedia-Programmierung 2
C OpenGl Support für Applet (sun.java2d.opengl=True) Spiele- und Multimedia-Programmierung 3
S [Java2D] Performance Frage Spiele- und Multimedia-Programmierung 4
V Java2D dynamische Kurven Spiele- und Multimedia-Programmierung 3
G Punkte des Kreises ausgeben (Java2D) Spiele- und Multimedia-Programmierung 4
K Java2d Bild als JPG oder so speichern Spiele- und Multimedia-Programmierung 10

Ähnliche Java Themen


Oben