Rechteck um 90 Grad drehen

Status
Nicht offen für weitere Antworten.

ugh_bough

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

DonJure

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

Mitglied
du könntest die breite und höhe vertauschen

aus
Code:
drawRect(100, 100, 40, 60);
würde
Code:
drawRect(100,100,60,40)

und evtl musst du noch die position anpassen.
 

ugh_bough

Mitglied
Nehme an: Die z-Achse verläuft senkrecht in den Bildschirm hinein.
Dann gilt folgendes:
Code:
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.
 

ugh_bough

Mitglied
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

Bekanntes Mitglied
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 :)
 

thE_29

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

0xdeadbeef

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

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

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

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

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

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

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

Bekanntes Mitglied
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
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben