# Rechteck um 90 Grad drehen



## DonJure (20. Okt 2004)

wie kann man ein Rechteck um 90° gedreht zeichnen? (keine Animation)


----------



## ugh_bough (20. Okt 2004)

dein rechteck hat bestimmt die vier eckpunkte gespeichert.
speicher sie um, oder arbeite sie in einer anderen reihenfolge ab.


----------



## DonJure (20. Okt 2004)

aso sry - ich will mit der paint() methode arbeiten

nehmen wir an - ich will ein quadrat zeichnen mit g.drawRect(100,100,40,40);

wie kann man dieses Quadrat um 90°  drehen?


----------



## ugh_bough (20. Okt 2004)

du könntest die breite und höhe vertauschen

aus

```
drawRect(100, 100, 40, 60);
```
würde
	
	
	
	





```
drawRect(100,100,60,40)
```

und evtl musst du noch die position anpassen.


----------



## DonJure (20. Okt 2004)

wieder mein Fehler.

ich meinte um 45° so dass es wie ein karo aussieht.


----------



## ugh_bough (20. Okt 2004)

Nehme an: Die z-Achse verläuft senkrecht in den Bildschirm hinein.
Dann gilt folgendes: 

```
new_x = x * cos(z_winkel) - y * sin(z_winkel);
new_y = y * cos(z_winkel) - x * sin(z_winkel);
```
Das musst Du für jeden Punkt deines Rechtecks machen. Dabei ist zu beachten, daß der Drehpunkt in der Mitte Deines zu drehenden Objekts liegt.
Also wäre ein 60 breites und 40 hohen Rechteck durch die Punkte (-35, -20), (35, -20), (-35, 20) und (35, 20) zu repräsentieren. Dann jeden Punkt behandeln und schließlich an die Gewünschte Bildschirmposition schieben, indem du zu jedem x-Wert eine Verschiebung um einen x-Offset und zu jedem y-Wert eine Verschiebung um einen y-Offset addierst.

Dann kannst Du aber nicht mehr mit drawRect(..) zeichnen, sondern musst alle vier Eckpunkte mir drawLine(..) verbinden.


----------



## Kerberus (20. Okt 2004)

Ähm wieso kompliziert, wenn es auch einfach geht:
http://www.java-forum.org/de/viewtopic.php?t=7387

AffineTransform -> rotate(theta)


----------



## ugh_bough (20. Okt 2004)

trotzdem muss er alle ecken gesondert speichern und drawline benutzen.  :bae: 
ausserdem konnte er so noch was lernen :meld: 

sorry, der kommentar musste einfach sein.
ich geb aber auch ganz erhlich zu, dass deine methode einfacher ist :applaus:  :applaus:  :applaus:


----------



## Kerberus (20. Okt 2004)

Nein die Ecken muss er nicht speichern. AffineTransform dreht das KoordinatenSystem, d.h., wenn er danach das Rechteck zeichnet erscheint es gedreht, weil das KOSY gedreht ist. Man muss einfach nach dem Zeichen wieder zurückdrehen, sonst können unschöne Sachen passieren


----------



## ugh_bough (20. Okt 2004)

uiuiui
hmm
ok
ich sag nix mehr *verbeug*


----------



## thE_29 (21. Okt 2004)

naja, ich würd es auch mit der Hand drehen, weil das mit dem Affinate bei mir selten funktioniert (zumindest mit Buttons und Bilder funtioniert es nicht...)


----------



## DonJure (28. Okt 2004)

Aber wie kann ich denn ein Image per "Hand" drehen?


----------



## 0xdeadbeef (28. Okt 2004)

In Graphics2D gibt's eine Methode
   drawImage(Image img, AffineTransform xform, ImageObserver obs) 

Über AffineTranform kann man z.B. auch eine Rotation vorgeben.

Oder meinst Du mit "von Hand" auf Pixelebene? Das geht natürlich auch, wird aber kaum performanter sein als die Version von Graphics2D.


----------



## DonJure (28. Okt 2004)

Der Kollege vor mir - meinte Bilder kann man nicht über AffineTranform (es klappt selten, schreibt er) drehen.
Jetzt wollte ich wissen wie man dann per "Hand" ein Bild dreht??


----------



## 0xdeadbeef (28. Okt 2004)

Jetzt mal in der puren Theorie: man berechnet per sin/cos die Koordinaten der Eckpunkte des rotierten Bildes im zu zeichnenden Grafikkontext. Dann benutzt man einen modifizierten Bresenham-Algorithmus o.ä., um jeden Bildpunkt innerhalb des Grafikkontexts abzutasten, der innerhalb des rotierten Rechtecks liegt. Für jeden Punkt man man dann (u.U. per Interpolation) die Farbe des zugehörigen Punktes aus dem ursprünglichen Bild auslesen und in den Grafikkontext eimkopieren.
Auf die gleiche Art kann man das Bild auch skaliert in den Grafikkontext kopieren.

Aber wie gesagt: genau das sollte die genannte Funktionalität aus Graphics2D auch machen.

Wenn ich Der Diskussion oben folgen konnte, gint es darum, das gesamte Koordinatensystem zu drehen, wodurch Operationen im Grafikkontext gedreht erscheinen. ob das auch mit Images geht, vermag ich nicht zu sagen.
Die DrawImage-Methode mit affiner Transformation jedoch muß funktionieren. Man kann sie ja auch in den entsprechenden Demos sehen.


----------



## Stefan1200 (28. Okt 2004)

Bei einem Graphics2D Objekt, wenn ein Bild an Position 20,20 soll, kannst du auch machen:


```
g2d.rotate(Math.toRadians(45),20,20);
g2d.drawImage(...., 20, 20);
g2d.rotate(Math.toRadians(-45),20,20);
```

Dürfte aber was ähnliches passieren, als mit AffineTransform.


----------



## DonJure (28. Okt 2004)

Habe ich ein schönes Tut für AffineTransform hier

Habe gerade mal getestet. Er dreh quasi die ganze Leinwand - dass ist nicht genau dass was ich suche.
Ein weiteres problem sehe ich gerade - soll das Bild ab dem Mttelpunkt rotieren. hmm quasi später dem Mauszeiger verfolgen


----------



## 0xdeadbeef (28. Okt 2004)

Die affine Transormation ist lediglich die mathematische Operation. Wie gesagt, kann man sie aber auch einem drawImage übergeben: dann wird nur das Bild gedreht eingefügt.


----------



## DonJure (28. Okt 2004)

Ok soweit habe ich es jetzt - nur das Problem: wie sage ich ihm dass er nicht an der oberen ecke des bildes rotieren soll, sondern vom bild mittelpunkt


----------



## DonJure (28. Okt 2004)

k, habe einfach die koordinaten geändert....dann gings muhhaaa


----------

